云原生与容器--Docker 容器化最佳实践

系列导读:本篇将深入讲解 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

相关推荐
老卢聊运维2 小时前
CoreDNS配置详解:forward、cache、rewrite插件最佳实践指南
运维·云原生·kubernetes
蓝天白云下遛狗2 小时前
关于多网卡情况下docker内部网络通讯研究
运维·docker·容器
倔强的胖蚂蚁2 小时前
Google 开源大模型 Gemma4 是「深夜炸厂」
云原生·开源
富士康质检员张全蛋2 小时前
安装完成Docker之后配置修改相关的内核参数
docker·容器
虞十三2 小时前
AtomGit 开源入门全攻略:环境搭建 + Git/Docker 实操 + 新手避坑(全平台版)
git·docker·容器
李李李li2 小时前
linux x86 离线安装docker 27.5.0
linux·docker·eureka
ljp11122 小时前
飞牛安装jellyfin实现j3455真正的硬件解码
docker·jellyfin·j3455·4k硬解
姚不倒3 小时前
构建高可用可观测性平台:VictoriaMetrics 集群 + VictoriaLogs 统一接入实践
运维·docker·微服务·云原生·架构
KubeSphere 云原生3 小时前
云原生周刊:Kubernetes v1.36 前瞻
云原生·容器·kubernetes