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只能连一个。

总结

记住两点:

  1. 日常用 docker exec -it 容器名 /bin/bash
  2. 别用attach,退出会把容器搞停

补充: 精简镜像没有bash,用sh代替。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-8 08:17