目录

  1. Docker 简介与核心概念
  2. Docker 安装与配置
  3. Docker 镜像操作
  4. Docker 容器管理
  5. Dockerfile 最佳实践
  6. Docker Compose 实战
  7. Docker 网络与存储
  8. Docker 安全最佳实践
  9. Docker 性能优化
  10. Docker 在生产环境中的应用

1. Docker 简介与核心概念

1.1 什么是 Docker

Docker 是一个开源的容器化平台,用于开发、部署和运行应用程序。容器允许开发者将应用程序及其所有依赖项打包到一个轻量级、可移植的容器中,确保应用程序在任何环境下都能一致地运行。

1.2 Docker 的核心概念

镜像(Image)

Docker 镜像是一个只读模板,用于创建容器。镜像包含了运行应用程序所需的所有内容:代码、运行时、库、环境变量和配置文件。镜像采用分层结构,可以通过继承和叠加来构建复杂的多层镜像。

容器(Container)

容器是镜像的运行实例。容器是从镜像创建的可运行实例,它包含了自己的文件系统、进程空间和网络接口。容器是隔离的,每个容器都有自己的文件系统、进程和网络栈,它们相互之间不会干扰。

仓库(Repository)

仓库是存储镜像的地方,分为公共仓库和私有仓库。Docker Hub 是最大的公共仓库,包含了官方镜像和社区贡献的镜像。用户也可以搭建私有仓库来存储自己的镜像。

1.3 Docker 的优势

优势 说明
一致性 消除"在我机器上能运行"的问题
轻量级 相比虚拟机,容器共享操作系统内核,启动更快
可移植性 可以在任何支持 Docker 的系统上运行
隔离性 容器之间相互隔离,互不影响
版本控制 支持镜像版本管理和回滚
快速部署 几秒钟内即可启动容器

1.4 Docker 架构

Docker 采用客户端-服务器架构,主要包含以下组件:

  • Docker Daemon:运行在主机上的后台进程,负责构建、运行和管理容器
  • Docker Client:命令行工具,用户通过它与 Docker Daemon 交互
  • Docker Registry:存储镜像的仓库服务,Docker Hub 是默认的公共仓库

2. Docker 安装与配置

2.1 在 Windows 上安装 Docker

系统要求
  • Windows 10/11 专业版、企业版或教育版
  • 启用 Hyper-V 和Containers 功能
  • 至少 4GB 内存
  • 64 位处理器
安装步骤
# 使用 Chocolatey 安装
choco install docker-desktop

# 或者手动下载安装
# 访问 https://www.docker.com/products/docker-desktop 下载安装包

# 安装完成后,启动 Docker Desktop
WSL2 后端配置(推荐)
# 在 PowerShell 中启用 WSL2
wsl --install

# 更新 WSL2 内核
wsl --update

# 验证安装
docker --version
docker run hello-world

2.2 在 Linux 上安装 Docker

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=amd64 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 systemctl start docker
sudo systemctl enable docker

# 验证安装
sudo docker run hello-world
CentOS/RHEL
# 安装依赖
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-compose-plugin

# 启动 Docker
sudo systemctl start docker
sudo systemctl enable docker

2.3 Docker 配置

配置镜像加速
{
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com"
  ]
}

在 Docker Desktop 中:Settings -> Docker Engine -> 添加上述配置

在 Linux 中编辑 /etc/docker/daemon.json

sudo tee /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
EOF
sudo systemctl restart docker
配置资源限制
{
  "memory": "4g",
  "memorySwap": "2g",
  "cpu": 2,
  "storage": "50gb"
}

2.4 Docker Compose 安装

Docker Desktop 已包含 Docker Compose。对于 Linux 系统:

# 方法一:通过 pip 安装
pip install docker-compose

# 方法二:从 GitHub 下载
sudo curl -L "https://github.com/docker/compose/releases/download/v2.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose

# 验证
docker-compose --version

3. Docker 镜像操作

3.1 镜像基础操作

搜索镜像
# 搜索镜像
docker search nginx

# 搜索官方镜像
docker search --filter "is-official=true" nginx

# 搜索星级大于 1000 的镜像
docker search --filter "stars=1000" nginx
拉取镜像
# 拉取最新版本
docker pull nginx

# 拉取指定版本标签
docker pull nginx:1.25

