docker run 参数与端口映射
docker run 是使用频率最高的命令:拉镜像、起容器、映射端口、注入环境变量、设置重启策略都靠它的参数完成。本章以 Nginx 为例逐个拆解。
一个完整的 run 示例
先看一条典型命令,再逐段理解每个参数的含义:
docker run -d \
--name web \
-p 8080:80 \
-e NGINX_HOST=example.com \
--restart unless-stopped \
nginx:alpine
| 参数 | 含义 |
|---|---|
| -d | 后台(守护)方式运行,不占住当前终端 |
| --name web | 给容器命名,之后用 web 指代该容器 |
| -p 8080:80 | 端口映射:宿主机 8080 → 容器 80 |
| -e NGINX_HOST=... | 向容器注入环境变量 |
| --restart unless-stopped | 异常退出或机器重启后自动拉起容器 |
| nginx:alpine | 所用镜像,格式为 仓库:标签 |
启动后浏览器访问 http://localhost:8080 即可到达容器内的 Nginx。
端口映射的几种写法
-p 的统一语义是「宿主机端口:容器端口」,可以多次使用:
| 写法 | 含义 |
|---|---|
| -p 8080:80 | 把宿主机所有网卡的 8080 映射到容器 80 |
| -p 127.0.0.1:8080:80 | 只绑定本机回环地址,外部网络访问不到 |
| -p 8080:80/udp | 只映射 udp 协议(默认是 tcp) |
| -p 8080:80 -p 8443:443 | 写多个 -p 一次映射多个端口 |
| -P | 把镜像暴露的端口自动映射到宿主机随机端口 |
-P 的随机端口可通过 docker ps 查看,PORTS 列形如 0.0.0.0:49153->80/tcp。
注入环境变量 -e
很多镜像靠环境变量做初始化配置,例如 MySQL 的 root 密码:
docker run -d --name mymysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-p 3306:3306 mysql:8
容器启动后用 docker exec 验证变量是否注入成功:
docker exec mymysql env | grep MYSQL
# 输出:MYSQL_ROOT_PASSWORD=123456
--restart 重启策略
| 取值 | 行为 |
|---|---|
| no | 默认值,容器退出后不自动重启 |
| on-failure | 仅当以非零退出码结束时才重启 |
| unless-stopped | 除手动 stop 外都会自动重启(含开机自启) |
| always | 无论何种原因退出都自动重启 |
--rm:用完即删
加上 --rm 后,容器一旦停止就被自动删除,适合一次性任务与调试,避免堆积垃圾容器:
docker run --rm -it ubuntu:22.04 bash # 退出 bash 后容器自动删除
交互式参数 -it
-it 是 -i(保持标准输入打开)与 -t(分配伪终端)的组合。缺少它就无法在容器里敲命令、看不到带颜色的交互输出,进入容器调试时必须带上。
容器内 PID 1 与优雅退出
容器里的主进程是 PID 1,它一退出,容器就退出。因此容器内要把服务放在前台运行(如 nginx -g 'daemon off;'),不能使用 nohup 之类的方式后台化;docker stop 向 PID 1 发送 SIGTERM 让它优雅收尾,超时后才强制结束。
小结
docker run 的核心参数:-d 后台运行、--name 命名、-p 映射端口、-e 注入配置、--restart 保活、--rm 用完即删、-it 进入交互;同时让主进程守在前台,stop 才能优雅退出。