第11章 容器运行参数详解

在前面章节中,我们已经多次使用docker run命令启动容器。本章将系统地学习容器运行时的各种参数,这些参数控制着容器的行为、资源使用、网络配置等关键特性。

11.1 端口映射:-p 和 -P

11.1.1 基本端口映射

bash 复制代码
# 映射单个端口(主机端口:容器端口)
docker run -d -p 8080:80 nginx
# 访问:http://localhost:8080

# 映射到主机的不同端口
docker run -d -p 3000:80 nginx

# 指定协议(TCP/UDP)
docker run -d -p 8080:80/tcp nginx
docker run -d -p 53:53/udp dnsmasq

# 绑定到特定IP
docker run -d -p 127.0.0.1:8080:80 nginx  # 只能本地访问
docker run -d -p 0.0.0.0:8080:80 nginx    # 所有网卡都可访问
docker run -d -p 192.168.1.10:8080:80 nginx  # 指定网卡

11.1.2 多端口映射

bash 复制代码
# 映射多个端口
docker run -d \
  -p 80:80 \
  -p 443:443 \
  nginx

# HTTP和HTTPS服务
docker run -d \
  -p 8080:80 \
  -p 8443:443 \
  myapp:latest

# 同一容器端口映射到多个主机端口(需要多次运行)
docker run -d -p 8080:80 --name web1 nginx
docker run -d -p 8081:80 --name web2 nginx

11.1.3 随机端口映射:-P

bash 复制代码
# 映射所有EXPOSE的端口到随机主机端口
docker run -d -P nginx

# 查看映射的端口
docker port <container>

# 输出示例:
# 80/tcp -> 0.0.0.0:32768

# 查看具体某个容器端口
docker port <container> 80
# 0.0.0.0:32768

11.1.4 端口映射实战

场景1:运行多个Web服务

bash 复制代码
# 项目A
docker run -d -p 8001:80 --name project-a nginx

# 项目B
docker run -d -p 8002:80 --name project-b nginx

# 项目C
docker run -d -p 8003:80 --name project-c nginx

# 访问
curl http://localhost:8001
curl http://localhost:8002
curl http://localhost:8003

场景2:数据库端口映射

bash 复制代码
# MySQL
docker run -d \
  -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=secret \
  --name mysql \
  mysql:8.0

# PostgreSQL
docker run -d \
  -p 5432:5432 \
  -e POSTGRES_PASSWORD=secret \
  --name postgres \
  postgres:13

# Redis
docker run -d \
  -p 6379:6379 \
  --name redis \
  redis:7.0

# 连接测试
mysql -h127.0.0.1 -P3306 -uroot -psecret
psql -h localhost -p 5432 -U postgres
redis-cli -h localhost -p 6379

场景3:避免端口冲突

bash 复制代码
# 开发环境:使用80端口
docker run -d -p 80:80 --name dev-nginx nginx

# 测试环境:使用8080端口(避免冲突)
docker run -d -p 8080:80 --name test-nginx nginx

# 生产模拟:使用9080端口
docker run -d -p 9080:80 --name prod-nginx nginx

11.1.5 端口映射最佳实践

bash 复制代码
# ✅ 显式指定端口(推荐)
docker run -d -p 8080:80 nginx

# ❌ 避免使用-P(端口不可控)
docker run -d -P nginx

# ✅ 绑定到localhost(安全)
docker run -d -p 127.0.0.1:3306:3306 mysql

# ✅ 使用docker-compose管理多服务端口
# docker-compose.yml
services:
  web:
    image: nginx
    ports:
      - "80:80"
  db:
    image: mysql
    ports:
      - "127.0.0.1:3306:3306"

11.2 数据卷挂载:-v 和 --mount

11.2.1 使用 -v 参数

bash 复制代码
# 命名卷(推荐)
docker run -d -v mydata:/data nginx
# 创建名为mydata的卷,挂载到容器的/data

# 绑定挂载(Bind Mount)
docker run -d -v /host/path:/container/path nginx
docker run -d -v $(pwd)/html:/usr/share/nginx/html nginx

# 只读挂载
docker run -d -v mydata:/data:ro nginx
docker run -d -v $(pwd):/app:ro python:3.11

# 挂载单个文件
docker run -d -v /host/config.json:/app/config.json nginx

