Docker进入容器内部,exec和attach区别
前言
要进容器里改配置、看日志,用什么命令?docker exec和docker attach有什么区别?本文讲清楚。
一、docker exec(推荐)
作用
在运行中的容器里开一个新进程。
进入容器
docker exec -it 容器名 /bin/bash
或者:
docker exec -it 容器名 sh
参数说明
| 参数 | 说明 |
|---|---|
| -i | 保持交互 |
| -t | 分配终端 |
| -it | 合起来用 |
退出
输入 exit 或者按 Ctrl+D。
关键: 退出后容器还在运行,不受影响。
执行单个命令
不进交互模式,直接执行命令:
docker exec 容器名 ls /var/www/html
docker exec 容器名 cat /etc/nginx/nginx.conf
docker exec 容器名 php -v
二、docker attach
作用
连接到容器正在运行的主进程。
用法
docker attach 容器名
危险!
退出会导致容器停止!
按 Ctrl+C 退出后,容器就停了。
怎么安全退出
按 Ctrl+P 然后 Ctrl+Q,这样退出不会停容器。
三、exec和attach区别
| 对比 | exec | attach |
|---|---|---|
| 原理 | 开新进程 | 连接主进程 |
| 退出后容器 | 继续运行 | 会停止 |
| 常用场景 | 进容器操作 | 看主进程输出 |
| 推荐度 | 推荐 | 不推荐 |
记住: 日常用exec,别用attach。
四、常见场景
场景1:进容器改配置
docker exec -it mynginx /bin/bash
场景2:在容器里执行PHP命令
docker exec myphp php artisan migrate
场景3:看容器里的日志文件
docker exec mynginx tail -f /var/log/nginx/access.log
场景4:容器里没bash
有些精简镜像没有bash,用sh:
docker exec -it 容器名 sh
场景5:以root用户进入
docker exec -u root -it 容器名 /bin/bash
五、如果容器没bash怎么办
用nsenter
# 先拿容器PID
PID=$(docker inspect --format "{{.State.Pid}}" 容器名)
# 进入
nsenter --target $PID --mount --uts --ipc --net --pid
或者用docker run
用同一个镜像开个交互式容器:
docker run -it --rm 镜像名 /bin/bash
六、常用命令汇总
| 命令 | 说明 |
|---|---|
| docker exec -it 容器名 /bin/bash | 进容器 |
| docker exec 容器名 命令 | 执行命令 |
| docker exec -u root -it 容器名 /bin/bash | 以root进 |
| docker attach 容器名 | 连接主进程(慎用) |
常见坑
坑1:attach退出后容器停了
用attach进去,按Ctrl+C退出,容器就停了。
解决: 用exec,或者Ctrl+P Ctrl+Q退出。
坑2:进容器报/ bin/bash not found
镜像里没有bash。
解决: 用sh:
docker exec -it 容器名 sh
坑3:进容器报permission denied
不是root用户,权限不够。
解决: 加 -u root:
docker exec -u root -it 容器名 /bin/bash
坑4:exec进不去,说容器没运行
容器停了,exec进不去。
解决: 先启动容器:
docker start 容器名
docker exec -it 容器名 /bin/bash
坑5:多个终端连同一个容器
exec可以开多个终端,互不影响。
这是exec比attach好的地方,attach只能连一个。
总结
记住两点:
- 日常用
docker exec -it 容器名 /bin/bash - 别用attach,退出会把容器搞停
补充: 精简镜像没有bash,用sh代替。
遇到问题加QQ23979811 协助处理