# 拉取所有标签
docker pull -a nginx
列出镜像
# 列出本地镜像
docker images

# 显示镜像 ID
docker images -q

# 显示悬空镜像(无标签)
docker images -f "dangling=true"

# 显示格式化输出
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"
删除镜像
# 删除单个镜像
docker rmi nginx

# 强制删除
docker rmi -f nginx

# 删除悬空镜像
docker image prune

# 删除所有未使用的镜像
docker image prune -a

# 删除特定仓库的所有镜像
docker rmi $(docker images -q nginx)

3.2 镜像构建

使用 Dockerfile 构建
# 构建镜像
docker build -t myapp:1.0 .

# 指定 Dockerfile 路径
docker build -t myapp:1.0 -f /path/to/Dockerfile .

# 使用构建缓存
docker build -t myapp:1.0 --cache-from myapp:previous .

# 构建时传递构建参数
docker build --build-arg VERSION=1.0 -t myapp:1.0 .

# 多阶段构建
docker build -t myapp:1.0 -f Dockerfile.multi .
手动构建镜像
# 从容器创建镜像
docker commit -m "Add new feature" -a "Author" container_id myapp:1.0

# 导入 tar 文件创建镜像
docker import - myapp:1.0 < /path/to/image.tar

3.3 镜像管理

镜像标签
# 为镜像添加标签
docker tag myapp:1.0 myregistry.com/myapp:1.0

# 为镜像添加多个标签
docker tag myapp:1.0 myapp:latest myapp:production
镜像推送
# 登录 Docker Hub
docker login

# 登录私有仓库
docker login myregistry.com

# 推送到 Docker Hub
docker push myapp:1.0

# 推送到私有仓库
docker push myregistry.com/myapp:1.0
镜像历史
# 查看镜像构建历史
docker history myapp:1.0

# 显示详细历史
docker history --no-trunc myapp:1.0
镜像 prune
# 清理所有悬空镜像
docker image prune

# 清理所有未使用的镜像
docker image prune -a

# 清理构建缓存
docker builder prune

4. Docker 容器管理

4.1 容器基础操作

创建并启动容器
# 创建并启动容器
docker run -d --name mynginx nginx

# 交互式容器
docker run -it --name myubuntu ubuntu /bin/bash

# 启动后自动删除(临时容器)
docker run --rm --name tempnginx nginx
启动和停止容器
# 启动已停止的容器
docker start mynginx

# 停止容器
docker stop mynginx

# 重启容器
docker restart mynginx

# 暂停容器
docker pause mynginx

# 取消暂停
docker unpause mynginx

# 发送信号而非强制停止
docker kill -s SIGTERM mynginx
查看容器
# 列出运行中的容器
docker ps

# 列出所有容器(包括停止的)
docker ps -a

# 显示容器 ID
docker ps -q

# 显示容器的详细信息
docker inspect mynginx

# 查看容器日志
docker logs mynginx

# 实时跟踪日志
docker logs -f mynginx

# 显示最近 N 行日志
docker logs --tail 100 mynginx
进入容器
# 使用 exec 进入容器
docker exec -it mynginx /bin/bash

# 在容器中执行单个命令
docker exec mynginx ls -la

# 使用 attach 附加到容器(不推荐)
docker attach mynginx
删除容器
# 删除已停止的容器
docker rm mynginx

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

# 删除所有已停止的容器
docker container prune

# 删除所有容器(包括运行中的)
docker rm -f $(docker ps -aq)

4.2 容器资源管理

内存限制
# 限制内存为 512MB
docker run -m 512m --name mynginx nginx

# 设置内存和交换空间
docker run -m 512m --memory-swap 1g --name mynginx nginx
CPU 限制
# 限制使用 2 个 CPU 核心
docker run --cpus=2 --name mynginx nginx

# 限制 CPU 权重(相对值)
docker run --cpu-shares=1024 --name mynginx nginx
I/O 限制
# 限制读写速率
docker run --device-read-bps /dev/sda:1mb --device-write-bps /dev/sda:1mb --name mynginx nginx
存储限制
# 创建带有存储限制的容器
docker run --storage-opt size=10g --name mynginx nginx

4.3 容器网络

端口映射
# 映射端口
docker run -p 8080:80 --name mynginx nginx

