docker run

吴书松
吴书松
发布于 2026-05-23 / 14 阅读
0

docker run

基础语法

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: bindvolumetmpfs
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(默认)、syslogjournaldnone 等。

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 使用 setuiddocker run --cap-add SETUID redis:7.2
禁止所有加回 NET_ADMINdocker 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 关键字 过滤。