Docker 入门学习笔记 02:基础命令、前后台运行,以及 attach、logs、exec 的区别
文章目录
- [Docker 入门学习笔记 02:基础命令、前后台运行,以及 attach、logs、exec 的区别](#Docker 入门学习笔记 02:基础命令、前后台运行,以及 attach、logs、exec 的区别)
-
- 一、容器最基础的一组命令
- [二、为什么值得先认识 `docker pull`](#二、为什么值得先认识
docker pull) - [三、`docker run` 为什么最重要](#三、
docker run为什么最重要) - [四、自定义名字 `--name` 是做什么的](#四、自定义名字
--name是做什么的) - 五、前台运行和后台运行
-
- [1. 前台运行](#1. 前台运行)
- [2. 后台运行](#2. 后台运行)
- [六、为什么服务类容器通常建议用 `-d`](#六、为什么服务类容器通常建议用
-d) - [七、`docker ps` 看什么](#七、
docker ps看什么) - [八、`docker logs` 是最常用的排查命令之一](#八、
docker logs是最常用的排查命令之一) - [九、`docker exec -it` 到底是在做什么](#九、
docker exec -it到底是在做什么) - [十、`stop` 和 `rm` 的区别](#十、
stop和rm的区别) -
- [1. `docker stop`](#1.
docker stop) - [2. `docker rm`](#2.
docker rm)
- [1. `docker stop`](#1.
- 十一、后台运行后,怎么"回到前台看它"
-
- [1. 想看实时日志](#1. 想看实时日志)
- [2. 想附着到主进程](#2. 想附着到主进程)
- [3. 想进入容器内部操作](#3. 想进入容器内部操作)
- 十二、这一部分最重要的实操结论
-
- [1. 服务型容器优先后台启动](#1. 服务型容器优先后台启动)
- [2. 想知道容器还在不在,先看 `docker ps`](#2. 想知道容器还在不在,先看
docker ps) - [3. 想知道容器为什么异常,先看 `docker logs`](#3. 想知道容器为什么异常,先看
docker logs) - [4. 想进入容器内部排查,再用 `docker exec -it`](#4. 想进入容器内部排查,再用
docker exec -it) - [5. 不要混淆 `stop` 和 `rm`](#5. 不要混淆
stop和rm)
- 十三、这一部分学完后应该掌握什么
- 十四、下一步要学什么
本专栏文章导航
- 第 01 篇:Docker 入门学习笔记 01:它到底解决了什么问题,镜像和容器又是什么
- 第 02 篇:Docker 入门学习笔记 02:基础命令、前后台运行,以及 attach、logs、exec 的区别
- 第 03 篇:Docker 入门学习笔记 03:端口映射到底是什么,为什么容器启动了却访问不到
- 第 04 篇:Docker 入门学习笔记 04:环境变量到底在做什么,为什么很多容器都依赖它
- 第 05 篇:Docker 入门学习笔记 05:卷到底是什么,为什么容器删了数据却还能保留
- 第 06 篇:Docker 入门学习笔记 06:用一个可复现的 Python 项目真正理解 Dockerfile
- 第 07 篇:Docker 入门学习笔记 07:用一个多服务案例真正理解 Docker Compose
这一篇继续记录 Docker 入门阶段的实际学习内容,重点解决三个问题:
- Docker 容器最基础的操作命令有哪些
- 前台运行和后台运行到底是什么关系
attach、logs -f、exec -it到底有什么区别
这是从"理解概念"进入"真正操作容器"的第一步。
一、容器最基础的一组命令
在刚开始学习 Docker 时,不需要一下子记住很多命令,最先要掌握的是下面这 7 个:
bash
docker pull
docker run
docker ps
docker logs
docker exec
docker stop
docker rm
这组命令正好对应了一个容器最常见的生命周期:
docker pull:先把镜像下载到本地docker run:创建并启动容器docker ps:查看容器是否正在运行docker logs:查看容器输出了什么docker exec:进入容器执行命令docker stop:停止容器docker rm:删除容器
如果只用一句话理解,就是:
拉取 -> 启动 -> 查看 -> 观察 -> 进入 -> 停止 -> 清理
二、为什么值得先认识 docker pull
例如:
bash
docker pull nginx
它的作用是:
只把镜像下载到本地,不启动容器。
虽然 docker run nginx 在本地没有镜像时也会自动触发拉取,但把 pull 和 run 分开理解很重要:
pull解决的是"镜像有没有下载到本地"run解决的是"容器有没有被创建并启动"
学习时把这两个动作区分开,后面排查问题会清晰很多。
三、docker run 为什么最重要
docker run 是 Docker 学习中最核心的入口命令。
例如:
bash
docker run nginx
它表面上像是"运行一个镜像",但实际上背后包含了一整组动作:
- 检查本地是否已有镜像
- 如果没有,就先拉取镜像
- 基于镜像创建容器
- 启动容器中的主进程
所以更准确的说法是:
docker run 不是简单地"运行镜像",而是"基于镜像创建并启动容器"。`
四、自定义名字 --name 是做什么的
例如:
bash
docker run -d --name mynginx nginx
这里的 --name mynginx 表示:
给这个容器起一个自定义名字。
为什么这个参数很重要?
因为后面很多命令都可以直接用容器名字,而不用每次都去复制容器 ID。
例如:
bash
docker logs mynginx
docker stop mynginx
docker rm mynginx
docker exec -it mynginx sh
如果不手动指定名字,Docker 会自动生成一个随机名字,例如 kind_villani 这种形式。虽然也能用,但不利于学习和管理。
所以在学习阶段,我非常建议你养成一个习惯:
启动容器时尽量加 --name。
五、前台运行和后台运行
Docker 初学者最容易困惑的地方之一,就是:
为什么有时候执行完命令后终端被占住了,有时候又立刻返回了?
本质原因在于:容器是以前台运行,还是在后台运行。
1. 前台运行
例如:
bash
docker run nginx
这时容器主进程直接占用当前终端,终端会持续显示它的输出。
实际运行时,常见的 Nginx 启动日志类似下面这样:
text
/docker-entrypoint.sh: Configuration complete; ready for start up
2026/04/07 02:42:20 [notice] 1#1: using the "epoll" event method
2026/04/07 02:42:20 [notice] 1#1: nginx/1.29.7
2026/04/07 02:42:20 [notice] 1#1: start worker processes
这说明 Nginx 已经在容器里以前台模式运行了,而当前终端正附着在这个主进程的输出上。
2. 后台运行
例如:
bash
docker run -d --name mynginx nginx
这里多了一个 -d,表示让容器在后台运行。
这时终端不会一直被占住,而是会很快返回一个容器 ID,你可以继续执行别的命令。
这也是服务型容器最常见的启动方式。
六、为什么服务类容器通常建议用 -d
像 nginx、redis、mysql 这类镜像,容器启动后通常会持续运行。
如果直接这样启动:
bash
docker run nginx
虽然也能运行成功,但当前终端会一直被容器主进程占住,不方便继续观察和排查。
所以更推荐这样:
bash
docker run -d --name mynginx nginx
这样做的好处是:
- 容器继续运行
- 当前终端立即返回
- 后面可以自由用别的命令查看、进入、停止这个容器
七、docker ps 看什么
docker ps 用来查看当前正在运行的容器。
执行后通常会看到这些列:
CONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
这些字段可以先这样理解:
CONTAINER ID:容器 IDIMAGE:这个容器来自哪个镜像COMMAND:容器启动时执行的主命令CREATED:容器创建时间STATUS:容器当前状态PORTS:端口映射情况NAMES:容器名字
所以 docker ps 的核心作用不是"列个表",而是回答一个问题:
这个容器现在是不是还活着?
八、docker logs 是最常用的排查命令之一
容器本质上会运行一个主进程,而主进程在运行时会输出很多信息,比如:
- 服务启动信息
- 错误日志
- 配置加载结果
- 请求访问记录
这些内容都可以通过 docker logs 查看。
例如:
bash
docker logs mynginx
这里之所以能直接写 mynginx,是因为前面启动容器时我们已经用了:
bash
docker run -d --name mynginx nginx
所以这里传入的不是镜像名,而是容器名。
对于 Nginx 容器来说,日志里常见的内容类似下面这样:
text
/docker-entrypoint.sh: Configuration complete; ready for start up
2026/04/07 02:42:20 [notice] 1#1: nginx/1.29.7
2026/04/07 02:42:20 [notice] 1#1: start worker processes
这些信息已经足够说明容器确实成功启动了。
以后如果你遇到"容器起不来",第一反应通常就应该是:
先看 logs
九、docker exec -it 到底是在做什么
例如:
bash
docker exec -it mynginx sh
它的含义不是"让容器变成前台",而是:
在一个已经运行中的容器里,再执行一个命令。
这里执行的命令是 sh,所以效果上看起来像是"进入了容器内部的 shell"。
这一步很常用,因为很多时候你需要进去确认:
- 某个文件在不在
- 配置有没有生效
- 目录结构是什么样
- 某个命令能不能执行
这里还要补上一个最容易影响跟练的问题:
进入容器后,怎么退出?
如果你是通过下面这种方式进入容器 shell:
bash
docker exec -it mynginx sh
那么最标准的退出方式是:
bash
exit
或者按:
text
Ctrl + D
这两种方式的含义都是:
结束当前 shell,会回到宿主机终端。
不过这里要注意一件事:
不是所有容器都一定能 exec 进入 shell。
原因有两个:
- 容器必须处于运行状态
- 容器镜像里必须真的存在
sh或bash
有些极简镜像里甚至没有 shell,这时 docker exec -it <name> sh 就会失败。
如果在容器里按了 Ctrl + P 然后 Ctrl + Q,终端里可能会出现:
text
read escape sequence
这句话可以这样理解:
Docker 客户端识别到了 detach 快捷键序列,并且把当前附着会话断开了。
因为这里是在 docker exec -it mynginx sh 打开的交互式 shell 里,所以这个快捷键可以生效,随后会回到宿主机终端。
更适合测试这个快捷键的场景是:
bash
docker run -it --name myubuntu ubuntu bash
在这种"主进程本身就是交互式 shell"的场景里,Ctrl + P 然后 Ctrl + Q 会更稳定,也更容易理解。
从会话中 detach 回到宿主机后,可以执行:
bash
docker ps
看到了类似下面的输出:
text
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e5229595c6e7 ubuntu "bash" 4 minutes ago Up 4 minutes myubuntu
这个结果说明两件事:
- 当前并没有退出容器
- 只是从交互式会话里脱离了出来,而容器仍然在运行
所以这一点可以记成一句很实用的话:
Ctrl + P, Ctrl + Q 更适合在交互式 shell 容器里理解为"脱离会话但不结束容器"。
十、stop 和 rm 的区别
这两个命令也很容易混淆。
1. docker stop
例如:
bash
docker stop mynginx
它的意思是:
停止容器运行
但容器对象本身还在。
2. docker rm
例如:
bash
docker rm mynginx
它的意思是:
删除这个容器对象
但它不会删除镜像。
所以最重要的区别是:
stop:停掉运行rm:删掉容器
停止不等于删除,这个概念一定要分清。
十一、后台运行后,怎么"回到前台看它"
这里要区分三种完全不同的需求。
1. 想看实时日志
用:
bash
docker logs -f mynginx
这更像是在前台持续看输出,但不会真的进入容器内部。
很多时候,这也是最安全、最常用的查看方式。
2. 想附着到主进程
用:
bash
docker attach mynginx
这会把你重新连到容器主进程的输入输出流。
对于 Nginx 这种服务型容器,附着后通常看到的是日志,不是 shell。
这里要额外记住一个实践结论:
docker attach比docker logs -f更"接近主进程"- 在
attach会话里按Ctrl + C,有可能把中断信号直接发给容器主进程 - 这也是为什么在很多服务型容器里,
attach后按Ctrl + C可能会导致容器直接退出 - 如果你只是想安全地看输出,优先使用
docker logs -f - 如果你只是想进容器排查,优先使用
docker exec -it sh
3. 想进入容器内部操作
用:
bash
docker exec -it mynginx sh
这不是附着主进程,而是在容器里重新开一个 shell 命令。
所以三者的区别可以这样记:
docker logs -f:看实时日志docker attach:附着主进程docker exec -it sh:进入容器 shell
如果只是补充了解一下,attach 还有两个你可以先知道但暂时不用深挖的参数:
bash
docker attach --no-stdin mynginx
docker attach --sig-proxy=false mynginx
它们分别用于:
--no-stdin:只看输出,不把终端输入发给容器--sig-proxy=false:不要把本地信号直接转发给容器主进程
十二、这一部分最重要的实操结论
学到这里,我觉得最值得记住的不是某一个命令,而是一套操作习惯:
1. 服务型容器优先后台启动
例如:
bash
docker run -d --name mynginx nginx
2. 想知道容器还在不在,先看 docker ps
3. 想知道容器为什么异常,先看 docker logs
4. 想进入容器内部排查,再用 docker exec -it
5. 不要混淆 stop 和 rm
stop是停止运行rm是删除容器
十三、这一部分学完后应该掌握什么
如果这一部分真正掌握了,你应该能清楚表达这些内容:
docker run是基于镜像创建并启动容器docker pull只负责拉取镜像,不负责启动容器docker run -d表示让容器在后台运行--name可以给容器起一个自定义名字,便于后续操作docker ps查看运行中的容器docker logs用来查看容器输出docker exec -it是进入运行中的容器执行命令- 用
exit或Ctrl + D可以退出容器 shell docker stop停止容器docker rm删除容器docker logs -f、docker attach、docker exec -it三者不是一回事
十四、下一步要学什么
接下来最关键的一块是:
端口映射
因为你很快就会遇到一个典型问题:
容器里的服务明明启动了,为什么宿主机访问不到?
而这个问题,正是 Docker 学习中"真正把服务跑起来"的起点。
本专栏文章导航
- 第 01 篇:Docker 入门学习笔记 01:它到底解决了什么问题,镜像和容器又是什么
- 第 02 篇:Docker 入门学习笔记 02:基础命令、前后台运行,以及 attach、logs、exec 的区别
- 第 03 篇:Docker 入门学习笔记 03:端口映射到底是什么,为什么容器启动了却访问不到
- 第 04 篇:Docker 入门学习笔记 04:环境变量到底在做什么,为什么很多容器都依赖它
- 第 05 篇:Docker 入门学习笔记 05:卷到底是什么,为什么容器删了数据却还能保留
- 第 06 篇:Docker 入门学习笔记 06:用一个可复现的 Python 项目真正理解 Dockerfile
- 第 07 篇:Docker 入门学习笔记 07:用一个多服务案例真正理解 Docker Compose