11.2.2 使用 --mount 参数(推荐)

bash 复制代码
# 命名卷
docker run -d \
  --mount type=volume,source=mydata,target=/data \
  nginx

# 绑定挂载
docker run -d \
  --mount type=bind,source=$(pwd)/html,target=/usr/share/nginx/html \
  nginx

# 只读挂载
docker run -d \
  --mount type=bind,source=$(pwd),target=/app,readonly \
  python:3.11

# tmpfs挂载(临时文件系统,存储在内存中)
docker run -d \
  --mount type=tmpfs,target=/tmp,tmpfs-size=100m \
  nginx

11.2.3 -v vs --mount 对比

特性 -v --mount
语法 简洁 明确
可读性 较差(位置参数) 好(键值对)
目录不存在时 自动创建 报错(bind类型)
支持选项 有限 完整
推荐场景 快速测试 生产环境

示例对比

bash 复制代码
# -v方式
docker run -d -v mydata:/data:ro nginx

# --mount方式(更清晰)
docker run -d \
  --mount type=volume,source=mydata,target=/data,readonly \
  nginx

11.2.4 数据卷实战

场景1:持久化数据库数据

bash 复制代码
# MySQL持久化
docker run -d \
  --name mysql \
  -e MYSQL_ROOT_PASSWORD=secret \
  -v mysql-data:/var/lib/mysql \
  mysql:8.0

# PostgreSQL持久化
docker run -d \
  --name postgres \
  -e POSTGRES_PASSWORD=secret \
  -v postgres-data:/var/lib/postgresql/data \
  postgres:13

# Redis持久化
docker run -d \
  --name redis \
  -v redis-data:/data \
  redis:7.0 redis-server --appendonly yes

场景2:开发环境代码同步

bash 复制代码
# 挂载项目目录实现热重载
docker run -d \
  --name dev-app \
  -v $(pwd):/app \
  -p 5000:5000 \
  python:3.11 \
  python /app/app.py

# 修改本地代码,容器内立即生效
vim app.py
# 应用自动重载(如果配置了热重载)

场景3:配置文件注入

bash 复制代码
# 挂载单个配置文件
docker run -d \
  --name web \
  -v $(pwd)/nginx.conf:/etc/nginx/nginx.conf:ro \
  -p 80:80 \
  nginx

# 挂载配置目录
docker run -d \
  --name web \
  -v $(pwd)/conf.d:/etc/nginx/conf.d:ro \
  -p 80:80 \
  nginx

场景4:日志收集

bash 复制代码
# 挂载日志目录到主机
docker run -d \
  --name web \
  -v $(pwd)/logs:/var/log/nginx \
  -p 80:80 \
  nginx

# 在主机上查看日志
tail -f logs/access.log

场景5:跨容器共享数据

bash 复制代码
# 创建数据卷
docker volume create shared-data

# 容器1写入数据
docker run -d --name writer \
  -v shared-data:/data \
  alpine sh -c "while true; do date >> /data/log.txt; sleep 5; done"

# 容器2读取数据
docker run -it --rm \
  -v shared-data:/data \
  alpine tail -f /data/log.txt

11.2.5 卷的管理

bash 复制代码
# 列出所有卷
docker volume ls

# 创建卷
docker volume create mydata

# 查看卷详情
docker volume inspect mydata

# 删除卷
docker volume rm mydata

# 删除未使用的卷
docker volume prune

# 删除所有卷(危险)
docker volume rm $(docker volume ls -q)

11.3 环境变量:-e 和 --env-file

11.3.1 使用 -e 设置环境变量

bash 复制代码
# 单个环境变量
docker run -d -e MYSQL_ROOT_PASSWORD=secret mysql:8.0

# 多个环境变量
docker run -d \
  -e MYSQL_ROOT_PASSWORD=secret \
  -e MYSQL_DATABASE=mydb \
  -e MYSQL_USER=user \
  -e MYSQL_PASSWORD=pass \
  mysql:8.0

# 从主机环境变量传递
export DB_PASSWORD=secret
docker run -d -e DB_PASSWORD mysql:8.0

# 查看容器的环境变量
docker exec web env
docker inspect web --format '{{.Config.Env}}'

11.3.2 使用 --env-file 批量设置

