基础语法
bash
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
一、容器生命周期与运行模式
参数 | 作用 | 示例(Redis) |
|---|
-d / --detach
| 后台运行容器(detach 模式),命令执行后立即返回,容器在后台运行。Redis 服务通常需要后台运行。 | docker run -d redis:7.2
|
--rm
| 容器退出后自动删除。适合临时测试任务,避免遗留已停止的容器。注意:不能与 -d 同时用于需要长期保存数据的情况。 | docker run --rm redis:7.2 redis-cli -h somehost ping
|
--restart
| 容器退出时或 Docker 重启时的重启策略。常用值: • no:不重启(默认) • always:总是重启 • unless-stopped:除非手动停止,否则一直重启 • on-failure[:max-retries]:仅当非正常退出(状态码非0)时重启,可指定最大重试次数。 | docker run -d --restart unless-stopped redis:7.2
|
--name
| 给容器指定一个名称(唯一)。不指定则 Docker 随机生成名称。建议总是命名,便于管理。 | docker run -d --name my-redis redis:7.2
|
--stop-signal
| 设置停止容器时发送的系统信号,默认是 SIGTERM。Redis 可改为 SIGINT 让它更优雅地关闭。 | docker run --stop-signal SIGINT redis:7.2
|
--stop-timeout
| 设置 Docker 发出停止信号后,等待容器退出的超时时间(秒),若超时则强制 kill。 | docker run --stop-timeout 10 redis:7.2
|
二、资源限制与管理
参数 | 作用 | 示例(Redis) |
|---|
-m / --memory
| 限制容器可使用的最大内存,单位 b/k/m/g。例如 -m 512m。超过限制可能触发 OOM Kill。 | docker run -d -m 1g redis:7.2
|
--memory-swap
| 限制 swap 使用量。需要与 -m 配合使用。--memory-swap -1 表示 swap 无限制。 | docker run -d -m 512m --memory-swap 1g redis:7.2
|
--cpus
| 限制容器可使用的 CPU 核心数(支持小数)。例如 --cpus 1.5 表示最多使用 1.5 个核。 | docker run -d --cpus 1 redis:7.2
|
--cpuset-cpus
| 限制容器只能运行在指定的 CPU 核心上。例如 --cpuset-cpus "0,2" 表示只使用第0和第2个 CPU。 | docker run -d --cpuset-cpus 0-1 redis:7.2
|
--oom-kill-disable
| 禁止 OOM Killer 杀掉该容器。必须配合 -m 使用。 | docker run -d -m 512m --oom-kill-disable redis:7.2
|
三、网络配置
参数 | 作用 | 示例(Redis) |
|---|
-p / --publish
| 将宿主机端口映射到容器端口。格式:[宿主机IP:][宿主机端口]:容器端口[/协议]。协议默认为 tcp。 | docker run -d -p 6379:6379 redis:7.2
docker run -d -p 127.0.0.1:6379:6379 redis:7.2
docker run -d -p 6380:6379/udp redis:7.2
|
-P / --publish-all
| 将容器所有暴露的端口(通过 EXPOSE 声明)随机映射到宿主机的高位端口。 | docker run -d -P redis:7.2 查看映射:docker port <容器名>
|
--network
| 指定容器加入的网络模式。常用值: • bridge:默认,桥接网络 • host:与宿主机共享网络栈(性能高,无隔离) • none:无网络 • 自定义网络名称(如 --network mynet) | docker run -d --network host redis:7.2
docker run -d --network my-custom-net redis:7.2
|
--network-alias
| 在当前网络上为容器设置别名,供其他容器通过该别名访问(需自定义网络且使用内置 DNS)。 | 创建网络:docker network create mynet
docker run -d --network mynet --network-alias red redis:7.2 其他容器可通过 red:6379 访问 |
--hostname / -h
| 设置容器内部的主机名。 | docker run -d --hostname red-server redis:7.2
|
--dns
| 设置容器的 DNS 服务器。可多次指定。 | docker run --dns 8.8.8.8 --dns 8.8.4.4 redis:7.2
|
--add-host
| 向容器的 /etc/hosts 文件添加静态解析。格式:hostname:IP | docker run --add-host db:192.168.1.100 redis:7.2
|
四、存储与挂载
参数 | 作用 | 示例(Redis) |
|---|
-v / --volume
| 挂载卷(Volume)或绑定宿主机目录。格式:[源地址]:[目标地址]:[选项]。 • 源地址可以是 命名卷(docker 管理)、宿主机绝对路径(绑定挂载)、匿名卷(仅写目标路径) • 选项常用 ro(只读)、rw(读写)、z/Z(SELinux) | 命名卷:docker run -v redis-data:/data redis:7.2 绑定挂载:docker run -v /host/path:/data redis:7.2 只读挂载:docker run -v /host/config:/config:ro redis:7.2 |
--mount
| -v 的更显式、更详细的替代语法。支持更多选项,推荐在复杂场景使用。格式:type=TYPE,source=...,destination=...。 • type: bind、volume、tmpfs • source/src: 宿主机目录或卷名 • destination/dst/target: 容器内路径 • readonly: 只读 • bind-propagation: 挂载传播属性
| docker run --mount type=volume,source=redis-data,destination=/data redis:7.2
docker run --mount type=bind,source=/host/data,destination=/data,readonly redis:7.2
|
--tmpfs
| 在容器内挂载一个 tmpfs 文件系统,数据存放在内存中,容器停止后自动清除。适合存放临时、敏感数据。 | docker run -d --tmpfs /tmp:rw,noexec,nosuid,size=100m redis:7.2
|
五、环境与配置
参数 | 作用 | 示例(Redis) |
|---|
-e / --env
| 设置环境变量,可以多次使用,或从文件读取(--env-file)。Redis 官方镜像支持 REDIS_PASSWORD 等变量。 | docker run -e REDIS_PASSWORD=mysecret redis:7.2 --requirepass mysecret 多个变量:-e VAR1=val1 -e VAR2=val2
|
--env-file
| 从文件读取环境变量(每行 KEY=value 格式)。 | 创建 redis.env 文件:
REDIS_PASSWORD=secret
REDIS_DATABASES=16 然后运行:docker run --env-file redis.env redis:7.2 |
-w / --workdir
| 设置容器的工作目录,默认是根目录 /。 | docker run -w /data redis:7.2 pwd 会输出 /data
|
--entrypoint
| 覆盖镜像的 ENTRYPOINT 指令。 | Redis 默认 entrypoint 是 docker-entrypoint.sh,我们想直接运行 redis-server 并传参:
docker run --entrypoint redis-server redis:7.2 --appendonly yes |
六、日志与调试
参数 | 作用 | 示例(Redis) |
|---|
-a / --attach
| 绑定到容器的 stdin、stdout、stderr。通常用于前台运行容器时查看输出。-d 模式下无效。 | docker run -a stdout -a stderr redis:7.2
|
--log-driver
| 设置容器的日志驱动。常用:json-file(默认)、syslog、journald、none 等。 | docker run --log-driver syslog --log-opt syslog-address=udp://localhost:514 redis:7.2
|
--log-opt
| 为日志驱动提供选项。例如限制日志文件大小和数量。 | docker run --log-driver json-file --log-opt max-size=10m --log-opt max-file=3 redis:7.2
|
七、安全与权限
参数 | 作用 | 示例(Redis) |
|---|
-u / --user
| 以指定的用户 ID 或用户名运行容器内进程(UID/GID)。 | Redis 容器内默认用户是 redis(uid 999)。以 root 运行:docker run -u root redis:7.2 id |
--cap-add / --cap-drop
| 增加或删除 Linux capabilities。降低权限提高安全性。 | 允许 Redis 使用 setuid:docker run --cap-add SETUID redis:7.2 禁止所有加回 NET_ADMIN:docker run --cap-drop ALL --cap-add NET_ADMIN redis:7.2 |
--security-opt
| 设置安全选项,如禁用 seccomp 或 apparmor 配置文件。 | docker run --security-opt seccomp=unconfined redis:7.2
|
--read-only
| 将容器的根文件系统挂载为只读。防止容器写入本地文件(但 /dev、/proc、/sys 等依然可写)。常用结合 --tmpfs 或卷挂载写入路径。 | docker run --read-only -v redis-data:/data redis:7.2 redis-server --appendonly yes
|
八、健康检查
参数 | 作用 | 示例(Redis) |
|---|
--health-cmd
| 定义健康检查命令,在容器内执行。退出码 0 表示健康,非 0 表示不健康。 | docker run --health-cmd "redis-cli ping" --health-interval 5s redis:7.2
|
--health-interval
| 健康检查间隔时间。 | --health-interval 30s
|
--health-timeout
| 执行健康检查命令的超时时间。 | --health-timeout 3s
|
--health-retries
| 连续失败多少次后认为容器不健康。 | --health-retries 3
|
--health-start-period
| 容器启动后先等待一段时间再开始健康检查,给应用预热时间。 | --health-start-period 15s
|
--no-healthcheck
| 禁用任何继承自镜像的健康检查。 | docker run --no-healthcheck redis:7.2
|
九、完整综合示例(Redis)
结合多个参数运行一个生产级 Redis 容器:
bash
docker run -d \
--name prod-redis \
--restart unless-stopped \
-p 6379:6379 \
-m 1g \
--cpus 1.5 \
--network mynet \
--network-alias redis-main \
-v redis-persist:/data \
-e REDIS_PASSWORD=securepass \
--log-driver json-file \
--log-opt max-size=10m \
--log-opt max-file=3 \
--read-only \
--tmpfs /tmp:rw,noexec,nosuid,size=100m \
--health-cmd "redis-cli -a securepass ping" \
--health-interval 10s \
--health-timeout 2s \
--health-retries 5 \
--health-start-period 10s \
docker.1ms.run/library/redis:7.2 \
redis-server --appendonly yes --requirepass securepass
快速查找用法
任何时候记不住参数,都可以使用 docker run --help 查看帮助,或者 docker run --help | grep 关键字 过滤。