docker run 参数与端口映射

docker run 是使用频率最高的命令:拉镜像、起容器、映射端口、注入环境变量、设置重启策略都靠它的参数完成。本章以 Nginx 为例逐个拆解。

一个完整的 run 示例

docker 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 才能优雅退出。

笔记加载中…