先看位置
参数放在镜像前
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 改变等待方式;-i 与 -t 共同提供交互终端。docker run -d ubuntu:24.04 true 中,true 立即成功退出。容器会因为加了 -d 而一直运行吗?
不会。主进程 true 退出后容器停止。-d 没有添加让程序持续运行或自动重启的逻辑。这里未加 --rm,所以停止的容器会保留。
自己跑:输入流与终端
在宿主机的 Linux shell 中运行。需要可用的 Docker Engine 和运行容器的权限,Desktop 请切到 Linux 容器。镜像不存在时会先下载。
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]
- 先看默认路径:容器中的主进程正在运行。
- 主进程退出,容器进入已停止状态。猜猜:Docker 会默认删除这个容器吗?
- 默认保留已停止容器,便于之后检查或重新启动。
- 再看一个加了
--rm的新容器:运行期间仍正常存在。 - 主进程退出,触发清理。这里的停止与下一步删除相继发生。猜猜:原镜像也会一起消失吗?
- 容器与其可写层被删除,镜像仍可创建新容器。图是事件顺序示意,纵向间距不表示耗时。
--rm 改变退出后的去向,运行期间不会删除容器。-d --rm 可以组合:后台服务退出后同样删除。终端命令返回不等于容器退出。短时实验适合自动清理;需要保留失败现场时,先不要加 --rm。
深入一点:卷与重启策略
卷是独立于容器可写层的数据存储。--rm 还会清理关联的匿名卷(没有指定名字的卷),保留命名卷;本页实验不挂载卷。卷在存储模块详讲。
--restart 指定退出后的自动重启策略,不能与 --rm 同用;后面的重启策略页面会展开。[4]
容器配置
命名,再传入配置
--name 给容器一个容易引用的名字;-e KEY=value 把环境变量传给容器中的程序。环境变量是程序启动时能读取的键值配置,是否使用取决于程序。[5] [6]
名字在同一个 Docker Engine 中必须唯一,已停止但未删除的容器也占用名字。名称冲突时,先用 docker ps -a 确认归属,换一个名字,或只删除自己确认不要的已停止容器;不要为实验清空其他容器。
自己跑:变量由谁读取
在宿主机的 Linux shell 中执行。这里的 env 打印容器环境;管道后的 grep 在宿主机筛选相关行。-e 可以重复,也可以写成长选项 --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]
-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
- 启动成功后命令返回一个容器 ID。它只表示已启动,不保证服务此刻已就绪;等待片刻。
- 在本机浏览器打开 http://127.0.0.1:8080/。预期看到镜像自带的 Nginx 默认页面,不访问容器端口
80作为主机入口。 - 用
docker ps查看运行容器,核对名称与发布规则。这里不列未实测的 ID、时间或表格输出。
实验结束,停止自己刚创建的容器。docker stop 请求容器停止;加了 --rm,停止后会自动删除,无需再手动删除它。
docker stop lp-flags-web
docker ps -a --filter name=lp-flags-web
预期停止命令完成后,筛选列表中不再有这个实验容器;镜像仍在。确认自动清理完成后,可以再次运行启动命令复用名字。若还要排查退出现场,先去掉 --rm 再做下一次实验。[8]
后台服务启动后终端已返回,浏览器却连不上。哪项检查最合理?
-it 改变输入和终端设备,不配置网络入口。
清理时机是容器退出。-d 返回终端时,程序可能仍在运行。
先核对寿命,再核对路径:进程需要仍在运行并准备好接收请求;浏览器访问左侧主机端口,转发规则指向右侧容器服务端口。-d 不承诺持续运行或服务就绪。
带走四个判断
- 终端:
-d让命令返回,-it提供交互会话;寿命看主进程。 - 清理:
--rm在退出后删除容器,不删除镜像。 - 配置:
--name标识容器,-e交给程序读取。 - 入口:
-p左主机、右容器;本机练习显式加127.0.0.1。
来源
核对日期:2026-11-03;适用范围:Docker Engine 29.x、默认网络配置下的 Linux 容器。环境没有 Docker,本页全部 Docker 实验未实测;待维护者补实测记录。浏览器交互与版式单独验证。
- docker container run:参数、长短选项与创建行为。
- Running containers:命令结构、前后台、镜像标签、标识与可写层。
- Keep STDIN open 与 Allocate a pseudo-TTY:输入流、终端;实验一输出原文。
- Clean up:退出后清理、匿名卷与命名卷;同页 restart 章节说明不兼容组合。
- Container identification 与 Name your container:容器名、唯一性和自动命名(仅引用命名规则,不使用该文的旧式链接功能)。
- Set environment variables:环境变量覆盖、宿主机变量与实验二输出原文。
- Port publishing and mapping 与 Publish or expose port:左右端口、协议、回环地址及默认发布范围。
- docker container stop 与 docker container ls:停止、列表与过滤。