Docker双模式实战:从零到精通,Dockerfile与Docker Compose全方位构建部署

摘要

本文完整讲解Docker的两种核心构建方式:通过Dockerfile实现精细控制,以及使用Docker Compose实现一站式管理。包含从环境搭建、镜像构建、上传到Docker Hub,再到生产部署的完整流程。无论你是初学者还是有经验的开发者,都能从中获得实用价值!


1. 环境准备与安装

1.1 Docker安装

对于Ubuntu系统,参考详细安装教程:Ubuntu系统安装Docker完整指南

1.2 验证安装
bash 复制代码
# 检查Docker和Docker Compose版本
docker --version
docker compose version

# 测试Docker运行
docker run hello-world
1.3 创建Docker Hub账号

访问 Docker Hub官网 注册账号,后续用于镜像推送。


2. 项目结构说明

复制代码
Lunaria-friends/
├── Dockerfile                 # Docker构建文件
├── docker-compose.yml         # Docker Compose配置
├── .env.example              # 环境变量示例
├── requirements.txt          # Python依赖
├── app/                      # 应用代码
│   ├── main.py
│   └── ...
├── prompts/                  # 提示词文件
├── data/                     # 数据目录(Docker挂载)
└── logs/                     # 日志目录(Docker挂载)

3. 核心配置文件详解

3.1 优化版Dockerfile(多阶段构建)
dockerfile 复制代码
# 第一阶段:构建阶段
FROM python:3.12-slim AS builder

WORKDIR /app

