系列导读:本篇将深入讲解 Docker 容器化的最佳实践与生产经验。
文章目录
-
- [一、Docker 基础](#一、Docker 基础)
-
- [1.1 核心概念](#1.1 核心概念)
- [1.2 常用命令](#1.2 常用命令)
- 二、镜像最佳实践
-
- [2.1 基础镜像选择](#2.1 基础镜像选择)
- [2.2 镜像优化原则](#2.2 镜像优化原则)
- [三、Dockerfile 优化](#三、Dockerfile 优化)
-
- [3.1 优化前](#3.1 优化前)
- [3.2 优化后](#3.2 优化后)
- [3.3 .dockerignore](#3.3 .dockerignore)
- 四、容器编排
-
- [4.1 Docker Compose](#4.1 Docker Compose)
- [4.2 常用命令](#4.2 常用命令)
- 五、生产实践
-
- [5.1 安全实践](#5.1 安全实践)
- [5.2 日志管理](#5.2 日志管理)
- [5.3 健康检查](#5.3 健康检查)
- [5.4 资源限制](#5.4 资源限制)
- 总结
一、Docker 基础
1.1 核心概念
┌─────────────────────────────────────────────────────────────┐
│ Docker 核心概念 │
├─────────────────────────────────────────────────────────────┤
│ 📦 镜像 (Image):只读模板 │
│ 🐳 容器 (Container):镜像的运行实例 │
│ 📁 仓库 (Registry):镜像存储 │
│ 📝 Dockerfile:镜像构建脚本 │
└─────────────────────────────────────────────────────────────┘
1.2 常用命令
bash
# 镜像操作
docker build -t app:v1 . # 构建镜像
docker push registry/app:v1 # 推送镜像
docker pull registry/app:v1 # 拉取镜像
docker images # 查看镜像
docker rmi app:v1 # 删除镜像
# 容器操作
docker run -d -p 8080:8080 app:v1 # 运行容器
docker ps # 查看容器
docker logs <container> # 查看日志
docker exec -it <container> sh # 进入容器
docker stop <container> # 停止容器
docker rm <container> # 删除容器
二、镜像最佳实践
2.1 基础镜像选择
| 基础镜像 | 大小 | 适用场景 |
|---|---|---|
| ubuntu | ~70MB | 需要完整系统 |
| alpine | ~5MB | 精简环境 |
| distroless | ~2MB | 仅运行时 |
| openjdk:11-jre-slim | ~200MB | Java 应用 |
2.2 镜像优化原则
1. 选择最小基础镜像
2. 减少镜像层数
3. 使用多阶段构建
4. 清理缓存文件
5. 使用 .dockerignore
三、Dockerfile 优化
3.1 优化前
dockerfile
FROM openjdk:11
WORKDIR /app
COPY . .
RUN apt-get update && apt-get install -y maven
RUN mvn clean package
EXPOSE 8080
CMD ["java", "-jar", "app.jar"]
3.2 优化后
dockerfile
# 构建阶段
FROM maven:3.8-openjdk-11 AS builder
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn clean package -DskipTests
# 运行阶段
FROM openjdk:11-jre-slim
WORKDIR /app
# 创建非 root 用户
RUN groupadd -r appuser && useradd -r -g appuser appuser
# 复制构建产物
COPY --from=builder /app/target/*.jar app.jar
# 设置权限
RUN chown -R appuser:appuser /app
USER appuser
EXPOSE 8080
# 健康检查
HEALTHCHECK --interval=30s --timeout=3s \
CMD curl -f http://localhost:8080/health || exit 1
# JVM 优化
ENV JAVA_OPTS="-Xms256m -Xmx512m -XX:+UseG1GC"
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]
3.3 .dockerignore
# .dockerignore
.git
.gitignore
.idea
*.md
target/
*.log
.env
Dockerfile
docker-compose.yml
四、容器编排
4.1 Docker Compose
yaml
# docker-compose.yml
version: '3.8'
services:
app:
build: .
ports:
- "8080:8080"
environment:
- SPRING_PROFILES_ACTIVE=prod
- JAVA_OPTS=-Xms256m -Xmx512m
depends_on:
- mysql
- redis
networks:
- app-network
restart: unless-stopped
deploy:
resources:
limits:
cpus: '1'
memory: 512M
mysql:
image: mysql:8.0
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=mydb
volumes:
- mysql-data:/var/lib/mysql
networks:
- app-network
redis:
image: redis:7-alpine
volumes:
- redis-data:/data
networks:
- app-network
networks:
app-network:
driver: bridge
volumes:
mysql-data:
redis-data:
4.2 常用命令
bash
# 启动
docker-compose up -d
# 查看状态
docker-compose ps
# 查看日志
docker-compose logs -f app
# 扩容
docker-compose up -d --scale app=3
# 停止
docker-compose down
五、生产实践
5.1 安全实践
dockerfile
# 1. 使用非 root 用户
RUN groupadd -r appuser && useradd -r -g appuser appuser
USER appuser
# 2. 只复制必要文件
COPY --chown=appuser:appuser app.jar /app/
# 3. 不存储敏感信息
# 使用环境变量或 Secret 管理
5.2 日志管理
yaml
# 日志驱动配置
services:
app:
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
5.3 健康检查
dockerfile
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD curl -f http://localhost:8080/health || exit 1
5.4 资源限制
yaml
deploy:
resources:
limits:
cpus: '1'
memory: 512M
reservations:
cpus: '0.5'
memory: 256M
总结
✅ Docker 基础 :镜像、容器、仓库
✅ 镜像最佳实践 :基础镜像选择、优化原则
✅ Dockerfile 优化 :多阶段构建、安全配置
✅ 容器编排 :Docker Compose
✅ 生产实践:安全、日志、健康检查
下篇预告 :Service Mesh (Istio) 入门实战
作者 :刘~浪地球
系列 :云原生与容器(二)
更新时间:2026-04-14