← 全部笔记

Docker · 3 容器运行与管理

按需求组合 docker run 参数

先决定终端怎么连接、退出后留不留,再配置名称、环境变量和访问入口。六组参数分别控制这些选择。

约 15 分钟 · 截至 2026-11-03,Docker Engine 29.x · 本页 Docker 实验未实测

参数作用在容器的不同边界上 -d 和 -it 控制终端连接;--name 标识容器;-e 向程序传入环境变量;-p 发布访问入口;--rm 在程序退出后删除容器。 你的终端 --name web 容器中的程序 -d / -it -e KEY=value -p 主机端口:容器端口 退出后 --rm → 删除容器
图 1 终端、配置、网络入口与退出清理,是可以分别选择的维度。[1]

先看位置

参数放在镜像前

docker run 每次创建一个新容器。Docker 的选项放在镜像前;镜像后的命令与参数交给容器中的程序。[2]

docker run创建并启动 [OPTIONS]本页的六组参数 IMAGE镜像名及可选标签 [COMMAND] [ARG...]容器中的命令与参数

例如 docker run --rm -it ubuntu:24.04 sh:Docker 处理 --rm -it,再用镜像创建容器,启动其中的命令解释器 sh。省略命令时沿用镜像的默认设置。

需要复习请求链路,可以回看第一次 docker run;镜像与容器的区别见三个核心对象。

参数改变什么省略时
-d / --detach后台运行,返回容器 ID前台连接,等待程序结束
-i / --interactive保持标准输入打开不保持标准输入打开
-t / --tty分配伪终端不分配伪终端
--rm退出后自动删除容器保留已停止的容器
--name 名称指定容器名Docker 自动生成名字
-e KEY=value / --env设置容器环境变量沿用镜像与 Docker 的默认环境
-p 主机端口:容器端口 / --publish向宿主机发布端口不添加该端口发布规则

把命令改成 docker run ubuntu:24.04 sh -it,Docker 会处理 -it 吗?写下你判断位置的依据。

不会。镜像后面的 sh -it 是容器中的命令及其参数。即使 sh 自己也接受某些同名选项,也不代表 Docker 保持了输入或分配了伪终端。

终端连接

后台与交互分开选

-d 让启动命令返回终端;程序是否继续运行取决于程序本身。不加它时,Docker 默认连接程序的标准输出和标准错误,也就是正常输出和错误信息。[2]

-it 是 -i -t 的合写。标准输入(STDIN)是程序接收输入的数据流,-i 保持它打开。伪终端(pseudo-TTY)模拟终端设备,提供回显、行编辑等终端行为;-t 分配它。两者常用于交互式 shell,也就是能逐行输入命令的会话。[3]

后台返回终端,交互会话保留输入通路 -d 启动后向终端返回 ID。-i 保持到程序的标准输入打开,-t 提供伪终端,程序输出可返回你的终端。 -d 你的终端 程序运行 返回 ID -it 你的终端 伪终端-t sh -i 输入 送入 返回输出
图 2 -d 改变等待方式;-i 与 -t 共同提供交互终端。

docker run -d ubuntu:24.04 true 中,true 立即成功退出。容器会因为加了 -d 而一直运行吗?

不会。主进程 true 退出后容器停止。-d 没有添加让程序持续运行或自动重启的逻辑。这里未加 --rm,所以停止的容器会保留。

自己跑:输入流与终端

在宿主机的 Linux shell 中运行。需要可用的 Docker Engine 和运行容器的权限,Desktop 请切到 Linux 容器。镜像不存在时会先下载。

echo hello | docker run --rm -i busybox cat
hello

未实测;命令与输出逐字引用 Docker 官方示例。首次拉取信息未列出。

cat 读取标准输入并写回标准输出。这里是管道输入,用 -i 即可;不要给这种管道实验附加 -t。

docker run --rm -it ubuntu:24.04 sh

交互实验也未实测。预期进入容器的 shell,可输入 pwd,再输入 exit 退出。提示符随镜像而异;退出后 --rm 会删除这个临时容器。

你想在终端逐行输入命令,退出后自动删除这个新容器。哪条命令匹配需求?

-d 会让命令返回终端,且这里没有保持输入或设置自动删除。

-t 分配伪终端,但你还需要 -i 保持输入打开。

-i 保持输入,-t 提供终端设备,--rm 负责退出后的删除。三个选择分别满足三个条件。

深入一点:能组合 -d 和 -it 吗?

可以写 -dit:容器保留输入与伪终端,但当前命令仍后台返回。是否长期运行还取决于主进程。重新连接已有容器属于后续进入与排查页面的内容。

退出清理

