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