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

1285 lines
26 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: Docker 部署完全指南:从入门到实战
id: 019d3951-f81b-7300-8118-318761bb0138
date: 2026-03-30
author: liuhangyv
cover:
excerpt: Docker 部署完全指南 本文从基础概念讲起,逐步深入到 Docker Compose 实战配置,涵盖环境准备、镜像管理、数据持久化、网络配置等核心内容。 1. Docker 基础概念 在开始部署之前,让我们先了解 Docker 的核心概念。
permalink: /archives/docker-bu-shu-wan-quan-zhi-nan
categories:
- xie-hui-jin-xing-shi
tags:
- Docker
- container
- xiang-mu-shi-zhan
- ling-ji-chu-ru-men
---
<!-- markdownlint-disable MD025 -->
# 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 Desktop[https://www.docker.com/products/docker-desktop/](https://www.docker.com/products/docker-desktop/)
2. 运行安装程序,**务必勾选 WSL2 后端**(推荐)
3. 安装完成后重启电脑
4. 打开 Docker Desktop,检查是否正常运行
#### 验证安装
打开 PowerShell 或命令提示符,执行以下命令:
```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
# 打开 PowerShell(管理员)
wsl --install
# 设置 WSL2 为默认版本
wsl --set-default-version 2
# 查看已安装的发行版
wsl --list -v
```
### 2.2 Linux 系统
#### Ubuntu/Debian
```bash
# 更新软件包
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
```bash
# 删除旧版本
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 镜像操作
```bash
# 搜索镜像
docker search nginx
# 拉取镜像
docker pull nginx:latest
# 查看本地镜像
docker images
# 删除镜像
docker rmi nginx:latest
# 清理未使用的镜像
docker image prune
```
### 3.2 容器操作
```bash
# 运行容器(后台模式)
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 容器网络操作
```bash
# 查看网络列表
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 格式定义多容器应用的服务、网络、数据卷等。
**基础模板**
```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
```yaml
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
```yaml
services:
app:
image: postgres:16
ulimits:
nofile:
soft: 65536 # 软限制
hard: 65536 # 硬限制
nproc:
soft: 4096
hard: 4096
```
#### 共享内存配置
```yaml
services:
app:
image: postgres:16
shm_size: '2gb' # 设置 /dev/shm 大小
```
#### init 进程配置
```yaml
services:
app:
image: nginx:latest
init: true # 启用 init 进程,处理僵尸进程和信号传递
```
### 4.3 网络配置(networks
```yaml
networks:
# 桥接网络(默认)
frontend:
driver: bridge
# 自定义网段
backend:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/16
# 外部网络(已存在的网络)
external-network:
external: true
```
### 4.4 数据卷配置(volumes
```yaml
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 组合
```yaml
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 + 应用组合
```yaml
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 示例
```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 服务管理
```bash
# 启动所有服务(后台运行)
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 查看与调试
```bash
# 查看服务状态
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 镜像管理
```bash
# 拉取最新镜像
docker compose pull
# 拉取并更新服务
docker compose pull && docker compose up -d
# 清理未使用的镜像
docker compose images
docker image prune
```
---
## 7. 数据持久化详解
### 7.1 为什么要数据持久化
Docker 容器默认是**临时的**:删除容器后,所有数据都会丢失。因此,重要数据必须通过数据卷(Volumes)持久化到宿主机。
### 7.2 三种数据卷类型
#### 1. 命名卷(推荐)
```yaml
services:
db:
image: postgres:16
volumes:
- db-data:/var/lib/postgresql/data
volumes:
db-data: # 自动创建命名卷
```
#### 2. 绑定挂载(开发环境)
```yaml
services:
app:
image: nginx:latest
volumes:
- ./html:/usr/share/nginx/html:ro # 只读
- /host/path:/container/path # 读写
```
#### 3. tmpfs 挂载(内存存储)
```yaml
services:
app:
image: redis:alpine
tmpfs:
- /data:size=100M,mode=0755 # 存储在内存中
```
### 7.3 数据备份与恢复
#### 备份命名卷
```bash
# 创建临时容器挂载卷进行备份
docker run --rm \
-v volume-name:/source \
-v $(pwd):/backup \
alpine \
tar czf /backup/backup.tar.gz -C /source .
```
#### 恢复数据
```bash
# 从备份恢复
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 常用健康检查示例
```yaml
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
```yaml
services:
app:
image: node:18-alpine
depends_on:
db:
condition: service_healthy # 等待健康检查通过
redis:
condition: service_started # 仅等待启动
```
---
## 9. 日志管理
### 9.1 日志驱动配置
```yaml
services:
app:
image: nginx:latest
logging:
driver: "json-file" # 默认驱动
options:
max-size: "10m" # 单个日志文件最大 10MB
max-file: "3" # 保留 3 个日志文件
```
### 9.2 查看日志
```bash
# 查看所有日志
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 日志清理
```bash
# 清理所有容器的日志
truncate -s 0 /var/lib/docker/containers/*/*-json.log
# 或使用 docker system df
docker system df
docker system prune
```
---
## 10. 安全加固
### 10.1 容器安全最佳实践
```yaml
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 网络安全
```yaml
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 文件
```bash
# 创建 .env 文件
cat > .env << EOF
DB_PASSWORD=secret123
API_KEY=your-api-key
EOF
# 在 docker-compose.yaml 中引用
```
```yaml
services:
app:
image: node:18-alpine
env_file:
- .env
environment:
- DB_PASSWORD # 从 .env 读取
```
#### 使用 Docker SecretsSwarm 模式)
```yaml
services:
db:
image: postgres:16
secrets:
- db_password
secrets:
db_password:
file: ./db_password.txt
```
---
## 11. 自动化维护脚本
### 11.1 自动备份脚本
```bash
#!/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 定时清理脚本
```bash
#!/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 健康检查脚本
```bash
#!/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
```bash
# 编辑 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`
**可能原因**
- 网络被删除
- 网络配置错误
**解决步骤**
```bash
# 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)`
**可能原因**
- 端口已被其他程序占用
**解决步骤**
```bash
# Windows: 查看端口占用
netstat -ano | findstr :80
# Linux: 查看端口占用
sudo lsof -i :80
# 杀死占用进程或更换端口
```
### 12.3 权限问题
**错误信息**`Permission denied`
**可能原因**
- 宿主机目录权限不足
- SELinux 或 AppArmor 限制
**解决步骤**
```bash
# 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
**解决步骤**
```yaml
# 在 docker-compose.yaml 中添加资源限制
services:
app:
mem_limit: 512m
memswap_limit: 512m
# 调整 JVM 堆内存(Java 应用)
environment:
- JVM_OPTS=-Xmx256m
```
### 12.5 网络通信问题
**问题**:容器之间无法通信
**排查步骤**
```bash
# 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 镜像优化
```dockerfile
# 使用多阶段构建减小镜像大小
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 资源限制调优
```yaml
services:
app:
# 根据实际需求设置合理的资源限制
mem_limit: "512m" # 留出足够余量给系统和 Docker
cpus: "1.0"
# 对于 Java 应用,堆内存不应超过容器内存的 75%
environment:
- JVM_OPTS=-Xmx384m
```
### 13.3 日志优化
```yaml
services:
app:
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
compress: "true"
```
---
## 14. 监控与日志聚合
### 14.1 使用 Portainer 管理容器
```yaml
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. 实践自动化维护
---
**延伸阅读**
- [Docker 官方文档](https://docs.docker.com/)
- [Docker Compose 官方文档](https://docs.docker.com/compose/)
- [最佳实践指南](https://docs.docker.com/develop/)
---
*本文档由人工智能协会整理*
*2026年3月*