摘要
本文完整讲解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. 最佳实践总结
- 安全优先:使用非root用户,最小化镜像
- 性能优化:多阶段构建,合理使用缓存
- 配置分离:环境变量管理敏感信息
- 监控完善:健康检查+日志收集
- 版本控制:镜像标签策略明确
- 备份恢复:定期备份数据卷
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 #云原生
版权声明
本文为原创内容,版权归作者所有,转载请注明出处。文中涉及的代码和配置均为生产级实践,可放心参考使用。