# 映射多个端口
docker run -p 8080:80 -p 443:443 --name mynginx nginx

# 映射特定 IP
docker run -p 127.0.0.1:8080:80 --name mynginx nginx
网络模式
# 使用 bridge 网络(默认)
docker run --network bridge --name mynginx nginx

# 使用 host 网络(共享主机网络命名空间)
docker run --network host --name mynginx nginx

# 使用 none 网络(无网络)
docker run --network none --name mynginx nginx

# 使用自定义网络
docker run --network mynetwork --name mynginx nginx

4.4 数据卷挂载

# 挂载主机目录
docker run -v /host/path:/container/path --name mynginx nginx

# 挂载只读目录
docker run -v /host/path:/container/path:ro --name mynginx nginx

# 使用命名卷
docker run -v myvolume:/container/path --name mynginx nginx

# 挂载单个文件
docker run -v /host/file:/container/file:ro --name mynginx nginx

4.5 容器健康检查

# 在 Dockerfile 中定义健康检查
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  CMD curl -f http://localhost/ || exit 1

# 在 docker run 中定义健康检查
docker run --health-cmd="curl -f http://localhost/" --health-interval=30s --health-timeout=3s --name mynginx nginx

5. Dockerfile 最佳实践

5.1 Dockerfile 基础指令

# 基础镜像
FROM node:18-alpine

# 维护者信息
LABEL maintainer="author@example.com"

# 设置环境变量
ENV NODE_ENV=production
ENV PORT=3000

# 设置工作目录
WORKDIR /app

# 复制文件
COPY package*.json ./

# 安装依赖
RUN npm ci --only=production

# 复制应用代码
COPY . .

# 暴露端口
EXPOSE 3000

# 定义启动命令
CMD ["node", "server.js"]

5.2 Dockerfile 最佳实践

减少镜像层数
# 不推荐:多个 RUN 指令会产生多个层
RUN apt-get update
RUN apt-get install -y nginx
RUN apt-get clean

# 推荐:合并为一个 RUN 指令
RUN apt-get update && apt-get install -y nginx \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*
使用多阶段构建
# 构建阶段
FROM node:18 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# 运行阶段
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
CMD ["node", "dist/server.js"]
利用构建缓存
# 顺序很重要:先复制依赖文件,再安装,最后复制代码
COPY package*.json ./
RUN npm ci
COPY . .
使用 .dockerignore
# 排除不需要的文件
node_modules
npm-debug.log
.git
.gitignore
*.md
docs/
tests/
.env.local
使用轻量级基础镜像
# 推荐:使用 alpine 镜像
FROM node:18-alpine

# 不推荐:使用完整系统镜像
FROM ubuntu:22.04

5.3 Dockerfile 示例

Node.js 应用
FROM node:18-alpine

WORKDIR /app

COPY package*.json ./
RUN npm ci --only=production

COPY . .

EXPOSE 3000

USER node

CMD ["node", "index.js"]
Python 应用
FROM python:3.11-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

EXPOSE 8000

CMD ["python", "app.py"]
Go 应用
FROM golang:1.21-alpine AS builder

WORKDIR /app

COPY go.mod go.sum ./
RUN go mod download

COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o app

FROM alpine:3.18

RUN apk --no-cache add ca-certificates

WORKDIR /app

COPY --from=builder /app/app .

EXPOSE 8080

CMD ["./app"]

5.4 构建参数与环境变量

# 构建参数
ARG VERSION=latest
FROM nginx:${VERSION}

# 环境变量
ENV APP_ENV=production

# 运行时覆盖构建参数
docker build --build-arg VERSION=1.0 -t myapp .

5.5 安全最佳实践

# 创建非 root 用户
RUN addgroup -g 1000 appgroup && adduser -u 1000 -G appgroup -s /bin/sh -D appuser

# 切换到非 root 用户
USER appuser

# 确保文件所有权正确
COPY --chown=appuser:appgroup . .

6. Docker Compose 实战

6.1 Docker Compose 基础

docker-compose.yml 基础结构
version: '3.8'

services:
  web:
    image: nginx
    ports:
      - "8080:80"
    volumes:
      - ./html:/usr/share/nginx/html
    networks:
      - frontend

  api:
    build: ./api
    environment:
      - DATABASE_URL=postgres://db:5432/app
    depends_on:
      - db
    networks:
      - frontend
      - backend

  db:
    image: postgres:15
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - backend