# 安装系统依赖
RUN apt-get update && apt-get install -y \
    gcc \
    g++ \
    make \
    && rm -rf /var/lib/apt/lists/*

# 复制依赖文件
COPY requirements.txt .

# 创建虚拟环境并安装依赖
RUN python -m venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"
RUN pip install --no-cache-dir --upgrade pip && \
    pip install --no-cache-dir -r requirements.txt

# 第二阶段:运行阶段
FROM python:3.12-slim

# 安装运行时依赖
RUN apt-get update && apt-get install -y \
    curl \
    procps \
    && rm -rf /var/lib/apt/lists/* \
    && groupadd -r appuser && useradd -r -g appuser -m -d /app appuser

WORKDIR /app

# 从构建阶段复制虚拟环境
COPY --from=builder /opt/venv /opt/venv

# 复制应用代码
COPY app ./app
COPY prompts ./prompts

# 设置环境变量
ENV PATH="/opt/venv/bin:$PATH"
ENV PYTHONUNBUFFERED=1
ENV PYTHONDONTWRITEBYTECODE=1

# 切换非root用户
USER appuser

# 创建目录并设置权限
RUN mkdir -p /app/data /app/logs && \
    chown -R appuser:appuser /app

# 健康检查
HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \
    CMD curl -f http://localhost:8000/health || exit 1

EXPOSE 8000

CMD ["gunicorn", "app.main:app", "--workers", "4", "--worker-class", "uvicorn.workers.UvicornWorker", "--bind", "0.0.0.0:8000"]

Dockerfile最佳实践说明:

  • ✅ 多阶段构建减小镜像体积
  • ✅ 使用非root用户提高安全性
  • ✅ 虚拟环境隔离依赖
  • ✅ 层缓存优化构建速度
  • ✅ 健康检查确保服务可用性
3.2 生产级docker-compose.yml
yaml 复制代码
version: '3.8'

x-common-variables: &common-variables
  TZ: Asia/Shanghai
  PYTHONPATH: /app

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
      target: builder  # 使用多阶段构建
      args:
        - BUILD_ENV=production
    image: ${DOCKER_USERNAME}/lunaria-friends:${VERSION:-latest}
    container_name: lunaria-app-${VERSION:-latest}
    
    env_file:
      - .env
    
    environment:
      <<: *common-variables
      DATABASE_URL: postgresql://${DB_USER}:${DB_PASSWORD}@db:5432/${DB_NAME}
      REDIS_URL: redis://redis:6379/0
    
    ports:
      - "${HOST_PORT:-8080}:8000"
    
    volumes:
      - lunaria_data:/app/data
      - lunaria_logs:/app/logs
      - ./config:/app/config:ro
    
    networks:
      - backend
    
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_healthy
    
    restart: unless-stopped
    
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 60s
    
    deploy:
      resources:
        limits:
          cpus: '1.0'
          memory: 1G
        reservations:
          cpus: '0.5'
          memory: 512M
    
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"
        tag: "lunaria"

  # 数据库服务
  db:
    image: postgres:15-alpine
    container_name: lunaria-db
    environment:
      POSTGRES_DB: ${DB_NAME}
      POSTGRES_USER: ${DB_USER}
      POSTGRES_PASSWORD: ${DB_PASSWORD}
    volumes:
      - postgres_data:/var/lib/postgresql/data
    networks:
      - backend
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${DB_USER} -d ${DB_NAME}"]
      interval: 30s
      timeout: 10s
      retries: 5

  # Redis缓存
  redis:
    image: redis:7-alpine
    container_name: lunaria-redis
    command: redis-server --requirepass ${REDIS_PASSWORD}
    volumes:
      - redis_data:/data
    networks:
      - backend
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 30s
      timeout: 10s
      retries: 3

networks:
  backend:
    driver: bridge
    ipam:
      config:
        - subnet: 172.20.0.0/16

volumes:
  lunaria_data:
    driver: local
  lunaria_logs:
    driver: local
  postgres_data:
    driver: local
  redis_data:
    driver: local

4. 双模式构建部署实战

模式一:Dockerfile直接构建(适合开发调试)

4.1 构建镜像

bash 复制代码
# 方式1:基础构建
docker build -t lunaria-friends:dev .

# 方式2:带缓存优化构建
docker build --cache-from lunaria-friends:dev -t lunaria-friends:latest .

# 方式3:多阶段构建指定目标
docker build --target builder -t lunaria-friends:builder .

4.2 运行容器

bash 复制代码
# 开发环境运行
docker run -d \
  --name lunaria-dev \
  -p 8080:8000 \
  -e DEBUG=true \
  -v $(pwd)/app:/app/app \
  -v $(pwd)/data:/app/data \
  --network host \
  lunaria-friends:dev

# 生产环境运行
docker run -d \
  --name lunaria-prod \
  -p 8080:8000 \
  --env-file .env.production \
  --memory="1g" \
  --cpus="1.0" \
  --restart unless-stopped \
  lunaria-friends:latest

4.3 镜像管理

bash 复制代码
# 查看镜像信息
docker images
docker history lunaria-friends:latest

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

# 导出导入镜像
docker save lunaria-friends:latest > lunaria.tar
docker load < lunaria.tar
模式二:Docker Compose管理(适合生产部署)

4.4 准备环境文件

创建.env文件:

env 复制代码
# Docker配置
DOCKER_USERNAME=your_dockerhub_username
VERSION=1.0.0
HOST_PORT=8080

# 数据库配置
DB_NAME=lunaria
DB_USER=admin
DB_PASSWORD=secure_password_123

# Redis配置
REDIS_PASSWORD=redis_password_123

# 应用配置
DEBUG=false
LOG_LEVEL=INFO

4.5 一键部署

bash 复制代码
# 启动所有服务
docker compose up -d

# 查看服务状态
docker compose ps
docker compose logs -f app

# 查看资源使用
docker compose top
docker stats

# 服务管理
docker compose restart app      # 重启应用
docker compose scale app=3      # 扩展实例
docker compose exec app bash    # 进入容器

4.6 生产部署流程

bash 复制代码
# 1. 克隆项目
git clone https://github.com/Angelevilue/Lunaria-friends.git
cd Lunaria-friends

# 2. 配置环境
cp .env.example .env
vim .env  # 编辑配置

# 3. 构建和启动
docker compose build --no-cache
docker compose up -d

# 4. 验证部署
curl http://localhost:8080/health
docker compose ps --format "table {{.Name}}\t{{.Status}}\t{{.Ports}}"

# 5. 监控和日志
docker compose logs --tail=100 app
docker compose events

5. 镜像上传到Docker Hub

5.1 登录Docker Hub

bash 复制代码
docker login
# 输入用户名和密码
# 或使用访问令牌:docker login -u <username> -p <token>

5.2 标记和推送镜像

bash 复制代码
# 标记镜像
docker tag lunaria-friends:latest your_dockerhub_username/lunaria-friends:latest
docker tag lunaria-friends:latest your_dockerhub_username/lunaria-friends:1.0.0

# 推送镜像
docker push your_dockerhub_username/lunaria-friends:latest
docker push your_dockerhub_username/lunaria-friends:1.0.0

# 批量推送
docker push your_dockerhub_username/lunaria-friends --all-tags

5.3 自动化推送脚本

bash 复制代码
#!/bin/bash
# push_to_dockerhub.sh

VERSION=$(date +%Y%m%d%H%M%S)
IMAGE_NAME="your_dockerhub_username/lunaria-friends"

echo "构建镜像..."
docker build -t ${IMAGE_NAME}:${VERSION} -t ${IMAGE_NAME}:latest .

echo "推送镜像..."
docker push ${IMAGE_NAME}:${VERSION}
docker push ${IMAGE_NAME}:latest

echo "清理本地镜像..."
docker image prune -f

6. 常见问题与解决方案

问题1:构建速度慢
bash 复制代码
# 解决方案:使用构建缓存和镜像层优化
docker build --cache-from your_dockerhub_username/lunaria-friends:latest .
问题2:容器权限问题
dockerfile 复制代码
# 在Dockerfile中添加
RUN chown -R 1000:1000 /app
USER 1000
问题3:时区不对
yaml 复制代码
# 在docker-compose.yml中添加
environment:
  TZ: Asia/Shanghai
volumes:
  - /etc/localtime:/etc/localtime:ro
问题4:内存不足
yaml 复制代码
# 配置资源限制
deploy:
  resources:
    limits:
      memory: 2G
      cpus: '2.0'

7. 最佳实践总结

  1. 安全优先:使用非root用户,最小化镜像
  2. 性能优化:多阶段构建,合理使用缓存
  3. 配置分离:环境变量管理敏感信息
  4. 监控完善:健康检查+日志收集
  5. 版本控制:镜像标签策略明确
  6. 备份恢复:定期备份数据卷

8. 进阶:GitHub Actions自动化

创建.github/workflows/docker-build.yml

yaml 复制代码
name: Docker Build and Push

on:
  push:
    branches: [ main ]
    tags: [ 'v*' ]

jobs:
  build-and-push:
    runs-on: ubuntu-latest
    
    steps:
    - uses: actions/checkout@v3
    
    - name: Set up Docker Buildx
      uses: docker/setup-buildx-action@v2
    
    - name: Login to DockerHub
      uses: docker/login-action@v2
      with:
        username: ${{ secrets.DOCKER_USERNAME }}
        password: ${{ secrets.DOCKER_TOKEN }}
    
    - name: Build and push
      uses: docker/build-push-action@v4
      with:
        context: .
        push: true
        tags: |
          ${{ secrets.DOCKER_USERNAME }}/lunaria-friends:latest
          ${{ secrets.DOCKER_USERNAME }}/lunaria-friends:${{ github.sha }}

结语

通过本文的完整指南,您应该已经掌握了:

基础掌握 :Dockerfile编写和Docker Compose配置

进阶技能 :多阶段构建、生产级配置

实战经验 :本地开发到生产部署全流程

最佳实践:安全、性能、监控全方位优化

两种模式各有优势:

  • Dockerfile模式:适合深度定制、CI/CD流水线
  • Docker Compose模式:适合本地开发、快速部署、多服务管理

建议根据项目阶段灵活选择:开发初期用Docker Compose快速迭代,生产环境结合两种方式实现最佳实践。

友好问候

如果在实践中遇到任何问题,或有更多Docker相关话题想了解,欢迎在评论区留言交流!祝您在容器化道路上越走越顺畅!🚀

标签:#Docker实战 #容器化部署 #DevOps #DockerCompose #云原生


版权声明

本文为原创内容,版权归作者所有,转载请注明出处。文中涉及的代码和配置均为生产级实践,可放心参考使用。

相关推荐
Lee-Aiya1 小时前
MacBook M4芯片 Arm64架构 基于docker安装Oracle 19c
macos·docker·oracle·arm
风逸柏1 小时前
dockerfile说明
docker·容器
p***43481 小时前
后端在消息系统中的顺序保证
数据库·数据仓库·docker
你好龙卷风!!!1 小时前
mac上安x86minio的docker版的
运维·docker·容器
j***294810 小时前
Redis 设置密码(配置文件、docker容器、命令行3种场景)
数据库·redis·docker
8***848212 小时前
macOs安装docker且在docker上部署nginx+php
nginx·macos·docker
A***F15713 小时前
从零到上线:Node.js 项目的完整部署流程(包含 Docker 和 CICD)
docker·容器·node.js
i***512615 小时前
springboot整合libreoffice(两种方式,使用本地和远程的libreoffice);docker中同时部署应用和libreoffice
spring boot·后端·docker
Brown.alexis16 小时前
docker安装redis7
运维·docker·容器