跳到主要内容

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限制 CPUdocker 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 硬顶了:

  • 服务超过一个
  • 需要固定网络、环境变量、数据卷
  • 团队里不止你一个人需要复现
  • 你已经开始把命令写进脚本或笔记里反复复制

这时直接转到:

关联阅读