在前面章节中,我们已经多次使用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的存储机制:
- 容器存储层原理
- 数据持久化方案
- 三种数据管理方式详解
- 存储驱动选择
本章思考题:
- 什么场景下应该使用命名卷,什么场景下使用绑定挂载?
- 为什么在生产环境中不推荐使用-P参数?
- 如何在不同环境(开发/测试/生产)中管理容器配置?
- 如何合理设置容器的资源限制,避免影响系统稳定性?
- always和unless-stopped重启策略有什么区别?各自适用什么场景?
相关资源: