Docker 入门学习笔记 02:基础命令、前后台运行,以及 attach、logs、exec 的区别

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` 的区别](#十、stoprm 的区别)
      • [1. `docker stop`](#1. docker stop)
      • [2. `docker rm`](#2. docker rm)
    • 十一、后台运行后,怎么"回到前台看它"
      • [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. 不要混淆 stoprm)
    • 十三、这一部分学完后应该掌握什么
    • 十四、下一步要学什么

本专栏文章导航

这一篇继续记录 Docker 入门阶段的实际学习内容,重点解决三个问题:

  1. Docker 容器最基础的操作命令有哪些
  2. 前台运行和后台运行到底是什么关系
  3. attachlogs -fexec -it 到底有什么区别

这是从"理解概念"进入"真正操作容器"的第一步。

一、容器最基础的一组命令

在刚开始学习 Docker 时,不需要一下子记住很多命令,最先要掌握的是下面这 7 个:

bash 复制代码
docker pull
docker run
docker ps
docker logs
docker exec
docker stop
docker rm

这组命令正好对应了一个容器最常见的生命周期:

  1. docker pull:先把镜像下载到本地
  2. docker run:创建并启动容器
  3. docker ps:查看容器是否正在运行
  4. docker logs:查看容器输出了什么
  5. docker exec:进入容器执行命令
  6. docker stop:停止容器
  7. docker rm:删除容器

如果只用一句话理解,就是:

拉取 -> 启动 -> 查看 -> 观察 -> 进入 -> 停止 -> 清理

二、为什么值得先认识 docker pull

例如:

bash 复制代码
docker pull nginx

它的作用是:

只把镜像下载到本地,不启动容器。

虽然 docker run nginx 在本地没有镜像时也会自动触发拉取,但把 pullrun 分开理解很重要:

  • pull 解决的是"镜像有没有下载到本地"
  • run 解决的是"容器有没有被创建并启动"

学习时把这两个动作区分开,后面排查问题会清晰很多。

三、docker run 为什么最重要

docker run 是 Docker 学习中最核心的入口命令。

例如:

bash 复制代码
docker run nginx

它表面上像是"运行一个镜像",但实际上背后包含了一整组动作:

  1. 检查本地是否已有镜像
  2. 如果没有,就先拉取镜像
  3. 基于镜像创建容器
  4. 启动容器中的主进程

所以更准确的说法是:

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

nginxredismysql 这类镜像,容器启动后通常会持续运行。

如果直接这样启动:

bash 复制代码
docker run nginx

虽然也能运行成功,但当前终端会一直被容器主进程占住,不方便继续观察和排查。

所以更推荐这样:

bash 复制代码
docker run -d --name mynginx nginx

这样做的好处是:

  • 容器继续运行
  • 当前终端立即返回
  • 后面可以自由用别的命令查看、进入、停止这个容器

七、docker ps 看什么

docker ps 用来查看当前正在运行的容器。

执行后通常会看到这些列:

  • CONTAINER ID
  • IMAGE
  • COMMAND
  • CREATED
  • STATUS
  • PORTS
  • NAMES

这些字段可以先这样理解:

  • CONTAINER ID:容器 ID
  • IMAGE:这个容器来自哪个镜像
  • 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。

原因有两个:

  1. 容器必须处于运行状态
  2. 容器镜像里必须真的存在 shbash

有些极简镜像里甚至没有 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 容器里理解为"脱离会话但不结束容器"。

十、stoprm 的区别

这两个命令也很容易混淆。

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 attachdocker 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. 不要混淆 stoprm

  • stop 是停止运行
  • rm 是删除容器

十三、这一部分学完后应该掌握什么

如果这一部分真正掌握了,你应该能清楚表达这些内容:

  • docker run 是基于镜像创建并启动容器
  • docker pull 只负责拉取镜像,不负责启动容器
  • docker run -d 表示让容器在后台运行
  • --name 可以给容器起一个自定义名字,便于后续操作
  • docker ps 查看运行中的容器
  • docker logs 用来查看容器输出
  • docker exec -it 是进入运行中的容器执行命令
  • exitCtrl + D 可以退出容器 shell
  • docker stop 停止容器
  • docker rm 删除容器
  • docker logs -fdocker attachdocker exec -it 三者不是一回事

十四、下一步要学什么

接下来最关键的一块是:

端口映射

因为你很快就会遇到一个典型问题:

容器里的服务明明启动了,为什么宿主机访问不到?

而这个问题,正是 Docker 学习中"真正把服务跑起来"的起点。

本专栏文章导航

相关推荐
世人万千丶2 小时前
开源鸿蒙跨平台Flutter开发:幼儿园成语序列与海马体印迹锚定引擎-突触链式网络渲染架构
学习·flutter·开源·harmonyos·鸿蒙
中国lanwp2 小时前
Docker TLS 证书一键生成脚本(安全加密远程访问)
docker
Dovis(誓平步青云)2 小时前
《QT学习第二篇:QT的常用控件属性与按钮、view系列、Label、输入框》
开发语言·qt·学习
艾莉丝努力练剑2 小时前
【Linux系统:多线程】线程概念与控制
linux·运维·服务器·c++·后端·学习·操作系统
徒 花2 小时前
Python知识学习03
开发语言·python·学习
张3232 小时前
OCI 镜像标准 ↔ Docker 镜像分层原理
docker
世人万千丶2 小时前
开源鸿蒙跨平台深度解析:Flutter Pigeon 跨平台官方示例适配全流程与底层故障溯源
学习·flutter·华为·开源·harmonyos·鸿蒙系统
斯普信云原生组2 小时前
Docker 开源软件应急处理方案及操作手册——日常维护与监控命令集
docker·容器·eureka
世人万千丶2 小时前
解决鸿蒙方向的Flutter框架版切换问题-当前最新版本3.35.8——工具切换与命令切换
学习·flutter·elasticsearch·华为·harmonyos·鸿蒙