Files
Obsidian/博客/编程与工具/Docker部署完全指南.md
T

26 KiB
Raw Blame History

title, id, date, author, cover, excerpt, permalink, categories, tags
title id date author cover excerpt permalink categories tags
Docker 部署完全指南:从入门到实战 019d3951-f81b-7300-8118-318761bb0138 2026-03-30 liuhangyv Docker 部署完全指南 本文从基础概念讲起,逐步深入到 Docker Compose 实战配置,涵盖环境准备、镜像管理、数据持久化、网络配置等核心内容。 1. Docker 基础概念 在开始部署之前,让我们先了解 Docker 的核心概念。 /archives/docker-bu-shu-wan-quan-zhi-nan
xie-hui-jin-xing-shi
Docker
container
xiang-mu-shi-zhan
ling-ji-chu-ru-men

Docker 部署完全指南:从入门到实战

本文档从基础概念讲起,逐步深入到 Docker Compose 实战配置,涵盖环境准备、镜像管理、数据持久化、网络配置等核心内容。无论你是初学者还是有一定基础的开发者,都能从中获得实用的部署知识。

1. Docker 基础概念

在开始部署之前,让我们先了解 Docker 的核心概念:

1.1 什么是 Docker

Docker 是一个开源的容器化平台,允许开发者将应用程序及其依赖打包成一个独立的容器,确保应用在任何环境中都能一致运行。

核心优势

  • 一致性:开发、测试、生产环境保持一致
  • 隔离性:每个容器相互隔离,互不影响
  • 轻量化:相比虚拟机,容器启动更快、资源占用更少
  • 可移植性:一次构建,随处运行

1.2 核心概念解析

| 概念 | 说明 |

