15.4.2 容器运行参数与常用选项

本节聚焦 docker run 的常用运行参数与管理选项,帮助在创建容器时完成网络、存储、权限、环境变量与生命周期等核心配置。以下给出运行原理草图、命令示例、安装验证、排错与练习。

运行原理草图(容器创建链路)

文章图片

基础与交互类
- -d:后台运行,适合服务类容器
- -it:交互式终端,常用于调试与临时操作
- --name:自定义容器名,便于管理
- --rm:容器停止后自动删除,适合一次性任务

端口与网络
- -p 主机端口:容器端口:端口映射
- -P:随机映射所有暴露端口
- --network:指定网络模式,如 bridge、host、none、自定义网络
- --hostname:设置容器主机名
- --dns--dns-search:自定义 DNS
- --add-host:添加 hosts 解析,格式为 IP:域名

环境变量与配置注入
- -e / --env:设置环境变量
- --env-file:从文件加载环境变量
- --entrypoint:覆盖镜像默认入口命令
- --workdir:设置工作目录

存储与持久化
- -v 主机路径:容器路径:绑定挂载,适合宿主机目录共享
- -v volume_name:容器路径:命名卷,适合持久化数据
- --mount:更明确的挂载语法,建议在复杂场景使用
- :ro:rw:控制挂载权限

权限与安全
- --user:指定运行用户
- --privileged:特权模式,需谨慎使用
- --cap-add / --cap-drop:增减 Linux capability
- --security-opt:安全策略选项,如禁用 AppArmor/SELinux

生命周期与重启策略
- --restart:重启策略
- no:默认不重启
- on-failure:异常退出重启
- always:始终重启
- unless-stopped:除非手动停止

日志与驱动
- --log-driver:指定日志驱动
- --log-opt:日志参数,如文件大小、轮转策略


安装与验证(最小可用)#

如已安装可跳过。以下以 Ubuntu 为例快速验证 Docker 是否可运行。

# 1) 安装
sudo apt-get update
sudo apt-get install -y docker.io

# 2) 启动与开机自启
sudo systemctl enable --now docker

# 3) 版本与运行验证
docker version
docker run --rm hello-world

预期效果:最后一条命令输出 “Hello from Docker!” 表示运行正常。


关键命令组合示例(含解释)#

示例 1:以服务方式运行 Nginx(端口+重启策略+命名)

docker run -d \
  --name web-nginx \
  --restart always \
  -p 8080:80 \
  nginx:1.25

说明
- -d 后台运行,--restart always 确保异常重启
- -p 8080:80 将宿主 8080 映射到容器 80
验证curl http://127.0.0.1:8080

示例 2:交互调试(交互终端+自动清理)

docker run -it --rm \
  --name alpine-debug \
  alpine:3.19 \
  /bin/sh

说明:进入容器后可执行 apk add curl 等调试命令,退出即删除容器。

示例 3:环境变量注入(MySQL)

docker run -d \
  --name mysql01 \
  -e MYSQL_ROOT_PASSWORD=Root@123 \
  -e MYSQL_DATABASE=appdb \
  -p 3306:3306 \
  mysql:8.0

说明:通过 -e 配置初始化变量;数据库启动后自动创建 appdb

示例 4:绑定挂载(Nginx 配置与页面)

# 准备目录
mkdir -p /opt/nginx/conf /opt/nginx/html

# 写入简单页面
cat > /opt/nginx/html/index.html <<'EOF'
hello docker run volume
EOF

# 运行容器,挂载配置与静态目录
docker run -d \
  --name web-vol \
  -p 8081:80 \
  -v /opt/nginx/html:/usr/share/nginx/html:ro \
  nginx:1.25

说明/opt/nginx/html 只读挂载到容器静态目录,刷新即生效。
验证curl http://127.0.0.1:8081

示例 5:命名卷持久化(Redis)

# 创建命名卷
docker volume create redis-data

# 运行 Redis
docker run -d \
  --name redis01 \
  -p 6379:6379 \
  -v redis-data:/data \
  redis:7.2 \
  redis-server --appendonly yes

说明/data 持久化到命名卷,即使容器删除数据仍保留。

示例 6:自定义网络与 DNS/hosts

# 创建网络
docker network create app-net

# 启动后端服务
docker run -d --name api \
  --network app-net \
  --hostname api-svc \
  nginx:1.25

# 启动前端并添加 hosts
docker run -d --name web \
  --network app-net \
  --add-host api.local:172.18.0.2 \
  nginx:1.25

说明:自定义网络便于容器互通;--add-host 可在容器内解析自定义域名。

示例 7:安全与权限(非 root 用户)

# 以 1000:1000 用户运行
docker run -d \
  --name app-nonroot \
  --user 1000:1000 \
  -p 9000:80 \
  nginx:1.25

说明:降低容器权限,适合生产场景。


常见排错与诊断#

问题 1:端口占用导致容器启动失败

# 现象:bind: address already in use
# 排查
sudo ss -lntp | grep 8080

# 解决:更换端口或停止占用进程
docker run -d -p 18080:80 nginx:1.25

问题 2:挂载目录权限不足

# 现象:容器内写入失败 Permission denied
# 排查宿主目录权限
ls -ld /opt/nginx/html

# 临时修复(示例)
sudo chown -R 1000:1000 /opt/nginx/html

问题 3:环境变量未生效

# 进入容器查看环境变量
docker exec -it mysql01 /bin/bash -c 'env | grep MYSQL'

问题 4:容器异常退出

# 查看退出状态与日志
docker ps -a
docker logs --tail 50 mysql01

练习任务(可操作)#

  1. 使用 docker run 启动一个 Nginx,要求:后台运行、映射 8082 端口、自动重启、容器名为 web-82
  2. 运行一个 Alpine 交互容器,安装 curl,访问 http://example.com,退出后容器自动删除。
  3. 创建命名卷 db-data,运行 MySQL 并持久化数据到该卷,验证容器删除后数据仍在。
  4. 使用 --env-file 方式启动 Redis,文件路径 /opt/redis.env,内容至少包含一个自定义变量。
  5. --network 创建自定义网络,启动两个容器互通并通过容器名访问。