Appearance
Docker 常用命令详解
概述
Docker 是一个开源的容器化平台,提供了丰富的命令行工具来管理容器、镜像、网络和存储卷。本文档详细介绍了 Docker 的常用命令,特别是 docker exec 命令的使用场景和实际示例。
基础命令
镜像管理
docker pull
从 Docker Hub 或其他镜像仓库拉取镜像。
bash
# 拉取最新版本的镜像
docker pull nginx
# 拉取指定版本的镜像
docker pull nginx:1.21
# 从指定仓库拉取镜像
docker pull registry.example.com/nginx:latestdocker images
列出本地所有镜像。
bash
# 显示所有镜像
docker images
# 显示镜像的详细信息
docker images --no-trunc
# 只显示镜像 ID
docker images -qdocker rmi
删除本地镜像。
bash
# 删除指定镜像
docker rmi nginx:latest
# 强制删除镜像(即使有容器在使用)
docker rmi -f nginx:latest
# 删除所有未使用的镜像
docker image prune容器管理
docker run
创建并启动一个新容器。
bash
# 基本运行
docker run nginx
# 后台运行并指定名称
docker run -d --name my-nginx nginx
# 端口映射
docker run -d -p 8080:80 nginx
# 挂载数据卷
docker run -d -v /host/path:/container/path nginx
# 设置环境变量
docker run -d -e ENV_VAR=value nginx
# 交互式运行
docker run -it ubuntu /bin/bashdocker ps
列出容器信息。
bash
# 显示正在运行的容器
docker ps
# 显示所有容器(包括已停止的)
docker ps -a
# 只显示容器 ID
docker ps -q
# 显示最近创建的容器
docker ps -ldocker stop/start/restart
控制容器的运行状态。
bash
# 停止容器
docker stop container_name
# 启动已停止的容器
docker start container_name
# 重启容器
docker restart container_name
# 强制停止容器
docker kill container_namedocker rm
删除容器。
bash
# 删除已停止的容器
docker rm container_name
# 强制删除正在运行的容器
docker rm -f container_name
# 删除所有已停止的容器
docker container pruneDocker Exec 命令详解
基本语法
docker exec 命令用于在正在运行的容器中执行命令。这是 Docker 中最重要的调试和管理命令之一。
bash
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]常用选项
-i, --interactive: 保持 STDIN 打开,即使没有附加终端-t, --tty: 分配一个伪终端-d, --detach: 在后台运行命令-e, --env: 设置环境变量-w, --workdir: 指定工作目录-u, --user: 指定用户名或 UID--privileged: 给予扩展权限
使用场景和示例
场景1:进入容器进行调试
当容器出现问题时,最常见的需求是进入容器内部查看状态、检查日志或修改配置。
bash
# 进入正在运行的容器的 bash 终端
docker exec -it my-nginx /bin/bash
# 如果容器没有 bash,可以使用 sh
docker exec -it my-alpine /bin/sh
# 以 root 用户身份进入容器
docker exec -it -u root my-container /bin/bash实际应用示例:
bash
# 启动一个 nginx 容器
docker run -d --name web-server -p 8080:80 nginx
# 进入容器检查配置文件
docker exec -it web-server /bin/bash
# 在容器内执行
root@container:/# cat /etc/nginx/nginx.conf
root@container:/# ls -la /var/log/nginx/
root@container:/# exit场景2:执行单个命令
有时只需要在容器中执行特定命令,而不需要进入交互式终端。
bash
# 查看容器内的进程
docker exec my-container ps aux
# 查看容器内的文件
docker exec my-container ls -la /app
# 检查容器内的网络配置
docker exec my-container ip addr show
# 查看容器内的环境变量
docker exec my-container env实际应用示例:
bash
# 检查数据库容器的连接状态
docker exec mysql-container mysqladmin -u root -p status
# 查看 Redis 容器的内存使用情况
docker exec redis-container redis-cli info memory
# 检查应用容器的日志文件
docker exec app-container tail -f /var/log/app.log场景3:文件操作和数据管理
在容器中进行文件的创建、修改、备份等操作。
bash
# 在容器中创建文件
docker exec my-container touch /tmp/test.txt
# 在容器中创建目录
docker exec my-container mkdir -p /app/data
# 修改文件权限
docker exec my-container chmod 755 /app/script.sh
# 查看文件内容
docker exec my-container cat /etc/hosts实际应用示例:
bash
# 在 Web 服务器容器中更新配置文件
docker exec web-server cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
docker exec web-server sed -i 's/worker_processes auto/worker_processes 4/' /etc/nginx/nginx.conf
# 重新加载配置
docker exec web-server nginx -s reload场景4:数据库操作
对数据库容器进行管理和维护操作。
bash
# 连接到 MySQL 数据库
docker exec -it mysql-container mysql -u root -p
# 执行 SQL 查询
docker exec mysql-container mysql -u root -p -e "SHOW DATABASES;"
# 备份数据库
docker exec mysql-container mysqldump -u root -p --all-databases > backup.sql
# 连接到 PostgreSQL 数据库
docker exec -it postgres-container psql -U postgres实际应用示例:
bash
# 启动 MySQL 容器
docker run -d --name mysql-db -e MYSQL_ROOT_PASSWORD=secret mysql:8.0
# 等待数据库启动完成
sleep 30
# 创建数据库和用户
docker exec mysql-db mysql -u root -psecret -e "
CREATE DATABASE myapp;
CREATE USER 'appuser'@'%' IDENTIFIED BY 'apppass';
GRANT ALL PRIVILEGES ON myapp.* TO 'appuser'@'%';
FLUSH PRIVILEGES;"
# 验证创建结果
docker exec mysql-db mysql -u root -psecret -e "SHOW DATABASES;"场景5:应用程序管理
管理容器中运行的应用程序,如重启服务、更新配置等。
bash
# 重启应用服务
docker exec my-app systemctl restart myservice
# 查看应用状态
docker exec my-app systemctl status myservice
# 执行应用脚本
docker exec my-app /app/scripts/maintenance.sh
# 查看应用进程
docker exec my-app pgrep -f myapp实际应用示例:
bash
# 在 Node.js 应用容器中执行 npm 命令
docker exec node-app npm install
docker exec node-app npm run build
docker exec node-app npm test
# 在 Python 应用容器中执行管理命令
docker exec django-app python manage.py migrate
docker exec django-app python manage.py collectstatic --noinput
docker exec django-app python manage.py createsuperuser场景6:网络和系统诊断
诊断容器的网络连接和系统状态。
bash
# 测试网络连接
docker exec my-container ping google.com
docker exec my-container curl -I http://example.com
docker exec my-container nslookup example.com
# 查看网络接口
docker exec my-container ip addr show
docker exec my-container netstat -tulpn
# 查看系统资源
docker exec my-container top
docker exec my-container df -h
docker exec my-container free -m实际应用示例:
bash
# 诊断微服务之间的连接问题
docker exec frontend-service curl -v http://backend-service:8080/health
docker exec backend-service curl -v http://database-service:5432
# 检查容器的资源使用情况
docker exec my-app ps aux --sort=-%cpu | head -10
docker exec my-app du -sh /var/log/*场景7:后台任务执行
在容器中执行长时间运行的后台任务。
bash
# 在后台执行命令
docker exec -d my-container /app/scripts/backup.sh
# 在后台启动服务
docker exec -d my-container /usr/sbin/sshd
# 在指定工作目录执行命令
docker exec -w /app my-container python script.py实际应用示例:
bash
# 在后台执行数据备份任务
docker exec -d database-container /scripts/daily-backup.sh
# 启动额外的监控进程
docker exec -d app-container /usr/local/bin/monitor.py最佳实践
1. 安全考虑
bash
# 避免以 root 用户执行命令,使用指定用户
docker exec -u appuser my-container /app/script.sh
# 限制执行权限
docker exec --user 1000:1000 my-container command2. 环境变量管理
bash
# 设置临时环境变量
docker exec -e DEBUG=true my-container /app/debug.sh
# 使用多个环境变量
docker exec -e VAR1=value1 -e VAR2=value2 my-container command3. 错误处理
bash
# 检查命令执行结果
if docker exec my-container test -f /app/ready; then
echo "Application is ready"
else
echo "Application is not ready"
fi
# 获取命令退出码
docker exec my-container command
echo "Exit code: $?"4. 脚本自动化
bash
#!/bin/bash
# 自动化容器管理脚本
CONTAINER_NAME="my-app"
# 检查容器是否运行
if [ "$(docker ps -q -f name=$CONTAINER_NAME)" ]; then
echo "Container is running, executing health check..."
docker exec $CONTAINER_NAME /app/health-check.sh
if [ $? -eq 0 ]; then
echo "Health check passed"
else
echo "Health check failed, restarting container..."
docker restart $CONTAINER_NAME
fi
else
echo "Container is not running"
fi其他重要命令
docker logs
查看容器日志。
bash
# 查看容器日志
docker logs my-container
# 实时跟踪日志
docker logs -f my-container
# 查看最近的日志
docker logs --tail 100 my-container
# 显示时间戳
docker logs -t my-containerdocker cp
在容器和主机之间复制文件。
bash
# 从容器复制文件到主机
docker cp my-container:/app/config.json ./config.json
# 从主机复制文件到容器
docker cp ./new-config.json my-container:/app/config.json
# 复制目录
docker cp my-container:/app/logs ./container-logsdocker inspect
查看容器或镜像的详细信息。
bash
# 查看容器详细信息
docker inspect my-container
# 查看特定字段
docker inspect --format='{{.State.Status}}' my-container
# 查看网络配置
docker inspect --format='{{.NetworkSettings.IPAddress}}' my-containerdocker stats
查看容器资源使用情况。
bash
# 查看所有容器的资源使用情况
docker stats
# 查看特定容器的资源使用情况
docker stats my-container
# 只显示一次统计信息
docker stats --no-stream总结
docker exec 是 Docker 容器管理中最重要的命令之一,它提供了与运行中容器交互的强大能力。通过合理使用 docker exec,我们可以:
- 调试和故障排除:进入容器内部检查问题
- 配置管理:动态修改容器配置
- 数据操作:执行数据备份、迁移等任务
- 应用管理:管理容器内的应用程序和服务
- 监控和诊断:检查系统状态和性能
掌握这些命令和使用场景,将大大提高 Docker 容器的管理效率和问题解决能力。在实际使用中,建议结合具体的应用场景,选择合适的参数和选项,确保操作的安全性和有效性。