退出才触发删除

--rm 在容器退出时自动删除它。默认只停止并保留容器;--rm 还会移除容器可写层,其中未另行保存的文件会丢失。它不删除镜像。[4]

有无 --rm 的退出路径对比 不加 --rm:运行、退出、保留已停止容器。加 --rm:运行、退出、自动删除容器。两条路径都保留镜像。 不加 --rm加 --rm running · 运行 主进程退出exited · 已停止 保留容器和可写层仍在 running · 运行 主进程退出exited · 已停止 自动删除removed · 已移除两条路径都不删除镜像
  1. 先看默认路径:容器中的主进程正在运行。
  2. 主进程退出,容器进入已停止状态。猜猜:Docker 会默认删除这个容器吗?
  3. 默认保留已停止容器,便于之后检查或重新启动。
  4. 再看一个加了 --rm 的新容器:运行期间仍正常存在。
  5. 主进程退出,触发清理。这里的停止与下一步删除相继发生。猜猜:原镜像也会一起消失吗?
  6. 容器与其可写层被删除,镜像仍可创建新容器。图是事件顺序示意,纵向间距不表示耗时。
图 3 --rm 改变退出后的去向,运行期间不会删除容器。

-d --rm 可以组合:后台服务退出后同样删除。终端命令返回不等于容器退出。短时实验适合自动清理;需要保留失败现场时,先不要加 --rm。

深入一点:卷与重启策略

卷是独立于容器可写层的数据存储。--rm 还会清理关联的匿名卷(没有指定名字的卷),保留命名卷;本页实验不挂载卷。卷在存储模块详讲。

--restart 指定退出后的自动重启策略,不能与 --rm 同用;后面的重启策略页面会展开。[4]

容器配置

命名,再传入配置

--name 给容器一个容易引用的名字;-e KEY=value 把环境变量传给容器中的程序。环境变量是程序启动时能读取的键值配置,是否使用取决于程序。[5] [6]

名称标识容器,环境变量传入程序 --name lp-flags-env 标识新容器;-e VAR1=value1 进入容器的程序环境。镜像的默认配置不被改写。 --name lp-flags-env 容器:lp-flags-env 程序 env 读取VAR1=value1 命名 -e VAR1=value1传入环境变量
图 4 名字用于引用容器;环境变量交给容器里的程序读取。

名字在同一个 Docker Engine 中必须唯一,已停止但未删除的容器也占用名字。名称冲突时,先用 docker ps -a 确认归属,换一个名字,或只删除自己确认不要的已停止容器;不要为实验清空其他容器。

自己跑:变量由谁读取

在宿主机的 Linux shell 中执行。这里的 env 打印容器环境;管道后的 grep 在宿主机筛选相关行。-e 可以重复,也可以写成长选项 --env。

docker run --rm --name lp-flags-env --env VAR1=value1 --env VAR2=value2 ubuntu env | grep VAR
VAR1=value1
VAR2=value2

未实测;两行预期输出摘自官方环境变量示例。本实验为原命令补了 --rm --name lp-flags-env;首次拉取信息未列出,变量顺序无需一致。

成功后容器退出并被删除,名字可再次使用。没有 --rm 时,需先删除旧容器才能复用名字。示例的 ubuntu 使用默认标签,nginx:alpine 等标签内容也可更新;本页不承诺固定镜像内容。[2]

给新容器命名为 lp-flags-env,传入 VAR1=value1。在固定位置补全选项名。

docker run --rm lp-flags-env VAR1=value1 ubuntu env

--name 后面跟容器名;-e 或 --env 后面跟键值。它们都在镜像 ubuntu 之前,不会改写原镜像。

深入一点:宿主机变量与引号

-e VAR1 不带等号时,会读取 Docker 客户端已导出的同名变量;如果没有导出,容器里该变量不设置。本页优先显式写 -e VAR1=value1,避免依赖宿主机环境。

sh -c 'echo "$VAR1"' 用单引号把展开留给容器里的 shell;双引号可能让宿主机先展开。环境变量不会自动改变应用行为;应用必须有读取它的逻辑。[6]

访问入口

左主机,右容器

-p 127.0.0.1:8080:80 把 Docker 宿主机回环地址的 8080 端口,转发到容器的 80 端口。省略协议时使用 TCP。容器中的服务仍需在正确的地址和端口监听。[7]

127.0.0.1:8080 转发到容器 80 本机浏览器请求宿主机回环地址 127.0.0.1 的 8080 端口,经 -p 规则转发到容器中监听 80 端口的 Web 服务。两个端口不要求相等。 Docker 宿主机(本机) 本机浏览器 127.0.0.18080 请求 -p 转发到 80/tcp 容器 Web 服务监听 80 宿主机端口 8080容器端口 80
图 5 左侧选对外入口,右侧匹配程序实际监听的容器端口;两者可以不同。
宿主机网络变更

