容器进入与执行
运行中的容器需要进入执行命令进行调试或管理,下面介绍两种方法。
docker exec
在运行中的容器内执行命令(推荐):
Bash
# 进入容器交互式终端
docker exec -it my-nginx /bin/bash
# 输出
root@a1b2c3d4e5f6:/#
# 执行单条命令
docker exec my-nginx ls /usr/share/nginx/html
# 执行多条命令
docker exec my-nginx sh -c "ls / && cat /etc/nginx/nginx.conf"
# 以 root 用户执行
docker exec -u root my-nginx apt-get update
常用参数
Bash
# -i: 保持标准输入打开
# -t: 分配伪终端
# -d: 后台执行
# -u: 指定用户
# -w: 指定工作目录
# -e: 设置环境变量
docker exec -it -u root -w /tmp -e MY_VAR=hello my-nginx /bin/bash
docker exec创建新进程,退出后容器继续运行,不影响主进程。
docker attach
连接到容器主进程的终端:
Bash
# 连接到容器
docker attach my-nginx
# 特点:
# - 连接到容器的主进程(PID 1)
# - 看到主进程的标准输出和输入
# - Ctrl+C 会停止容器
docker attach连接到主进程,Ctrl+C 会终止容器主进程,不推荐用于调试。
exec 与 attach 对比
| 对比项 | docker exec | docker attach |
|---|---|---|
| 进程 | 创建新进程 | 连接主进程 |
| 退出影响 | 不影响容器 | 可能停止容器 |
| 用途 | 调试、执行命令 | 查看主进程输出 |
| 安全性 | 高 | 低 |
| 推荐度 | ✅ 推荐 | ⚠️ 谨慎 |
实用场景
数据库容器
Bash
# 进入 MySQL 容器
docker exec -it my-mysql mysql -uroot -p
# 执行 SQL
docker exec my-mysql mysql -uroot -p123456 -e "SHOW DATABASES;"
# 备份数据库
docker exec my-mysql mysqldump -uroot -p123456 mydb > backup.sql
Web 容器
Bash
# 查看 Nginx 配置
docker exec my-nginx cat /etc/nginx/nginx.conf
# 重新加载 Nginx 配置
docker exec my-nginx nginx -s reload
# 查看进程
docker exec my-nginx ps aux
拷贝文件
Bash
# 从容器拷贝文件到宿主机
docker cp my-nginx:/etc/nginx/nginx.conf ./nginx.conf
# 从宿主机拷贝文件到容器
docker cp nginx.conf my-nginx:/etc/nginx/nginx.conf
# 拷贝目录
docker cp my-nginx:/var/log/nginx ./nginx-logs
要点总结
docker exec创建新进程执行命令,退出后容器继续运行,推荐使用docker attach连接主进程终端,Ctrl+C 会停止容器,谨慎使用docker exec支持-it、-u、-w、-e等参数灵活控制执行环境docker cp可在容器与宿主机之间拷贝文件- 生产调试优先使用
docker exec,避免影响容器主进程
📝 发现内容有误?点击此处直接编辑