讲解
docker run 是使用频率最高的命令,它把「根据镜像创建容器」和「启动容器」合成一步。它的核心参数按场景记:-d(detached)后台运行,服务类容器必加;--name 给容器起名(不起名会自动生成随机名,后续操作不方便);--rm 退出后自动删除容器,一次性任务用它保持环境干净;-it 分配伪终端并保持标准输入,交互式 shell 必加;-p 映射端口、-v 挂载卷、-e 传环境变量,后三个各配专章,本章先见个面。
容器里跑的「主进程」(镜像的 CMD/ENTRYPOINT 或命令行覆盖的命令)决定容器生死:主进程退出,容器就退出。这解释了一个经典困惑——docker run nginx 为什么卡住不动?因为没加 -d,nginx 在前台运行,终端被它占住了(Ctrl+C 会停掉它)。而 docker run alpine 瞬间退出,是因为 alpine 的默认命令 sh 没有输入就直接结束——想让 alpine 常驻,得给它一个不退出的命令,比如 sleep infinity。
一次性容器和常驻容器是两种基本用法:前者(--rm)用于运行工具、执行批处理,跑完即焚;后者(-d --name)用于跑服务,配合重启策略 --restart(unless-stopped 是常用值)实现开机自启和崩溃自愈。
示例
一次性容器:打印一句话,退出即自动删除:
docker run --rm alpine:3.21 echo "容器里的一天很短"
常驻容器:后台跑一个 nginx,命名并映射端口,随后用 curl 验证(本机 18080 → 容器 80):
docker run -d --name ohmydocs-verify-web -p 18080:80 nginx:1.27-alpine
curl -sf --retry 5 --retry-connrefused --retry-delay 1 http://localhost:18080 | head -3
覆盖启动命令做一次性计算(用容器当「临时计算器」):
docker run --rm alpine:3.21 sh -c 'echo "3.21 内核信息:"; uname -a'
本章结束前停掉并删除常驻容器,保持环境干净:
docker stop ohmydocs-verify-web && docker rm ohmydocs-verify-web
常见坑
- 容器一启动就退出:主进程结束了。用 docker logs 看输出、docker ps -a 看退出码;想让调试容器常驻用 sleep infinity 或 tail -f /dev/null。
- 端口被占:-p 8080:80 报 bind 冲突,说明宿主机 8080 已被占用,换端口或先停掉占用者。
- --rm 和 -d 混用的困惑:--rm 容器停止后自动删除,docker ps -a 里找不到它,排查时别以为「容器没创建成功」。
- 名字冲突:同名容器必须先 rm 才能再 run;脚本里养成先 docker rm -f 名字的习惯。
小结
run = 创建 + 启动;-d/--name/--rm/-it 四个参数覆盖八成场景;容器生死系于主进程;一次性任务用 --rm,常驻服务用 -d。下一章系统管理容器的生命周期。