bash 复制代码
# 创建环境变量文件
cat > app.env <<EOF
# 数据库配置
DB_HOST=mysql
DB_PORT=3306
DB_NAME=myapp
DB_USER=root
DB_PASSWORD=secret

# 应用配置
APP_ENV=production
APP_DEBUG=false
APP_PORT=8000
EOF

# 使用环境变量文件
docker run -d \
  --name myapp \
  --env-file app.env \
  myapp:latest

# 组合使用
docker run -d \
  --env-file app.env \
  -e EXTRA_VAR=value \
  myapp:latest

11.3.3 环境变量实战

场景1:不同环境配置

bash 复制代码
# development.env
cat > development.env <<EOF
APP_ENV=development
APP_DEBUG=true
DB_HOST=localhost
LOG_LEVEL=debug
EOF

# production.env
cat > production.env <<EOF
APP_ENV=production
APP_DEBUG=false
DB_HOST=db.prod.example.com
LOG_LEVEL=warning
EOF

# 开发环境
docker run -d --env-file development.env myapp:latest

# 生产环境
docker run -d --env-file production.env myapp:latest

场景2:密码和敏感信息

bash 复制代码
# ❌ 不好:硬编码密码
docker run -d -e DB_PASSWORD=secret123 myapp

# ✅ 好:从环境变量读取
export DB_PASSWORD=$(cat /secure/db_password)
docker run -d -e DB_PASSWORD myapp

# ✅ 更好:使用Docker secrets(Swarm模式)
echo "secret123" | docker secret create db_password -
docker service create \
  --name myapp \
  --secret db_password \
  myapp:latest

场景3:Python应用配置

bash 复制代码
# app.env
cat > app.env <<EOF
FLASK_APP=app.py
FLASK_ENV=development
DATABASE_URL=postgresql://user:pass@db:5432/mydb
SECRET_KEY=your-secret-key
REDIS_URL=redis://cache:6379/0
EOF

# 运行应用
docker run -d \
  --name flask-app \
  --env-file app.env \
  -p 5000:5000 \
  python:3.11 \
  flask run --host=0.0.0.0

场景4:Node.js应用配置

bash 复制代码
# .env
cat > .env <<EOF
NODE_ENV=production
PORT=3000
DB_HOST=mongo
DB_PORT=27017
DB_NAME=myapp
JWT_SECRET=my-secret-key
EOF

# 运行应用
docker run -d \
  --name node-app \
  --env-file .env \
  -p 3000:3000 \
  node:18 \
  node app.js

11.3.4 环境变量最佳实践

bash 复制代码
# ✅ 使用环境变量文件管理配置
docker run --env-file config.env myapp

# ✅ 不要在镜像中硬编码敏感信息
# Dockerfile
ENV APP_NAME=myapp  # ✅ 可以
# ENV DB_PASSWORD=secret  # ❌ 不要这样做

# ✅ 使用默认值
# 在应用中设置默认值
DB_HOST=${DB_HOST:-localhost}
DB_PORT=${DB_PORT:-5432}

# ✅ 验证必需的环境变量
# entrypoint.sh
if [ -z "$DB_PASSWORD" ]; then
    echo "Error: DB_PASSWORD is required"
    exit 1
fi

11.4 网络设置:--network

11.4.1 网络模式

bash 复制代码
# 1. bridge模式(默认)
docker run -d nginx
docker run -d --network bridge nginx

# 2. host模式(共享主机网络)
docker run -d --network host nginx
# 容器直接使用主机的网络栈,无需端口映射

# 3. none模式(无网络)
docker run -d --network none nginx
# 容器没有网络连接

# 4. container模式(共享其他容器的网络)
docker run -d --name web nginx
docker run -d --network container:web alpine
# 新容器共享web容器的网络命名空间

# 5. 自定义网络
docker network create mynet
docker run -d --network mynet nginx

11.4.2 自定义网络

bash 复制代码
# 创建自定义bridge网络
docker network create myapp-net

# 运行容器并连接到网络
docker run -d \
  --name db \
  --network myapp-net \
  postgres:13

docker run -d \
  --name web \
  --network myapp-net \
  -p 80:80 \
  nginx

# 容器间可以通过名称通信
docker exec web ping db  # 成功

11.4.3 网络别名

bash 复制代码
# 设置网络别名
docker run -d \
  --name mysql \
  --network mynet \
  --network-alias database \
  --network-alias db \
  mysql:8.0