networks:
  frontend:
  backend:

volumes:
  db-data:

6.2 Docker Compose 命令

# 启动所有服务
docker-compose up

# 后台启动
docker-compose up -d

# 启动指定服务
docker-compose up web

# 停止服务
docker-compose down

# 停止并删除 volumes
docker-compose down -v

# 查看服务状态
docker-compose ps

# 查看服务日志
docker-compose logs

# 实时日志
docker-compose logs -f

# 重新构建服务
docker-compose build

# 重新创建服务
docker-compose up --force-recreate

# 进入服务容器
docker-compose exec web sh

# 扩展服务(Docker Compose v2)
docker-compose up -d --scale web=3

6.3 服务依赖与启动顺序

services:
  web:
    build: .
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_started

  db:
    image: postgres:15
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      timeout: 5s
      retries: 5

  redis:
    image: redis:7-alpine

6.4 环境变量与配置

services:
  app:
    build:
      context: .
      args:
        - BUILD_VERSION=1.0
    environment:
      - NODE_ENV=production
      - DB_HOST=$${DB_HOST}  # 从主机环境变量读取
    env_file:
      - ./config/app.env
    ports:
      - "${APP_PORT:-3000}:3000"

创建 .env 文件:

APP_PORT=8080
DB_HOST=localhost

6.5 高级特性

重启策略
services:
  web:
    image: nginx
    restart: unless-stopped
    # restart: no          # 不重启
    # restart: on-failure  # 失败时重启
    # restart: always      # 始终重启
健康检查
services:
  db:
    image: postgres:15
    healthcheck:
      test: ["CMD", "pg_isready", "-U", "postgres"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 30s
资源限制
services:
  web:
    image: nginx
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 512M
        reservations:
          cpus: '0.25'
          memory: 256M
横向扩展
services:
  worker:
    image: worker
    deploy:
      replicas: 3

6.6 实际应用示例

Node.js + MongoDB + Redis
version: '3.8'

services:
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
      - MONGODB_URI=mongodb://mongo:27017/myapp
      - REDIS_URL=redis://redis:6379
    depends_on:
      - mongo
      - redis
    networks:
      - app-network

  mongo:
    image: mongo:6
    volumes:
      - mongo-data:/data/db
    networks:
      - app-network

  redis:
    image: redis:7-alpine
    volumes:
      - redis-data:/data
    networks:
      - app-network

volumes:
  mongo-data:
  redis-data:

networks:
  app-network:
    driver: bridge
微服务架构
version: '3.8'

services:
  gateway:
    build: ./gateway
    ports:
      - "8080:8080"
    networks:
      - microservices

  auth-service:
    build: ./auth-service
    environment:
      - JWT_SECRET=secret
    networks:
      - microservices

  user-service:
    build: ./user-service
    depends_on:
      - auth-service
    networks:
      - microservices

  order-service:
    build: ./order-service
    depends_on:
      - auth-service
    networks:
      - microservices

networks:
  microservices:

7. Docker 网络与存储

7.1 Docker 网络

网络驱动类型
驱动 说明 适用场景
bridge 默认网络,容器与容器之间通信 单主机容器通信
host 共享主机网络命名空间 性能敏感场景
overlay 跨主机容器通信 Docker Swarm
macvlan 为容器分配 MAC 地址 需要直接网络访问
none 无网络 离线任务
管理网络
# 创建网络
docker network create mynetwork

# 创建自定义 bridge 网络
docker network create --driver bridge mybridge

# 列出网络
docker network ls

# 查看网络详情
docker network inspect mynetwork

# 连接容器到网络
docker network connect mynetwork container1

# 断开容器网络
docker network disconnect mynetwork container1

# 删除网络
docker network rm mynetwork
网络配置示例
services:
  web:
    networks:
      - frontend
      - backend

networks:
  frontend:
    driver: bridge
    ipam:
      config:
        - subnet: 172.20.0.0/16
  backend:
    driver: bridge
    internal: true  # 禁止外部访问

7.2 Docker 存储

存储驱动
驱动 说明 适用场景
overlay2 默认推荐 通用场景
aufs 早期存储驱动 兼容性需求
devicemapper 块级存储 生产环境
btrfs 文件系统级别 需要快照功能
zfs 高级存储功能 数据安全要求高
管理卷
# 创建卷
docker volume create myvolume

# 列出卷
docker volume ls

# 查看卷详情
docker volume inspect myvolume

# 删除未使用的卷
docker volume prune

# 删除指定卷
docker volume rm myvolume
卷类型
# 匿名卷(自动创建和删除)
services:
  app:
    volumes:
      - /app/data

# 命名卷
services:
  app:
    volumes:
      - myvolume:/app/data

# 主机绑定挂载
services:
  app:
    volumes:
      - ./local-path:/app/data

# 只读挂载
services:
  app:
    volumes:
      - myvolume:/app/data:ro
卷插件
# 使用 NFS 卷
volumes:
  nfs-volume:
    driver: local
    driver_opts:
      type: nfs
      o: addr=192.168.1.1,rw
      device: ":/path/to/share"

# 使用 CIFS/SMB 卷
volumes:
  smb-volume:
    driver: local
    driver_opts:
      type: cifs
      o: username=admin,password=secret
      device: "//server/share"

7.3 数据共享与备份

容器间数据共享
services:
  app1:
    volumes:
      - shared-data:/data
  
  app2:
    volumes:
      - shared-data:/data

volumes:
  shared-data:
备份与恢复
# 备份卷
docker run --rm -v myvolume:/data -v $(pwd):/backup alpine tar cvf /backup/backup.tar /data

# 恢复卷
docker run --rm -v myvolume:/data -v $(pwd):/backup alpine tar xvf /backup/backup.tar -C /

8. Docker 安全最佳实践

8.1 镜像安全

使用官方镜像

优先使用官方镜像并定期更新:

# 定期更新基础镜像
docker pull node:18-alpine

# 使用具体版本标签
FROM node:18.17.0-alpine3.18
扫描镜像漏洞
# 使用 Docker Scout
docker scout cves myimage:latest

# 使用 Trivy
trivy image myimage:latest

# 使用 Clair
clair-scanner myimage:latest
签名和验证镜像
# 启用 Docker Content Trust
export DOCKER_CONTENT_TRUST=1

# 拉取签名镜像
docker pull myimage:latest

8.2 运行时安全

以非 root 用户运行
FROM node:18-alpine

RUN addgroup -g 1001 -S nodejs && \
    adduser -S nextjs -u 1001

USER nextjs

WORKDIR /app
COPY --chown=nextjs:nodejs . .
限制容器权限
# 只读文件系统
docker run --read-only --tmpfs /tmp myimage

# 删除所有能力,只保留必需的能力
docker run --cap-drop all --cap-add NET_BIND_SERVICE myimage

# 禁止新增内核模块
docker run --cap-drop=SYS_MODULE myimage

# 禁止容器访问主机设备
docker run --device /dev/sda:/dev/sda myimage
资源限制
services:
  app:
    image: myapp
    deploy:
      resources:
        limits:
          memory: 512M
          cpus: '0.5'
        reservations:
          memory: 256M

8.3 主机安全

保持 Docker 更新
# 检查 Docker 版本
docker version

# 更新 Docker(Ubuntu)
sudo apt update
sudo apt upgrade docker-ce
限制 Docker socket 访问
# 不要将 Docker socket 挂载到容器中
# 禁止这样使用:docker run -v /var/run/docker.sock:/var/run/docker.sdk ...
启用 AppArmor/SELinux
# 查看 AppArmor 状态
aa-status

# 查看 SELinux 状态
getenforce

# 为容器启用 SELinux
docker run --security-opt label=type:container_t myimage

8.4 网络安全

隔离网络
services:
  web:
    networks:
      - public
  
  api:
    networks:
      - internal
    internal: true
使用 TLS 保护注册表
services:
  registry:
    image: registry:2
    ports:
      - "5000:5000"
    environment:
      - REGISTRY_HTTP_TLS_CERTIFICATE=/certs/server.crt
      - REGISTRY_HTTP_TLS_KEY=/certs/server.key
    volumes:
      - ./certs:/certs

8.5 安全工具集成

Docker Bench for Security
# 运行安全检查
docker run -it --net host --privileged -v /var/run/docker.sock:/var/run/docker.sock docker/docker-bench-security
Falco
# docker-compose.yml
services:
  falco:
    image: falcosecurity/falco
    privileged: true
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /proc:/host/proc:ro
      - /boot:/host/boot:ro
      - /lib/modules:/host/lib/modules:ro

9. Docker 性能优化

9.1 镜像优化

减少镜像层数
# 不推荐
RUN apt-get update
RUN apt-get install -y python
RUN apt-get install -y nodejs
RUN apt-get clean

# 推荐
RUN apt-get update && apt-get install -y python nodejs \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*
使用构建缓存
# 调整层顺序,先安装依赖
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
多阶段构建
FROM node:18 AS builder
WORKDIR /app
COPY . .
RUN npm ci && npm run build

FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules

9.2 运行时优化

使用轻量级镜像
# 推荐:Alpine 镜像
FROM node:18-alpine

# 不推荐:完整系统镜像
FROM ubuntu:22.04
并行化容器
# 使用 docker-compose 并行启动
docker-compose up -d

# 限制并发构建
docker build --build-arg BUILDKIT_INLINE_CACHE=1 .
优化网络
services:
  app:
    dns:
      - 8.8.8.8
      - 8.8.4.4
    dns_search: mydomain.local

9.3 资源管理

合理设置资源限制
# 生产环境推荐设置
docker run -m 512m --cpus=1 --pids-limit=100 myimage
使用健康检查
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s \
  CMD curl -f http://localhost/health || exit 1
清理资源
# 清理构建缓存
docker builder prune -a

# 清理悬空镜像
docker image prune

# 清理停止的容器
docker container prune

# 完整清理
docker system prune -a --volumes

9.4 监控与调试

资源监控
# 查看容器资源使用
docker stats

# 查看容器详情
docker inspect --format='{{.State}}' mycontainer

# 实时监控
docker stats --no-stream
性能分析
# 查看容器进程
docker top mycontainer

# 查看容器网络统计
docker network inspect bridge

# 查看容器磁盘 I/O
docker inspect --format='{{.BlkioWeight}}' mycontainer
日志优化
# 限制日志大小
docker run --log-opt max-size=10m --log-opt max-file=3 myimage

# 清空日志
echo "" > /var/lib/docker/containers/$(docker inspect --format='{{.Id}}' mycontainer)/$(docker inspect --format='{{.Id}}' mycontainer)-json.log

10. Docker 在生产环境中的应用

10.1 生产环境部署

Docker Swarm 集群
# 初始化 Swarm
docker swarm init --advertise-addr 192.168.1.10

# 添加工作节点
docker swarm join --token TOKEN manager-ip:2377

# 查看节点
docker node ls

# 部署服务
docker service create \
  --name myservice \
  --replicas 3 \
  -p 80:80 \
  nginx:latest

# 扩展服务
docker service scale myservice=5

# 更新服务
docker service update --image nginx:1.25 myservice
Docker Stack 部署
# docker-compose.yml
version: '3.8'

services:
  web:
    image: myapp:latest
    deploy:
      replicas: 3
      update_config:
        parallelism: 1
        delay: 10s
        failure_action: rollback
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3

networks:
  - webnet

networks:
  webnet:
    driver: overlay
# 部署 Stack
docker stack deploy -c docker-compose.yml myapp

# 查看 Stack
docker stack ls
docker stack ps myapp

# 删除 Stack
docker stack rm myapp

10.2 CI/CD 集成

GitHub Actions 示例
name: Docker Build and Push

on:
  push:
    branches: [main]

jobs:
  build:
    runs-on: ubuntu-latest
    
    steps:
      - uses: actions/checkout@v3
      
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2
        
      - name: Login to Docker Hub
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}
          
      - name: Build and push
        uses: docker/build-push-action@v4
        with:
          context: .
          push: true
          tags: myapp:latest
GitLab CI 示例
variables:
  IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA

build:
  stage: build
  image: docker:latest
  services:
    - docker:dind
  script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    - docker build -t $IMAGE_TAG .
    - docker push $IMAGE_TAG

deploy:
  stage: deploy
  image: alpine:latest
  script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    - docker pull $IMAGE_TAG
    - docker run -d $IMAGE_TAG

10.3 日志管理

日志收集
# 使用 docker logs
docker logs -f mycontainer

# 使用 ELK Stack
# docker-compose.yml
services:
  elasticsearch:
    image: elasticsearch:8.10.0
    environment:
      - discovery.type=single-node
    
  logstash:
    image: logstash:8.10.0
    volumes:
      - ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf
    
  kibana:
    image: kibana:8.10.0
    ports:
      - "5601:5601"
日志驱动配置
# 使用 JSON 文件日志驱动
docker run --log-driver json-file --log-opt max-size=10m --log-opt max-file=3 myimage

# 使用 syslog 日志驱动
docker run --log-driver syslog --log-opt syslog-address=tcp://localhost:514 myimage

10.4 监控与告警

Prometheus + Grafana
services:
  prometheus:
    image: prom/prometheus
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
    ports:
      - "9090:9090"

  grafana:
    image: grafana/grafana
    ports:
      - "3000:3000"
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=admin
cAdvisor 监控
# 运行 cAdvisor
docker run \
  --volume=/:/rootfs:ro \
  --volume=/var/run:/var/run:ro \
  --volume=/sys:/sys:ro \
  --volume=/var/lib/docker/:/var/lib/docker:ro \
  --publish=8080:8080 \
  gcr.io/cadvisor/cadvisor:latest

10.5 滚动更新与回滚

滚动更新
# 使用 Docker Swarm 进行滚动更新
docker service update --image nginx:1.25 myservice

# 滚动更新配置
docker service update \
  --update-parallelism 1 \
  --update-delay 10s \
  --update-failure-action rollback \
  myservice
回滚
# 回滚到上一个版本
docker service rollback myservice

# 查看服务历史
docker service history myservice

10.6 高可用与负载均衡

服务高可用
services:
  web:
    image: myapp
    deploy:
      replicas: 3
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure
        max_attempts: 3

  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    depends_on:
      - web
负载均衡
services:
  proxy:
    image: nginx:alpine
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
    ports:
      - "80:80"
    networks:
      - app-network

  web:
    image: myapp
    networks:
      - app-network

networks:
  app-network:

附录

常用命令速查表

# 镜像操作
docker pull <image>          # 拉取镜像
docker images               # 列出镜像
docker rmi <image>          # 删除镜像
docker build -t <name> .    # 构建镜像
docker tag <image> <tag>    # 标记镜像

# 容器操作
docker run -d <image>       # 后台运行容器
docker run -it <image> sh   # 交互式运行
docker ps                   # 列出运行中的容器
docker ps -a                # 列出所有容器
docker exec -it <container> sh  # 进入容器
docker logs <container>     # 查看日志
docker stop <container>     # 停止容器
docker rm <container>       # 删除容器

# Docker Compose
docker-compose up -d        # 启动服务
docker-compose down        # 停止服务
docker-compose ps          # 查看服务状态
docker-compose logs -f     # 查看日志

# 系统管理
docker system df           # 磁盘使用
docker system prune        # 清理资源
docker stats               # 资源监控

常见问题解决

容器无法启动
# 查看详细错误信息
docker logs <container>

# 检查容器状态
docker inspect <container>

# 检查资源限制
docker stats <container>
网络问题
# 检查网络
docker network ls
docker network inspect bridge

# 重新创建网络
docker network rm mynetwork
docker network create mynetwork
磁盘空间不足
# 清理未使用的资源
docker system prune -a --volumes

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

相关资源

  • Docker 官方文档:https://docs.docker.com/
  • Docker Hub:https://hub.docker.com/
  • Docker Compose 文档:https://docs.docker.com/compose/
  • Awesome Docker:https://github.com/veggiemonk/awesome-docker

总结

本文档从 Docker 的基础概念出发,逐步深入到生产环境中的应用,涵盖了 Docker 开发的各个方面。通过掌握这些知识,你将能够:

  1. 理解容器化的核心概念和优势
  2. 熟练使用 Docker 进行开发、测试和部署
  3. 编写高效的 Dockerfile 和 Docker Compose 配置
  4. 实现容器网络和存储的正确配置
  5. 遵循安全最佳实践保护你的容器环境
  6. 优化容器性能并进行有效的监控
  7. 在生产环境中实现高可用和自动化的部署

随着容器技术的不断发展,Docker 已成为现代云原生应用开发的基础。持续学习和实践将帮助你更好地掌握这一强大的技术。


Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