-p 会占用宿主机端口,并由 Docker 设置转发/防火墙规则。省略宿主地址的 -p 8080:80 默认发布到所有接口,可能被外部访问。本页按默认网络配置显式绑定 127.0.0.1,只从本机访问。[7]

程序监听容器的 TCP 80,只让本机经 9090 访问。只补 -p 后的值。

docker run --rm -d -p nginx:alpine

地址限制在本机回环接口,左侧 9090 是宿主机入口,右侧 80 匹配容器服务。写成 80:9090 会反过来;给 -e PORT=9090 也不能代替发布规则。

深入一点:EXPOSE 与故障边界

Dockerfile 的 EXPOSE 描述预期服务端口,不自动向宿主机发布。反过来,-p 也不会启动服务或改变服务的监听端口。只监听容器内部 127.0.0.1 的服务,通常无法通过这条转发访问。

若使用远程 Docker,左侧地址属于远程宿主机;本页实验假设 Docker 就在本机。Docker Desktop 的转发由其后台实现。自定义网络与具体转发路径留到网络模块。[7]

组合与验证

把需求写成命令

现在运行一个 Web 服务:后台运行,退出自动清理,名为 lp-flags-web,设置 APP_MODE=demo,只让本机经 8080 访问容器的 80。这里用 Nginx(Web 服务器)镜像;APP_MODE 只是演示传参,Nginx 不会据此自动切换模式。

按给定顺序逐项填写。选项名与值分开填;后台服务不需要交互输入。

docker run

lp-flags-web
APP_MODE=demo
nginx:alpine

先安排终端返回与退出清理,再设置标识、环境和入口。选项之间可以换序,但都在镜像前。-d 与 --detach、-e 与 --env、-p 与 --publish 分别等价。

自己跑:启动、访问、清理

下面全部在宿主机执行。会下载缺失镜像,并占用本机 8080。名称和端口应未被占用;如果换端口,命令和访问地址要一起改。实验未实测,以下是依据文档的预期行为,不是终端实录。

docker run -d --rm --name lp-flags-web -e APP_MODE=demo -p 127.0.0.1:8080:80 nginx:alpine
  1. 启动成功后命令返回一个容器 ID。它只表示已启动,不保证服务此刻已就绪;等待片刻。
  2. 在本机浏览器打开 http://127.0.0.1:8080/。预期看到镜像自带的 Nginx 默认页面,不访问容器端口 80 作为主机入口。
  3. 用 docker ps 查看运行容器,核对名称与发布规则。这里不列未实测的 ID、时间或表格输出。

实验结束,停止自己刚创建的容器。docker stop 请求容器停止;加了 --rm,停止后会自动删除,无需再手动删除它。

docker stop lp-flags-web
docker ps -a --filter name=lp-flags-web

预期停止命令完成后,筛选列表中不再有这个实验容器;镜像仍在。确认自动清理完成后,可以再次运行启动命令复用名字。若还要排查退出现场,先去掉 --rm 再做下一次实验。[8]

后台服务启动后终端已返回,浏览器却连不上。哪项检查最合理?

-it 改变输入和终端设备,不配置网络入口。

清理时机是容器退出。-d 返回终端时,程序可能仍在运行。

先核对寿命,再核对路径:进程需要仍在运行并准备好接收请求;浏览器访问左侧主机端口,转发规则指向右侧容器服务端口。-d 不承诺持续运行或服务就绪。

带走四个判断

来源

核对日期:2026-11-03;适用范围:Docker Engine 29.x、默认网络配置下的 Linux 容器。环境没有 Docker,本页全部 Docker 实验未实测;待维护者补实测记录。浏览器交互与版式单独验证。

  1. docker container run:参数、长短选项与创建行为。
  2. Running containers:命令结构、前后台、镜像标签、标识与可写层。
  3. Keep STDIN open 与 Allocate a pseudo-TTY:输入流、终端;实验一输出原文。
  4. Clean up:退出后清理、匿名卷与命名卷;同页 restart 章节说明不兼容组合。
  5. Container identification 与 Name your container:容器名、唯一性和自动命名(仅引用命名规则,不使用该文的旧式链接功能)。
  6. Set environment variables:环境变量覆盖、宿主机变量与实验二输出原文。
  7. Port publishing and mapping 与 Publish or expose port:左右端口、协议、回环地址及默认发布范围。
  8. docker container stop 与 docker container ls:停止、列表与过滤。