# 其他容器可以通过别名访问
docker run -it --rm --network mynet alpine ping database
docker run -it --rm --network mynet alpine ping db

11.4.4 多网络连接

bash 复制代码
# 创建多个网络
docker network create frontend
docker network create backend

# 容器连接到多个网络
docker run -d \
  --name app \
  --network frontend \
  myapp:latest

# 将容器连接到另一个网络
docker network connect backend app

# 查看容器的网络
docker inspect app --format '{{json .NetworkSettings.Networks}}' | jq

# 断开网络连接
docker network disconnect frontend app

11.4.5 网络实战

场景1:三层架构

bash 复制代码
# 创建网络
docker network create frontend
docker network create backend

# 前端(Nginx)- 只连接frontend
docker run -d \
  --name nginx \
  --network frontend \
  -p 80:80 \
  nginx

# 应用层(API)- 连接两个网络
docker run -d \
  --name api \
  --network frontend \
  myapi:latest

docker network connect backend api

# 数据库(MySQL)- 只连接backend
docker run -d \
  --name mysql \
  --network backend \
  -e MYSQL_ROOT_PASSWORD=secret \
  mysql:8.0

# 结果:
# - nginx可以访问api
# - api可以访问mysql
# - nginx不能直接访问mysql(安全)

场景2:微服务架构

bash 复制代码
# 创建服务网络
docker network create microservices

# 服务发现(通过容器名)
docker run -d --name user-service --network microservices user-service:latest
docker run -d --name order-service --network microservices order-service:latest
docker run -d --name product-service --network microservices product-service:latest

# API网关
docker run -d \
  --name api-gateway \
  --network microservices \
  -p 80:80 \
  api-gateway:latest

# 服务间通信示例
docker exec order-service curl http://user-service/api/users
docker exec order-service curl http://product-service/api/products

场景3:开发和生产网络隔离

bash 复制代码
# 开发网络
docker network create dev-net

docker run -d --name dev-db --network dev-net postgres:13
docker run -d --name dev-app --network dev-net -p 3000:3000 myapp:dev

# 生产网络
docker network create prod-net

docker run -d --name prod-db --network prod-net postgres:13
docker run -d --name prod-app --network prod-net -p 80:80 myapp:prod

# 完全隔离,互不影响

11.4.6 DNS和主机名

bash 复制代码
# 设置主机名
docker run -d --hostname myserver nginx

# 添加hosts记录
docker run -d \
  --add-host db:192.168.1.10 \
  --add-host cache:192.168.1.11 \
  myapp:latest

# 设置DNS服务器
docker run -d \
  --dns 8.8.8.8 \
  --dns 8.8.4.4 \
  nginx

# 设置DNS搜索域
docker run -d \
  --dns-search example.com \
  nginx

11.5 资源限制

11.5.1 内存限制

bash 复制代码
# 限制内存使用
docker run -d --memory 512m nginx
docker run -d -m 1g mysql:8.0

# 内存+交换空间限制
docker run -d \
  --memory 512m \
  --memory-swap 1g \
  nginx
# 内存512MB,交换空间512MB(总计1GB)

# 禁用交换
docker run -d \
  --memory 512m \
  --memory-swap 512m \
  nginx

# 内存预留(软限制)
docker run -d \
  --memory-reservation 256m \
  --memory 512m \
  nginx

# OOM行为
docker run -d \
  --memory 512m \
  --oom-kill-disable \
  nginx
# 注意:禁用OOM killer可能导致系统不稳定

11.5.2 CPU限制

bash 复制代码
# 限制CPU核心数
docker run -d --cpus 1.5 nginx
# 使用1.5个CPU核心

# CPU份额(相对权重)
docker run -d --cpu-shares 512 nginx
# 默认1024,512表示一半权重

# 指定CPU核心
docker run -d --cpuset-cpus 0,1 nginx
# 只使用CPU 0和1

# CPU周期限制
docker run -d \
  --cpu-period 100000 \
  --cpu-quota 50000 \
  nginx
# 每100ms周期中,最多使用50ms(50% CPU)

11.5.3 磁盘I/O限制

bash 复制代码
# 磁盘读写权重
docker run -d --blkio-weight 500 nginx
# 默认500,范围10-1000

