进入容器、执行命令与文件拷贝
本教程共 25 篇 · 第 10 篇 · 更新于 2026-07-26 · 约 7 分钟阅读
10. 进入容器、执行命令与文件拷贝
本节目标:分清
exec和attach两种进入容器方式的区别,学会在容器里跑单条命令,掌握docker cp在宿主机和容器之间互拷文件。学完你能和容器内部自由交互。
为什么要进容器
容器在后台跑着,有时候你得钻进去看看:确认配置文件对不对、查个进程、装个临时调试工具、或者把容器里的日志拷出来。这就需要「进入容器」或「往容器里执行命令」。
Docker 提供了两种方式进容器:exec 和 attach。它俩看着像,行为差很多,搞混了容易把容器搞停。
推荐方式:docker exec
exec 在正在运行的容器里新开一个进程,通常用来开一个交互式 shell:
docker exec -it web /bin/bash
-i:保持输入打开。-t:分配伪终端。web:容器名或 ID。/bin/bash:要执行的命令,这里是要个 bash shell。
执行后你就进到了容器里,提示符变成容器内的:
root@a1f7a4bb3a27:/#
这时候敲命令、看文件、查进程都行,和登录一台 Linux 没啥区别。
exec 最大的好处是:你退出这个 shell,容器照常运行。因为它只是开了个额外进程,不影响容器的主进程。
Tip有些精简镜像(比如
alpine系列)没有 bash,只有sh。进去时报bash: not found,换成/bin/sh就行:docker exec -it web /bin/sh。
不推荐的方式:docker attach
attach 是另一种「进入」方式,它直接连到容器的主进程(也就是 PID 1)的标准输入输出上:
docker attach web
看起来也能进到容器,但有个大坑:你退出(exit 或 Ctrl+C)的时候,会把主进程一起干掉,容器随之停止。
因为 attach 不是新开进程,而是「接管」主进程的终端。你一退出,主进程收到退出信号,容器就挂了。
| 对比项 | docker exec | docker attach |
|---|---|---|
| 原理 | 新开一个进程 | 接管主进程的终端 |
| 退出影响 | 容器继续运行 | 容器会停止 |
| 适用场景 | 调试、执行命令 | 查看主进程前台输出 |
| 推荐度 | 日常首选 | 谨慎使用 |
Warning如果一定要用
attach又不想退出时停容器,用Ctrl+P然后Ctrl+Q这组「分离快捷键」退出,而不是exit。但这招容易按错,不如直接用exec省心。
只执行一条命令
exec 不一定要开 shell,也能直接跑单条命令,跑完就退出。适合「只想确认一件事」的场景:
# 看容器里的主机名
docker exec web hostname
# 看容器的 IP
docker exec web ip addr
# 列出某个目录
docker exec web ls /etc/nginx
不带 -it,命令的输出直接打到你的终端,跑完自动断开,不会进入交互模式。批量排查多个容器时这么用很高效。
# 给容器装个工具临时用(容器得是 root 且有包管理器)
docker exec web apt-get update
docker exec web apt-get install -y curl
Note通过
exec装的包,只存在于这个容器的可读写层。容器删了就没了,重新run一个新容器是不会带这些的。要持久化得写进镜像(用 Dockerfile),别指望exec装的东西能传承。
文件拷贝:docker cp
容器和宿主机之间传文件,用 docker cp。它不需要容器共享目录,也不需要挂载卷,直接拷,两个方向都行。
从容器拷到宿主机
格式是 docker cp 容器名:容器内路径 宿主机路径:
docker cp web:/etc/nginx/nginx.conf ./nginx.conf
把容器里 Nginx 的配置文件拷到当前目录。
从宿主机拷到容器
反过来写就行:
docker cp ./app.conf web:/etc/nginx/conf.d/app.conf
把本机的配置文件塞进容器对应位置。
拷整个目录
docker cp 也能拷目录,递归的:
# 把容器的日志目录整个拷出来
docker cp web:/var/log/nginx ./nginx-logs
Tip
docker cp是临时操作的好帮手,但如果你要频繁地在宿主机和容器之间同步文件(比如开发时改代码即时生效),别用cp来回拷,应该用「挂载」(bind mount 或 volume)。挂载是实时的,改了立刻生效,后面数据篇会专门讲。
一个调试小套路
把上面几个命令组合起来,就是一套排查容器问题的标准动作:
# 1. 看容器在不在跑
docker ps
# 2. 看日志有没有报错
docker logs --tail 50 web
# 3. 进容器看现场
docker exec -it web /bin/bash
# 4. 在容器里装个工具确认
apt-get update && apt-get install -y curl
curl localhost:80
# 5. 把有问题的配置文件拷出来改
docker cp web:/etc/nginx/nginx.conf ./
# 改完再拷回去
docker cp ./nginx.conf web:/etc/nginx/nginx.conf
# 6. 重启让配置生效
docker restart web
这套流程走下来,大部分容器问题都能定位个七七八八。
小结
进入容器日常用 docker exec -it,它的退出不影响容器;docker attach 会绑主进程,退出可能导致容器停止,慎用。exec 还能跑单条命令做快速检查。文件传输用 docker cp,两个方向都能拷,但频繁同步还是得靠挂载。
到这里,入门篇和基础操作篇就结束了。你已经能装好 Docker、配好加速、跑容器、管生命周期、看状态日志、操作镜像、进容器调试。下一阶段,我们会进入镜像构建篇,学习怎么用 Dockerfile 打造属于自己的镜像。