首页 / Docker 入门教程 / 进入容器、执行命令与文件拷贝

Docker 入门教程

进入容器、执行命令与文件拷贝

本教程共 25 篇 · 第 10 篇 · 更新于 2026-07-26 · 约 7 分钟阅读

DockerDocker 入门教程docker execdocker attachdocker cp进入容器

10. 进入容器、执行命令与文件拷贝

本节目标:分清 execattach 两种进入容器方式的区别,学会在容器里跑单条命令,掌握 docker cp 在宿主机和容器之间互拷文件。学完你能和容器内部自由交互。

为什么要进容器

容器在后台跑着,有时候你得钻进去看看:确认配置文件对不对、查个进程、装个临时调试工具、或者把容器里的日志拷出来。这就需要「进入容器」或「往容器里执行命令」。

Docker 提供了两种方式进容器:execattach。它俩看着像,行为差很多,搞混了容易把容器搞停。

推荐方式: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

看起来也能进到容器,但有个大坑:你退出(exitCtrl+C)的时候,会把主进程一起干掉,容器随之停止

因为 attach 不是新开进程,而是「接管」主进程的终端。你一退出,主进程收到退出信号,容器就挂了。

对比项docker execdocker 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 打造属于自己的镜像。