# 限制设备读写速率
docker run -d \
  --device-read-bps /dev/sda:10mb \
  --device-write-bps /dev/sda:5mb \
  nginx

# 限制IOPS
docker run -d \
  --device-read-iops /dev/sda:1000 \
  --device-write-iops /dev/sda:500 \
  nginx

11.5.4 PIDs限制

bash 复制代码
# 限制进程数
docker run -d --pids-limit 100 nginx

# 查看容器进程数
docker exec nginx ps aux | wc -l

11.5.5 资源限制实战

场景1:保护系统资源

bash 复制代码
# 限制用户上传服务的资源
docker run -d \
  --name upload-service \
  --memory 512m \
  --cpus 0.5 \
  --pids-limit 50 \
  upload-service:latest

场景2:优先级服务

bash 复制代码
# 高优先级服务(更多资源)
docker run -d \
  --name critical-service \
  --memory 2g \
  --cpus 2 \
  --cpu-shares 1024 \
  critical-service:latest

# 低优先级服务(较少资源)
docker run -d \
  --name background-job \
  --memory 512m \
  --cpus 0.5 \
  --cpu-shares 256 \
  background-job:latest

场景3:数据库资源配置

bash 复制代码
# MySQL生产配置
docker run -d \
  --name mysql \
  --memory 4g \
  --memory-reservation 2g \
  --cpus 2 \
  --cpuset-cpus 0,1 \
  -e MYSQL_ROOT_PASSWORD=secret \
  -v mysql-data:/var/lib/mysql \
  mysql:8.0

# Redis配置
docker run -d \
  --name redis \
  --memory 1g \
  --cpus 1 \
  -v redis-data:/data \
  redis:7.0

场景4:构建任务资源限制

bash 复制代码
# 限制Docker构建的资源使用
docker run -d \
  --name builder \
  --memory 2g \
  --cpus 2 \
  --volume /var/run/docker.sock:/var/run/docker.sock \
  docker:dind

11.5.6 监控资源使用

bash 复制代码
# 实时监控
docker stats

# 监控特定容器
docker stats web db cache

# 只显示一次
docker stats --no-stream

# 自定义格式
docker stats --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}"

# 检查资源限制
docker inspect web --format '{{.HostConfig.Memory}}'
docker inspect web --format '{{.HostConfig.NanoCpus}}'

11.6 重启策略:--restart

11.6.1 重启策略类型

bash 复制代码
# no: 不自动重启(默认)
docker run -d --restart no nginx

# on-failure: 非正常退出时重启
docker run -d --restart on-failure nginx

# on-failure:N: 最多重启N次
docker run -d --restart on-failure:3 nginx

# always: 总是重启
docker run -d --restart always nginx

# unless-stopped: 除非手动停止
docker run -d --restart unless-stopped nginx

11.6.2 重启策略对比

策略 容器退出码=0 容器退出码≠0 Docker重启 手动停止后
no 不重启 不重启 不重启 不重启
on-failure 不重启 重启 不重启 不重启
on-failure:N 不重启 最多重启N次 不重启 不重启
always 重启 重启 重启 重启
unless-stopped 重启 重启 重启 不重启

11.6.3 重启策略实战

场景1:生产服务(高可用)

bash 复制代码
# Web服务:总是重启
docker run -d \
  --name web \
  --restart always \
  -p 80:80 \
  nginx

# API服务:总是重启
docker run -d \
  --name api \
  --restart always \
  -p 8080:8080 \
  myapi:latest

# 数据库:除非手动停止
docker run -d \
  --name mysql \
  --restart unless-stopped \
  -e MYSQL_ROOT_PASSWORD=secret \
  -v mysql-data:/var/lib/mysql \
  mysql:8.0

场景2:批处理任务

bash 复制代码
# 失败时重试,最多3次
docker run -d \
  --name batch-job \
  --restart on-failure:3 \
  batch-processor:latest

# 查看重启次数
docker inspect batch-job --format '{{.RestartCount}}'

场景3:开发环境

bash 复制代码
# 开发环境:失败时重启
docker run -d \
  --name dev-app \
  --restart on-failure \
  -v $(pwd):/app \
  -p 3000:3000 \
  node:18

11.6.4 修改重启策略

bash 复制代码
# 修改已存在容器的重启策略
docker update --restart always web

# 批量修改
docker update --restart unless-stopped $(docker ps -q)

