docker run 常用参数与场景示例
docker run 的作用可以简单理解成:基于一个镜像,创建并启动一个新容器。
最小语法:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
这页不追求把所有参数列全,只保留我日常最常用、最容易忘记搭配方式的那一批。
高频参数速查
| 参数 | 作用 | 常见示例 |
|---|---|---|
-d | 后台运行 | docker run -d nginx:stable |
-it | 交互式终端 | docker run -it ubuntu:24.04 bash |
--rm | 容器退出后自动删除 | docker run --rm ubuntu:24.04 bash |
--name | 指定容器名 | docker run --name web nginx:stable |
-p | 发布端口 | docker run -p 8080:80 nginx:stable |
-e | 设置环境变量 | docker run -e APP_ENV=prod my-app:latest |
--env-file | 从文件读取环境变量 | docker run --env-file .env my-app:latest |
-v / --mount | 挂载数据卷或宿主机目录 | docker run -v data:/data redis:7 |
-w | 指定工作目录 | docker run -w /app node:22 npm test |
--restart | 容器退出后的重启策略 | docker run --restart unless-stopped ... |
--network | 指定网络 | docker run --network my-net redis:7 |
--cpus | 限制 CPU | docker run --cpus 2 ... |
--memory | 限制内存 | docker run --memory 2g ... |
--gpus all | 把 GPU 暴露给容器 | docker run --gpus all ... |
-u | 指定运行用户 | docker run -u 1000:1000 ... |
我更推荐的几条默认习惯
- 临时调试容器时,优先用
--rm - 需要长期运行的服务,优先加
--name - 涉及挂载时,复杂场景更推荐
--mount - 对外开放服务时,明确写出
-p,不要靠猜 - 长期运行服务通常加
--restart unless-stopped
场景 1:临时开一个交互式 shell
docker run --rm -it ubuntu:24.04 bash
适合做这几类事:
- 试命令
- 临时装包验证
- 快速看镜像里的文件结构
如果镜像里没有 bash,改成:
docker run --rm -it alpine:3.21 sh
场景 2:后台启动一个长期运行的服务
docker run -d \
--name web \
--restart unless-stopped \
-p 8080:80 \
nginx:stable
这一组参数基本就是“单服务上线”的最小常用组合:
-d:后台运行--name web:给容器一个稳定名字--restart unless-stopped:机器重启后也更容易自动拉起-p 8080:80:把宿主机8080映射到容器80
如果你只想让宿主机本机访问,不想暴露给局域网或公网,改成:
docker run -d --name web -p 127.0.0.1:8080:80 nginx:stable
更详细的端口绑定规则见:
场景 3:挂载当前目录做开发或调试
docker run --rm -it \
--mount type=bind,src="$PWD",target=/workspace \
-w /workspace \
python:3.12 \
bash
这类场景下我更倾向于用 --mount,原因很简单:字段更清楚,后面再加只读、子路径等选项时也更不容易看错。
如果你只想看代码,不想让容器改动宿主机文件,可以加只读:
docker run --rm -it \
--mount type=bind,src="$PWD",target=/workspace,readonly \
-w /workspace \
python:3.12 \
bash
场景 4:给容器传环境变量
直接写单个变量:
docker run --rm -e APP_ENV=prod -e TZ=Asia/Shanghai busybox env
变量比较多时,用 .env 文件更稳妥:
docker run --rm --env-file .env my-app:latest
场景 5:挂载数据卷做持久化
docker run -d \
--name redis \
--restart unless-stopped \
--mount type=volume,src=redis-data,target=/data \
redis:7
这比把数据留在容器可写层里靠谱得多。更系统的说明见:
场景 6:限制资源
docker run -d \
--name worker \
--cpus 2 \
--memory 4g \
my-worker:latest
如果你在一台机器上同时跑多个服务,这类限制很有价值,至少能避免某个容器把整机资源吃满。
场景 7:使用 GPU
docker run --rm --gpus all nvidia/cuda:12.6.0-base-ubuntu22.04 nvidia-smi
前提不是 Docker 自己,而是宿主机已经正确安装并配置好 NVIDIA 驱动和 NVIDIA Container Toolkit。否则你看到的通常不是“容器有问题”,而是 GPU runtime 根本没接好。
什么时候该从 docker run 升级到 Compose
如果你开始遇到下面这些情况,就别继续用一长串 docker run 硬顶了:
- 服务超过一个
- 需要固定网络、环境变量、数据卷
- 团队里不止你一个人需要复现
- 你已经开始把命令写进脚本或笔记里反复复制
这时直接转到: