跳过正文
Background Image

Docker 容器化完全指南:从入门到生产部署

·558 字·3 分钟· loading · loading · ·

🐳 Docker 容器化革命
#

Docker 作为容器化技术的代表,彻底改变了软件开发和部署的方式,实现了"一次构建,到处运行"的梦想。

✨ 容器化优势
#

  • 环境一致性: 开发、测试、生产环境完全一致
  • 快速部署: 秒级启动和停止
  • 资源隔离: 应用间相互独立,互不影响
  • 版本控制: 镜像版本管理,支持回滚

🚀 基础概念
#

1. 核心组件
#

# 镜像 (Image)
docker images                    # 查看本地镜像
docker pull nginx:latest        # 拉取镜像
docker rmi nginx:latest         # 删除镜像

# 容器 (Container)
docker ps                       # 查看运行中的容器
docker ps -a                    # 查看所有容器
docker run nginx:latest         # 运行容器
docker stop <container_id>      # 停止容器

2. 镜像构建
#

# Dockerfile 示例
FROM node:18-alpine

# 设置工作目录
WORKDIR /app

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

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

# 复制应用代码
COPY . .

# 暴露端口
EXPOSE 3000

# 启动命令
CMD ["npm", "start"]

🏗️ 多阶段构建
#

1. 优化镜像大小
#

# 多阶段构建示例
FROM node:18-alpine AS builder

WORKDIR /app
COPY package*.json ./
RUN npm ci

COPY . .
RUN npm run build

# 生产阶段
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

2. 安全优化
#

# 使用非 root 用户
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci

COPY . .
RUN npm run build

FROM node:18-alpine
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nextjs -u 1001

WORKDIR /app
COPY --from=builder --chown=nextjs:nodejs /app/.next ./.next
COPY --from=builder --chown=nextjs:nodejs /app/public ./public

USER nextjs
EXPOSE 3000
CMD ["npm", "start"]

🔧 容器编排
#

1. Docker Compose
#

# docker-compose.yml
version: '3.8'

services:
  web:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
      - DATABASE_URL=postgresql://user:pass@db:5432/myapp
    depends_on:
      - db
    volumes:
      - ./logs:/app/logs

  db:
    image: postgres:15
    environment:
      - POSTGRES_DB=myapp
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=pass
    volumes:
      - postgres_data:/var/lib/postgresql/data
    ports:
      - "5432:5432"

volumes:
  postgres_data:

2. 服务管理
#

# 启动服务
docker-compose up -d

# 查看服务状态
docker-compose ps

# 查看日志
docker-compose logs -f web

# 停止服务
docker-compose down

🌐 网络配置
#

1. 网络模式
#

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

# 运行容器并指定网络
docker run --network my-network --name web nginx:latest

# 查看网络信息
docker network inspect my-network

2. 端口映射
#

# 随机端口映射
docker run -P nginx:latest

# 指定端口映射
docker run -p 8080:80 nginx:latest

# 绑定特定 IP
docker run -p 127.0.0.1:8080:80 nginx:latest

💾 数据管理
#

1. 卷挂载
#

# 命名卷
docker run -v my-data:/app/data nginx:latest

# 绑定挂载
docker run -v /host/path:/container/path nginx:latest

# 只读挂载
docker run -v /host/path:/container/path:ro nginx:latest

2. 数据持久化
#

# docker-compose.yml 中的卷配置
services:
  app:
    image: myapp:latest
    volumes:
      - app_data:/app/data
      - ./config:/app/config:ro
      - ./logs:/app/logs

volumes:
  app_data:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /host/path/to/data

🔒 安全最佳实践
#

1. 镜像安全
#

# 使用官方基础镜像
FROM node:18-alpine

# 定期更新基础镜像
# 使用特定版本标签
FROM node:18.19.0-alpine3.18

# 扫描安全漏洞
# docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
#   aquasec/trivy image myapp:latest

2. 运行时安全
#

# 限制容器资源
docker run --memory=512m --cpus=1 nginx:latest

# 禁用特权模式
docker run --security-opt=no-new-privileges nginx:latest

# 只读文件系统
docker run --read-only nginx:latest

🚀 生产部署
#

1. 镜像仓库
#

# 推送到 Docker Hub
docker tag myapp:latest username/myapp:latest
docker push username/myapp:latest

# 推送到私有仓库
docker tag myapp:latest registry.company.com/myapp:latest
docker push registry.company.com/myapp:latest

2. 部署策略
#

# 蓝绿部署
docker run -d --name app-green -p 8080:80 myapp:latest
# 测试新版本
curl http://localhost:8080/health
# 切换流量
docker stop app-blue
docker run -d --name app-blue -p 80:80 myapp:latest
docker stop app-green

📊 监控和日志
#

1. 容器监控
#

# 查看容器资源使用
docker stats

# 查看容器详细信息
docker inspect <container_id>

# 实时日志
docker logs -f <container_id>

2. 日志聚合
#

# docker-compose.yml 日志配置
services:
  app:
    image: myapp:latest
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

🎯 最佳实践总结
#

  1. 镜像优化: 使用多阶段构建,减少镜像大小
  2. 安全加固: 非 root 用户运行,定期更新基础镜像
  3. 资源管理: 合理设置内存和 CPU 限制
  4. 数据持久化: 使用命名卷而非绑定挂载
  5. 网络隔离: 创建自定义网络,限制端口暴露
  6. 监控日志: 配置日志轮转和监控告警
  7. 版本管理: 使用语义化版本标签

📚 学习资源
#


掌握 Docker 容器化技术,让你的应用部署更加高效和可靠!