# 查看重启策略
docker inspect web --format '{{.HostConfig.RestartPolicy.Name}}'

11.7 其他重要参数

11.7.1 用户和权限

bash 复制代码
# 指定运行用户
docker run -d --user 1000:1000 nginx
docker run -d --user nginx nginx
docker run -d -u nobody nginx

# 特权模式(慎用)
docker run -d --privileged nginx

# 添加Linux能力
docker run -d --cap-add NET_ADMIN nginx
docker run -d --cap-add SYS_TIME nginx

# 移除Linux能力
docker run -d --cap-drop ALL --cap-add NET_BIND_SERVICE nginx

11.7.2 工作目录

bash 复制代码
# 设置工作目录
docker run -it --workdir /app python:3.11 bash
# 容器启动后,当前目录在/app

docker run -d -w /var/www/html nginx

11.7.3 容器标签

bash 复制代码
# 添加标签
docker run -d \
  --label env=production \
  --label version=1.0 \
  --label team=backend \
  nginx

# 根据标签过滤
docker ps --filter "label=env=production"

# 查看容器标签
docker inspect web --format '{{json .Config.Labels}}' | jq

11.7.4 健康检查

bash 复制代码
# 运行时添加健康检查
docker run -d \
  --name web \
  --health-cmd "curl -f http://localhost/ || exit 1" \
  --health-interval 30s \
  --health-timeout 10s \
  --health-retries 3 \
  --health-start-period 40s \
  nginx

# 查看健康状态
docker inspect web --format '{{.State.Health.Status}}'

# 查看健康检查日志
docker inspect web --format '{{json .State.Health}}' | jq

11.7.5 日志驱动

bash 复制代码
# 设置日志驱动
docker run -d \
  --log-driver json-file \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  nginx

# 使用syslog
docker run -d \
  --log-driver syslog \
  --log-opt syslog-address=tcp://192.168.1.10:514 \
  nginx

# 禁用日志
docker run -d --log-driver none nginx

11.7.6 设备映射(GPU开开发者重点关注)

bash 复制代码
# 映射设备(用于GPU、声卡等)
docker run -d --device /dev/snd nginx

# GPU设备映射(NVIDIA)
docker run -d --gpus all nvidia/cuda:11.0-base

# 特定GPU
docker run -d --gpus '"device=0,1"' nvidia/cuda:11.0-base

# ROCm GPU映射
docker run -d \
  --device /dev/kfd \
  --device /dev/dri \
  --group-add video \
  rocm/pytorch:latest

11.8 综合实战示例

11.8.1 完整的Web应用部署

bash 复制代码
# 部署完整的Web应用栈
# 1. 创建网络
docker network create webapp-net

# 2. 数据库
docker run -d \
  --name postgres \
  --network webapp-net \
  --restart unless-stopped \
  --memory 1g \
  --cpus 1 \
  -e POSTGRES_PASSWORD=secret \
  -e POSTGRES_DB=myapp \
  -v postgres-data:/var/lib/postgresql/data \
  --health-cmd "pg_isready -U postgres" \
  --health-interval 10s \
  postgres:13

# 3. 缓存
docker run -d \
  --name redis \
  --network webapp-net \
  --restart unless-stopped \
  --memory 512m \
  -v redis-data:/data \
  redis:7.0 redis-server --appendonly yes

# 4. 应用服务器
docker run -d \
  --name app \
  --network webapp-net \
  --restart always \
  --memory 2g \
  --cpus 2 \
  -e DATABASE_URL=postgresql://postgres:secret@postgres:5432/myapp \
  -e REDIS_URL=redis://redis:6379/0 \
  --env-file production.env \
  -v $(pwd)/uploads:/app/uploads \
  --health-cmd "curl -f http://localhost:8000/health || exit 1" \
  --health-interval 30s \
  myapp:latest

# 5. Nginx反向代理
docker run -d \
  --name nginx \
  --network webapp-net \
  --restart always \
  -p 80:80 \
  -p 443:443 \
  -v $(pwd)/nginx.conf:/etc/nginx/nginx.conf:ro \
  -v $(pwd)/ssl:/etc/nginx/ssl:ro \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  nginx:alpine

11.8.2 开发环境配置

