docker run 是干什么的
docker run 从镜像创建容器并启动它,是 Docker 里最核心的命令:后台运行、命名、端口映射、目录挂载、环境变量、重启策略这些生产必备项都通过选项一次给全。它等价于先 create 再 start,容器一旦被删除,没有挂载出来的数据也随之消失。
基本信息
| 基本语法 | docker run [选项] 镜像 [命令] [参数] |
|---|---|
| 高频选项 | -d 后台运行 / -it 交互终端 / --rm 退出即删除 / --name 指定名字 |
| 网络端口 | -p 宿主端口:容器端口,--network 指定网络 |
| 持久化 | -v 挂载卷或宿主机目录,-e 注入环境变量 |
| 重启策略 | --restart no、on-failure、always、unless-stopped |
| 资源限制 | --memory、--cpus 限制内存与 CPU,缺省时可以吃满宿主机 |
典型使用场景
- 临时跑一个工具容器:验证配置、导数据、做一次性任务,用 --rm 自动清理
- 部署单机服务:小型站点或内部工具用现成镜像直接跑起来
- 搭建本地开发环境:依赖服务容器化,团队成员用同一条命令拉起同样的环境
- 排障复现:用相同的镜像、挂载与环境变量复现线上问题
- 验证镜像内容:覆盖入口命令进入容器,确认文件与权限是否符合预期
- 资源隔离:给不同服务限定内存与 CPU,避免互相抢占导致整体抖动
常用选项速查
| 选项 | 作用 | 常见误区 |
|---|---|---|
| -d | 后台运行 | 漏写会把终端占住,会话断开进程一起结束 |
| -p 宿主:容器 | 端口映射 | 参数顺序写反,结果与预期相反 |
| -v 宿主:容器 | 目录或卷挂载 | 宿主目录不存在时会自动建成目录而不是报错 |
| -e 键=值 | 注入环境变量 | 把敏感信息写进命令历史与文档 |
| --restart | 重启策略 | 不设置则异常退出后不会自动拉起 |
| --name | 容器命名 | 不命名只能用随机名称做后续操作 |
生产常用形态
生产常用形态
docker run -d --name web \
-p 8080:80 \
-v /data/html:/usr/share/nginx/html:ro \
-e TZ=Asia/Shanghai \
--restart unless-stopped \
--memory 512m --cpus 1 \
nginx:1.27
# 启动后立刻确认状态,避免容器秒退没人发现
docker ps --filter name=web容器内 PID 1 退出容器就停止:启动脚本写错或把前台进程放到后台,都会让容器瞬间退出,此时应看 docker logs 输出的 PID 1 内容。
数据要放在挂载卷或宿主目录里:容器内文件系统随容器删除而消失,把数据库数据目录留在容器内是最典型的丢数据方式。
重启策略决定故障恢复行为:on-failure 只在非零退出时重启,always 连手工停止也会拉起,unless-stopped 介于两者之间,生产常选后者。
镜像标签要写具体版本:用 latest 时同一条命令在不同时间拉到的可能是不同版本,出问题时无法复现。
上线前的检查项
- 确认镜像标签是具体版本,而不是会随时间漂移的最新标签
- 确认数据目录已经挂载到宿主或卷,容器删除后数据仍然存在
- 确认端口绑定的地址范围,内网服务不要默认绑定全部网卡
- 确认重启策略与业务语义一致,避免手工停止后被自动拉起
- 确认内存与 CPU 限制已经设置,防止单个容器拖垮整机
- 启动后立刻查看状态与日志,确认容器没有启动即退出
端口映射与目录挂载写错时容器往往照样能启动,问题要等业务访问或重建时才暴露:把这两项纳入部署前的检查清单,比事后排查省事得多。