Docker容器化部署实战:从零搭建生产环境

前言

Docker已经成为现代开发和运维的标配工具。本文将从零开始,带你搭建一个完整的生产环境部署方案。

一、环境准备

1.1 安装Docker

# Ubuntu/Debian
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER

# 验证安装
docker --version
docker compose version

1.2 配置镜像加速

国内服务器建议配置镜像加速器:

{
  "registry-mirrors": [
    "https://mirror.ccs.tencentyun.com",
    "https://registry.docker-cn.com"
  ]
}

二、编写Dockerfile

以PHP+MySQL项目为例:

FROM php:8.2-fpm

# 安装扩展
RUN apt-get update && apt-get install -y \
    libpng-dev \
    libjpeg-dev \
    libfreetype6-dev \
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install gd pdo pdo_mysql mysqli

# 安装Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

WORKDIR /var/www/html
COPY . .

RUN composer install --no-dev --optimize-autoloader

EXPOSE 9000
CMD ["php-fpm"]

三、Docker Compose编排

version: '3.8'

services:
  app:
    build: .
    restart: unless-stopped
    volumes:
      - ./:/var/www/html
    depends_on:
      - db
    networks:
      - app-network

  nginx:
    image: nginx:alpine
    restart: unless-stopped
    ports:
      - "80:80"
    volumes:
      - ./:/var/www/html
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
    networks:
      - app-network

  db:
    image: mysql:8.0
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: myapp
    volumes:
      - db_data:/var/lib/mysql
    networks:
      - app-network

volumes:
  db_data:

networks:
  app-network:

四、生产环境优化

4.1 多阶段构建

减小镜像体积:

# 构建阶段
FROM node:18 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

4.2 健康检查

services:
  app:
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost/health"]
      interval: 30s
      timeout: 10s
      retries: 3

4.3 日志管理

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

五、部署流程

# 构建镜像
docker compose build

# 启动服务
docker compose up -d

# 查看状态
docker compose ps

# 查看日志
docker compose logs -f app

# 更新部署
docker compose pull
docker compose up -d --remove-orphans

六、常用运维命令

# 进入容器
docker compose exec app bash

# 数据库备份
docker compose exec db mysqldump -u root -p myapp > backup.sql

# 清理无用镜像
docker image prune -a

# 查看资源占用
docker stats

总结

Docker容器化部署的核心优势:

  1. 环境一致性:开发、测试、生产环境完全一致
  2. 快速部署:一条命令启动完整环境
  3. 易于扩展:水平扩展只需增加容器实例
  4. 资源隔离:服务之间互不影响

掌握这些基础,你就能应对大部分生产环境的部署需求了。