bash 复制代码
# 开发环境完整配置
docker run -d \
  --name dev-app \
  --network host \
  --restart on-failure \
  --user $(id -u):$(id -g) \
  -v $(pwd):/app \
  -v /app/node_modules \
  -w /app \
  -e NODE_ENV=development \
  -e DEBUG=* \
  --label env=development \
  --label project=myapp \
  node:18 \
  npm run dev

11.8.3 CI/CD构建容器

bash 复制代码
# CI构建容器
docker run --rm \
  --name builder \
  --memory 4g \
  --cpus 4 \
  --volume $(pwd):/workspace \
  --workdir /workspace \
  --env-file ci.env \
  --user $(id -u):$(id -g) \
  node:18 \
  npm run build

11.9 小结

通过本章学习,我们系统掌握了容器运行的各种参数:

端口映射

  • -p 和 -P 参数
  • 多端口映射
  • IP绑定和端口冲突处理

数据卷挂载

  • -v 和 --mount 参数
  • 命名卷 vs 绑定挂载
  • 只读挂载和tmpfs

环境变量

  • -e 和 --env-file
  • 不同环境配置
  • 密码和敏感信息处理

网络设置

  • 网络模式(bridge/host/none/container)
  • 自定义网络和服务发现
  • 多网络架构

资源限制

  • 内存和CPU限制
  • 磁盘I/O控制
  • 资源监控

重启策略

  • 五种重启策略
  • 适用场景
  • 策略修改

其他参数

  • 用户和权限
  • 健康检查
  • 设备映射
  • 日志配置

参数速查表

bash 复制代码
# 完整的docker run命令示例
docker run -d \
  --name myapp \                        # 容器名称
  --hostname myserver \                 # 主机名
  --restart unless-stopped \            # 重启策略
  --network mynet \                     # 网络
  --network-alias app \                 # 网络别名
  -p 8080:80 \                          # 端口映射
  -v mydata:/data \                     # 数据卷
  -v $(pwd)/config:/etc/app:ro \        # 绑定挂载(只读)
  -e APP_ENV=production \               # 环境变量
  --env-file prod.env \                 # 环境文件
  --memory 2g \                         # 内存限制
  --cpus 2 \                            # CPU限制
  --user 1000:1000 \                    # 运行用户
  --workdir /app \                      # 工作目录
  --label env=prod \                    # 标签
  --health-cmd "curl -f http://localhost/" \ # 健康检查
  --health-interval 30s \
  --log-opt max-size=10m \              # 日志配置
  myapp:latest                          # 镜像

下一步

在第12章中,我们将深入学习Docker的存储机制:

  • 容器存储层原理
  • 数据持久化方案
  • 三种数据管理方式详解
  • 存储驱动选择

本章思考题

  1. 什么场景下应该使用命名卷,什么场景下使用绑定挂载?
  2. 为什么在生产环境中不推荐使用-P参数?
  3. 如何在不同环境(开发/测试/生产)中管理容器配置?
  4. 如何合理设置容器的资源限制,避免影响系统稳定性?
  5. always和unless-stopped重启策略有什么区别?各自适用什么场景?

相关资源

相关推荐
成震19711 小时前
UBUNTU 安装虚拟机
linux·运维·ubuntu
最贪吃的虎1 小时前
windows上如何可视化访问并远程操作linux系统上运行的浏览器或者linux可视化桌面
java·linux·运维·windows·分布式·后端·架构
Turboex邮件分享1 小时前
邮件队列堵塞的深度排查与紧急清空/重定向实战
运维·网络
mzhan0172 小时前
Linux: socket创建之后 interface down 然后再up起来
linux·运维
予枫的编程笔记2 小时前
【Docker基础篇】Docker网络模式初探之bridge模式与端口映射
docker·后端开发·端口映射·容器网络·bridge模式·docker入门·容器实操
heimeiyingwang2 小时前
向量数据库VS关系数据库VS非关系数据库
运维·人工智能·重构·架构·机器人
之歆2 小时前
Linux 软件包管理与编译安装
linux·运维·服务器
Linux运维技术栈2 小时前
实战运维|CentOS7 Nexus3.21.1 迁移至 Rocky Linux9.5 + 升级至3.68.1
运维·nexus3
麦德泽特2 小时前
OpenWrt在机器人中的高级网络应用:AP+STA模式、中继与防火墙配置实战
运维·网络·机器人