|------|------| | 镜像(Image | 应用程序的模板,包含代码、运行时、环境变量等 | | 容器(Container | 镜像的运行实例,可以启动、停止、删除 | | 仓库(Repository | 存储和分发镜像的地方,如 Docker Hub | | Dockerfile | 定义镜像构建步骤的脚本文件 |

1.3 Docker 与 Docker Compose 的区别

工具 用途 使用场景
Docker 管理单个容器 快速测试、简单部署
Docker Compose 管理多容器应用 复杂应用、服务编排

2. 环境准备

2.1 Windows 系统

安装 Docker Desktop

  1. 下载 Docker Desktophttps://www.docker.com/products/docker-desktop/
  2. 运行安装程序,务必勾选 WSL2 后端(推荐)
  3. 安装完成后重启电脑
  4. 打开 Docker Desktop,检查是否正常运行

验证安装

打开 PowerShell 或命令提示符,执行以下命令:

# 检查 Docker 版本
docker --version

# 检查 Docker Compose 版本(V2
docker compose version

# 如果是旧版 V1(需要单独安装)
docker-compose --version

📝 注意Docker Desktop for Windows 已默认集成 Docker Compose V2,推荐使用 docker compose 命令。

WSL2 配置(如未自动配置)

# 打开 PowerShell(管理员)
wsl --install

# 设置 WSL2 为默认版本
wsl --set-default-version 2

# 查看已安装的发行版
wsl --list -v

2.2 Linux 系统

Ubuntu/Debian

# 更新软件包
sudo apt update

# 安装依赖
sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release

# 添加 Docker GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# 添加 Docker 仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安装 Docker
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin

# 将当前用户加入 docker 组(无需 sudo
sudo usermod -aG docker $USER

# 重新登录后生效

CentOS/RHEL

# 删除旧版本
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine

# 安装依赖
sudo yum install -y yum-utils

# 添加 Docker 仓库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 安装 Docker
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 启动并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker

# 将当前用户加入 docker 组
sudo usermod -aG docker $USER

2.3 硬件资源建议

配置级别 CPU 内存 存储
最低配置 2核 2GB 20GB
推荐配置 4核 4GB 50GB
高性能配置 8核 8GB+ 100GB+

3. Docker 核心操作

3.1 镜像操作

# 搜索镜像
docker search nginx

# 拉取镜像
docker pull nginx:latest

# 查看本地镜像
docker images

# 删除镜像
docker rmi nginx:latest

# 清理未使用的镜像
docker image prune

3.2 容器操作

# 运行容器(后台模式)
docker run -d --name my-nginx nginx:latest

# 运行容器(交互模式)
docker run -it ubuntu:latest /bin/bash

# 映射端口:宿主机:容器
docker run -d -p 8080:80 --name my-nginx nginx:latest

# 映射目录:宿主机路径:容器路径
docker run -d -p 8080:80 -v /host/data:/container/data --name my-nginx nginx:latest

# 查看运行中的容器
docker ps

# 查看所有容器(包括已停止)
docker ps -a

# 停止容器
docker stop my-nginx

# 启动已停止的容器
docker start my-nginx

# 重启容器
docker restart my-nginx

# 删除容器(必须先停止)
docker rm my-nginx

# 强制删除运行中的容器
docker rm -f my-nginx

# 进入容器内部
docker exec -it my-nginx bash

# 查看容器日志
docker logs -f my-nginx

# 查看容器资源使用
docker stats my-nginx

3.3 容器网络操作

# 查看网络列表
docker network ls

# 创建自定义网络
docker network create my-network

# 将容器连接到网络
docker network connect my-network my-nginx

# 从网络断开
docker network disconnect my-network my-nginx

# 查看网络详情
docker network inspect my-network

4. Docker Compose 详解

4.1 docker-compose.yaml 基础结构

Docker Compose 使用 YAML 格式定义多容器应用的服务、网络、数据卷等。

基础模板

version: "3.8"  # Docker Compose 文件版本

services:  # 定义所有服务(容器)
  web:  # 服务名称
    image: nginx:latest  # 使用的镜像
    container_name: my-web  # 容器名称
    restart: unless-stopped  # 重启策略
    ports:  # 端口映射
      - "80:80"
    volumes:  # 数据卷映射
      - ./html:/usr/share/nginx/html:ro
    networks:  # 所属网络
      - frontend

  db:  # 数据库服务
    image: postgres:16
    container_name: my-db
    restart: unless-stopped
    environment:  # 环境变量
      POSTGRES_DB: myapp
      POSTGRES_USER: admin
      POSTGRES_PASSWORD: secret
    volumes:
      - postgres-data:/var/lib/postgresql/data
    networks:
      - frontend
      - backend

networks:  # 定义网络
  frontend:
    driver: bridge
  backend:
    driver: bridge

volumes:  # 定义数据卷
  postgres-data:

4.2 常用配置项详解

服务配置(services

services:
  app:
    # 镜像配置
    image: nginx:alpine  # 镜像:标签
    build: ./  # 从 Dockerfile 构建
    container_name: my-app  # 容器名称

    # 启动策略
    restart: "no"           # 不自动重启
    restart: on-failure     # 失败时重启
    restart: always         # 始终重启
    restart: unless-stopped  # 除非手动停止,否则重启

    # 端口映射
    ports:
      - "80:80"           # 宿主机端口:容器端口
      - "443:443"
      - "8080-8090:8080"   # 端口范围映射

    # 目录映射
    volumes:
      - /host/path:/container/path       # 绝对路径
      - ./relative/path:/container/path  # 相对路径
      - volume-name:/container/path      # 命名卷
      - /host/path:/container/path:ro   # 只读挂载

    # 环境变量
    environment:
      - DB_HOST=localhost
      - DB_PORT=5432
      # 或使用键值对格式
      DB_NAME: myapp

    # 依赖关系(等待其他服务启动)
    depends_on:
      - db
      - redis

    # 健康检查
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost/health"]
      interval: 30s
      timeout: 3s
      retries: 3
      start_period: 10s

    # 资源限制
    mem_limit: 512m  # 最大内存
    cpus: 1.0        # CPU 核心数
    cpu_shares: 512   # CPU 权重

    # 网络配置
    networks:
      - frontend
      - backend

    # 命令覆盖
    command: ["python", "app.py", "--debug"]

    # 备用命令(Shell 格式)
    entrypoint: /bin/sh -c "python app.py"

资源限制配置(ulimits

services:
  app:
    image: postgres:16
    ulimits:
      nofile:
        soft: 65536  # 软限制
        hard: 65536  # 硬限制
      nproc:
        soft: 4096
        hard: 4096

共享内存配置

services:
  app:
    image: postgres:16
    shm_size: '2gb'  # 设置 /dev/shm 大小

init 进程配置

services:
  app:
    image: nginx:latest
    init: true  # 启用 init 进程,处理僵尸进程和信号传递

4.3 网络配置(networks

networks:
  # 桥接网络(默认)
  frontend:
    driver: bridge

  # 自定义网段
  backend:
    driver: bridge
    ipam:
      config:
        - subnet: 172.20.0.0/16

  # 外部网络(已存在的网络)
  external-network:
    external: true

4.4 数据卷配置(volumes

volumes:
  # 命名卷(自动创建)
  db-data:
    driver: local

  # 自定义数据卷配置
  persistent-data:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /mnt/data

  # 使用已有数据卷
  existing-volume:
    external: true

5. 实战配置示例

5.1 Nginx + PHP-FPM 组合

version: "3.8"

services:
  nginx:
    image: nginx:alpine
    container_name: web-server
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
      - ./html:/usr/share/nginx/html:ro
      - ./logs:/var/log/nginx
    depends_on:
      php:
        condition: service_healthy
    networks:
      - app-network
    healthcheck:
      test: ["CMD-SHELL", "nginx -t"]
      interval: 10s
      timeout: 5s
      retries: 3

  php:
    image: php:8.2-fpm-alpine
    container_name: php-fpm
    restart: unless-stopped
    volumes:
      - ./html:/var/www/html
      - ./php.ini:/usr/local/etc/php/php.ini:ro
    networks:
      - app-network
    healthcheck:
      test: ["CMD-SHELL", "php-fpm -t"]
      interval: 10s
      timeout: 5s
      retries: 3
    environment:
      - PHP_MEMORY_LIMIT=256M

networks:
  app-network:
    driver: bridge

5.2 PostgreSQL + 应用组合

version: "3.8"

services:
  app:
    image: node:18-alpine
    container_name: node-app
    restart: unless-stopped
    working_dir: /app
    volumes:
      - ./app:/app
      - ./data:/app/data
    ports:
      - "3000:3000"
    depends_on:
      db:
        condition: service_healthy
    environment:
      - NODE_ENV=production
      - DB_HOST=db
      - DB_PORT=5432
      - DB_USER=admin
      - DB_PASSWORD=secret
      - DB_NAME=myapp
    networks:
      - app-network
    healthcheck:
      test: ["CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost:3000/health || exit 1"]
      interval: 30s
      timeout: 5s
      retries: 3
      start_period: 20s
    mem_limit: 512m
    cpus: 0.5

  db:
    image: postgres:16-alpine
    container_name: postgres-db
    restart: unless-stopped
    volumes:
      - postgres-data:/var/lib/postgresql/data
      - ./backup:/backup
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_DB=myapp
      - POSTGRES_USER=admin
      - POSTGRES_PASSWORD=secret
    networks:
      - app-network
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -h localhost -U admin"]
      interval: 10s
      timeout: 5s
      retries: 5
    mem_limit: 384m
    cpus: 0.5
    shm_size: 256m
    ulimits:
      nofile:
        soft: 65536
        hard: 65536

networks:
  app-network:
    driver: bridge

volumes:
  postgres-data:

5.3 多阶段构建 Dockerfile 示例

# 阶段1:构建
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build

# 阶段2:运行
FROM node:18-alpine AS runtime
WORKDIR /app
ENV NODE_ENV=production

# 复制构建产物
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules

# 创建非 root 用户
RUN addgroup -g 1001 -S nodejs && \
    adduser -S nextjs -u 1001
USER nextjs

EXPOSE 3000
CMD ["node", "dist/server.js"]

6. Docker Compose 常用命令

6.1 服务管理

# 启动所有服务(后台运行)
docker compose up -d

# 启动并重新构建镜像
docker compose up -d --build

# 停止所有服务
docker compose down

# 停止并删除容器、网络
docker compose down --volumes  # 同时删除数据卷

# 重启所有服务
docker compose restart

# 重建特定服务
docker compose up -d --force-recreate service-name

6.2 查看与调试

# 查看服务状态
docker compose ps

# 查看服务日志
docker compose logs -f          # 跟踪所有服务日志
docker compose logs -f web     # 跟踪特定服务日志
docker compose logs --tail 100 web  # 查看最近 100 行

# 查看资源使用
docker compose top

# 进入服务容器
docker compose exec web bash
docker compose exec db psql -U admin -d myapp

# 查看网络详情
docker compose network inspect app_network

6.3 镜像管理

# 拉取最新镜像
docker compose pull

# 拉取并更新服务
docker compose pull && docker compose up -d

# 清理未使用的镜像
docker compose images
docker image prune

7. 数据持久化详解

7.1 为什么要数据持久化

Docker 容器默认是临时的:删除容器后,所有数据都会丢失。因此,重要数据必须通过数据卷(Volumes)持久化到宿主机。

7.2 三种数据卷类型

1. 命名卷(推荐)

services:
  db:
    image: postgres:16
    volumes:
      - db-data:/var/lib/postgresql/data

volumes:
  db-data:  # 自动创建命名卷

2. 绑定挂载(开发环境)

services:
  app:
    image: nginx:latest
    volumes:
      - ./html:/usr/share/nginx/html:ro  # 只读
      - /host/path:/container/path        # 读写

3. tmpfs 挂载(内存存储)

services:
  app:
    image: redis:alpine
    tmpfs:
      - /data:size=100M,mode=0755  # 存储在内存中

7.3 数据备份与恢复

备份命名卷

# 创建临时容器挂载卷进行备份
docker run --rm \
  -v volume-name:/source \
  -v $(pwd):/backup \
  alpine \
  tar czf /backup/backup.tar.gz -C /source .

恢复数据

# 从备份恢复
docker run --rm \
  -v volume-name:/target \
  -v $(pwd):/backup \
  alpine \
  tar xzf /backup/backup.tar.gz -C /target

8. 健康检查配置

8.1 为什么需要健康检查

健康检查(Health Check)用于:

  • 确认容器是否正常运行
  • depends_on 提供真正的就绪状态
  • 负载均衡器判断容器是否可用
  • 自动恢复故障服务

8.2 常用健康检查示例

services:
  # HTTP 健康检查
  web:
    image: nginx:alpine
    healthcheck:
      test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost/"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 10s

  # TCP 端口检查
  redis:
    image: redis:alpine
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 3

  # 执行脚本检查
  postgres:
    image: postgres:16
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -h localhost -U $$POSTGRES_USER"]
      interval: 10s
      timeout: 5s
      retries: 3

8.3 depends_on 的 condition

services:
  app:
    image: node:18-alpine
    depends_on:
      db:
        condition: service_healthy  # 等待健康检查通过
      redis:
        condition: service_started   # 仅等待启动

9. 日志管理

9.1 日志驱动配置

services:
  app:
    image: nginx:latest
    logging:
      driver: "json-file"  # 默认驱动
      options:
        max-size: "10m"     # 单个日志文件最大 10MB
        max-file: "3"       # 保留 3 个日志文件

9.2 查看日志

# 查看所有日志
docker compose logs

# 跟踪日志
docker compose logs -f

# 查看最近 N 行
docker compose logs --tail 100

# 按时间过滤
docker compose logs --since 30m

# 搜索特定内容
docker compose logs | grep "error"

9.3 日志清理

# 清理所有容器的日志
truncate -s 0 /var/lib/docker/containers/*/*-json.log

# 或使用 docker system df
docker system df
docker system prune

10. 安全加固

10.1 容器安全最佳实践

services:
  app:
    image: nginx:latest

    # 不使用特权模式
    # privileged: true  # 禁止!

    # 使用只读根文件系统
    read_only: true

    # 限制资源
    mem_limit: 512m
    cpus: 1.0

    # 不使用 root 用户运行
    user: "1000:1000"

    # 安全选项
    security_opt:
      - no-new-privileges:true

    # 网络隔离
    networks:
      - internal-network

10.2 网络安全

services:
  web:
    image: nginx:latest
    networks:
      - frontend
    ports:
      - "80:80"

  app:
    image: node:18-alpine
    networks:
      - backend
    # 不暴露端口,仅内部访问

  db:
    image: postgres:16
    networks:
      - backend
    # 不暴露端口,仅内部访问

networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge

10.3 敏感信息管理

使用 .env 文件

# 创建 .env 文件
cat > .env << EOF
DB_PASSWORD=secret123
API_KEY=your-api-key
EOF

# 在 docker-compose.yaml 中引用
services:
  app:
    image: node:18-alpine
    env_file:
      - .env
    environment:
      - DB_PASSWORD  # 从 .env 读取

使用 Docker SecretsSwarm 模式)

services:
  db:
    image: postgres:16
    secrets:
      - db_password

secrets:
  db_password:
    file: ./db_password.txt

11. 自动化维护脚本

11.1 自动备份脚本

#!/bin/bash
# 文件名:backup.sh
# 用途:备份 Docker Compose 项目的所有数据

# 配置
PROJECT_NAME="myapp"
BACKUP_DIR="/opt/backups/$PROJECT_NAME"
DATE=$(date +%Y%m%d_%H%M%S)
KEEP_DAYS=7

# 创建备份目录
mkdir -p "$BACKUP_DIR"

# 获取项目路径
COMPOSE_DIR=$(dirname "$(find /opt -name "docker-compose.yaml" -path "*$PROJECT_NAME*" 2>/dev/null | head -1)")
cd "$COMPOSE_DIR" || exit 1

# 备份数据卷
for volume in $(docker compose config --volumes 2>/dev/null | grep -v "^volume-"); do
    echo "正在备份卷: $volume"
    docker run --rm \
      -v ${PROJECT_NAME}_${volume}:/source \
      -v "$BACKUP_DIR":/backup \
      alpine \
      tar czf "/backup/${volume}_${DATE}.tar.gz" -C /source .
done

# 备份配置文件
cp docker-compose.yaml "$BACKUP_DIR/docker-compose_${DATE}.yaml"
cp -r .env "$BACKUP_DIR/.env_${DATE}" 2>/dev/null

# 清理旧备份
find "$BACKUP_DIR" -name "*_${DATE}.tar.gz" -mtime +$KEEP_DAYS -delete

echo "✓ 备份完成: $DATE"

11.2 定时清理脚本

#!/bin/bash
# 文件名:clean.sh
# 用途:清理未使用的 Docker 资源

# 清理停止的容器
docker container prune -f

# 清理未使用的镜像
docker image prune -f

# 清理未使用的网络
docker network prune -f

# 清理构建缓存
docker builder prune -f

# 清理所有未使用的资源
docker system prune -f

# 设置日志大小限制
LOG_DIR="/var/lib/docker/containers"
MAX_SIZE="10M"

for log in $(find $LOG_DIR -name "*-json.log"); do
    size=$(stat -f%z "$log" 2>/dev/null || stat -c%s "$log" 2>/dev/null)
    if [ "$size" -gt 10485760 ]; then
        echo "截断日志文件: $log"
        truncate -s "$MAX_SIZE" "$log"
    fi
done

echo "✓ 清理完成"

11.3 健康检查脚本

#!/bin/bash
# 文件名:health_check.sh
# 用途:检查所有服务健康状态

COMPOSE_DIR="/opt/myapp"  # 修改为你的项目路径
cd "$COMPOSE_DIR" || exit 1

echo "=== 服务状态检查 ==="
docker compose ps

echo ""
echo "=== 健康检查 ==="

# 检查每个服务
for service in $(docker compose config --services); do
    status=$(docker compose ps $service | tail -1 | awk '{print $4}')

    if [ "$status" = "Up" ]; then
        # 检查健康状态
        health=$(docker inspect --format='{{if .State.Health}}{{.State.Health.Status}}{{else}}no-healthcheck{{end}}' $service)

        if [ "$health" = "healthy" ] || [ "$health" = "no-healthcheck" ]; then
            echo "✓ $service 运行正常"
        else
            echo "✗ $service 健康检查失败: $health"
            docker compose logs --tail=20 $service
        fi
    else
        echo "✗ $service 已停止: $status"
        echo "  尝试重启..."
        docker compose restart $service
    fi
done

echo ""
echo "=== 资源使用 ==="
docker stats --no-stream

11.4 定时任务配置(crontab

# 编辑 crontab
crontab -e

# 添加以下任务(每天凌晨 2 点备份)
0 2 * * * /opt/scripts/backup.sh >> /opt/logs/backup.log 2>&1

# 每周日凌晨 3 点清理
0 3 * * 0 /opt/scripts/clean.sh >> /opt/logs/clean.log 2>&1

# 每小时健康检查
0 * * * * /opt/scripts/health_check.sh >> /opt/logs/health.log 2>&1

12. 常见问题与排查

12.1 容器启动失败

错误信息Cannot start service xxx: network not found

可能原因

  • 网络被删除
  • 网络配置错误

解决步骤

# 1. 检查网络状态
docker network ls

# 2. 重新创建网络
docker network create app-network

# 3. 重新启动服务
docker compose down
docker compose up -d

12.2 端口冲突

错误信息Bind for 0.0.0.0:80: unexpected address (error during binding)

可能原因

  • 端口已被其他程序占用

解决步骤

# Windows: 查看端口占用
netstat -ano | findstr :80

# Linux: 查看端口占用
sudo lsof -i :80

# 杀死占用进程或更换端口

12.3 权限问题

错误信息Permission denied

可能原因

  • 宿主机目录权限不足
  • SELinux 或 AppArmor 限制

解决步骤

# Linux: 修改目录权限
sudo chown -R $(id -u):$(id -g) ./data

# 添加 SELinux 策略(如果启用)
chcon -R -t svirt_sandbox_file_t ./data

# 或者在 docker-compose.yaml 中禁用
security_opt:
  - apparmor:unconfined

12.4 内存溢出(OOM

错误信息Killed 或容器被 OOM

解决步骤

# 在 docker-compose.yaml 中添加资源限制
services:
  app:
    mem_limit: 512m
    memswap_limit: 512m
    # 调整 JVM 堆内存(Java 应用)
    environment:
      - JVM_OPTS=-Xmx256m

12.5 网络通信问题

问题:容器之间无法通信

排查步骤

# 1. 检查网络
docker network inspect app-network

# 2. 测试网络连通性
docker compose exec app ping db

# 3. 检查 DNS 解析
docker compose exec app nslookup db

# 4. 查看日志
docker compose logs app

13. 性能优化建议

13.1 镜像优化

# 使用多阶段构建减小镜像大小
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production

FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY . .
CMD ["node", "app.js"]

# 使用 alpine 变体减小基础镜像大小
FROM nginx:alpine
FROM python:3.12-alpine
FROM node:18-alpine

13.2 资源限制调优

services:
  app:
    # 根据实际需求设置合理的资源限制
    mem_limit: "512m"  # 留出足够余量给系统和 Docker
    cpus: "1.0"
    # 对于 Java 应用,堆内存不应超过容器内存的 75%
    environment:
      - JVM_OPTS=-Xmx384m

13.3 日志优化

services:
  app:
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"
        compress: "true"

14. 监控与日志聚合

14.1 使用 Portainer 管理容器

version: "3.8"

services:
  portainer:
    image: portainer/portainer-ce:latest
    container_name: portainer
    restart: unless-stopped
    ports:
      - "9000:9000"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - portainer-data:/data

volumes:
  portainer-data:

访问 http://your-server:9000 即可通过 Web UI 管理 Docker。

14.2 使用 GRAYLOG 日志聚合

(详见专门的日志聚合指南)


15. 总结

本文档涵盖了 Docker 部署的核心知识点:

章节 核心内容
基础概念 镜像、容器、仓库的原理
环境准备 Windows/Linux 安装配置
核心操作 镜像、容器、网络的常用命令
Compose 详解 YAML 配置语法详解
实战示例 Nginx+PHP、PostgreSQL+应用
数据持久化 命名卷、绑定挂载、备份恢复
健康检查 配置与依赖管理
日志管理 日志配置与清理
安全加固 网络隔离、权限控制
自动化脚本 备份、清理、健康检查
常见问题 故障排查与解决
性能优化 镜像、资源、日志优化

推荐学习路径

  1. 先理解 Docker 基础概念
  2. 动手实践基本操作命令
  3. 深入学习 Docker Compose
  4. 理解数据持久化和网络安全
  5. 实践自动化维护

延伸阅读


本文档由人工智能协会整理 2026年3月