Docker 实战:从容器化到编排部署


文档摘要

Docker 实战:从容器化到编排部署 Docker 核心概念 镜像(Image) 只读模板,包含应用运行所需的一切。 容器(Container) 镜像的运行实例,隔离的运行环境。 仓库(Registry) 存储和分发镜像的服务(Docker Hub, 私有仓库)。 基础操作 镜像管理 容器管理 Dockerfile 最佳实践 多阶段构建 层缓存优化 安全最佳实践 Docker Compose 多容器编排 常用命令 网络与存储 网络模式 bridge:默认隔离网络 host:使用宿主机网络 overlay:跨主机通信(Swarm/K8s) none:无网络 持久化存储 性能优化 镜像瘦身 使用 alpine 基础镜像 多阶段构建 清理不必要的文件 合并 RUN 指令 资源限制 日志管理

Docker 实战:从容器化到编排部署

Docker 核心概念

镜像(Image)

只读模板,包含应用运行所需的一切。

容器(Container)

镜像的运行实例,隔离的运行环境。

仓库(Registry)

存储和分发镜像的服务(Docker Hub, 私有仓库)。

基础操作

1. 镜像管理

# 拉取镜像 docker pull nginx:latest # 查看本地镜像 docker images # 构建镜像 docker build -t myapp:1.0 . # 推送镜像 docker push myrepo/myapp:1.0

2. 容器管理

# 运行容器 docker run -d -p 8080:80 --name web nginx # 查看运行容器 docker ps # 查看容器日志 docker logs -f web # 进入容器 docker exec -it web bash # 停止容器 docker stop web # 删除容器 docker rm web

Dockerfile 最佳实践

1. 多阶段构建

# 构建阶段 FROM maven:3.9-openjdk-21 AS builder WORKDIR /app COPY pom.xml . COPY src ./src RUN mvn clean package # 运行阶段 FROM openjdk:21-slim WORKDIR /app COPY --from=builder /app/target/*.jar app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "app.jar"]

2. 层缓存优化

# 先复制依赖,利用缓存 COPY pom.xml . RUN mvn dependency:go-offline # 再复制源码 COPY src ./src RUN mvn clean package

3. 安全最佳实践

# 使用非 root 用户 FROM openjdk:21-slim RUN groupadd -r appuser && useradd -r -g appuser appuser USER appuser # 最小化镜像 FROM alpine:3.19 # 扫描漏洞 RUN trivy image --severity HIGH,CRITICAL myapp:1.0

Docker Compose

多容器编排

version: '3.8' services: web: image: nginx:alpine ports: - "80:80" volumes: - ./html:/usr/share/nginx/html depends_on: - api api: build: ./api ports: - "8080:8080" environment: - SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/mydb depends_on: - db db: image: postgres:16-alpine volumes: - db-data:/var/lib/postgresql/data environment: - POSTGRES_DB=mydb - POSTGRES_PASSWORD=secret volumes: db-data:

常用命令

# 启动所有服务 docker-compose up -d # 查看服务状态 docker-compose ps # 查看服务日志 docker-compose logs -f api # 停止所有服务 docker-compose down # 重启服务 docker-compose restart api

网络与存储

网络模式

  • bridge:默认隔离网络
  • host:使用宿主机网络
  • overlay:跨主机通信(Swarm/K8s)
  • none:无网络
# 创建自定义网络 docker network create myapp-net # 连接容器到网络 docker network connect myapp-net web

持久化存储

# 数据卷 docker volume create mydata docker run -v mydata:/data nginx # 绑定挂载 docker run -v /host/path:/container/path nginx

性能优化

1. 镜像瘦身

  • 使用 alpine 基础镜像
  • 多阶段构建
  • 清理不必要的文件
  • 合并 RUN 指令

2. 资源限制

# 限制内存和 CPU docker run -m 512m --cpus="1.5" nginx

3. 日志管理

# docker-compose.yaml services: api: logging: driver: "json-file" options: max-size: "10m" max-file: "3"

安全加固

1. 镜像扫描

# 使用 Trivy 扫描漏洞 trivy image myapp:1.0 # 使用 Docker Scout docker scout quickview myapp:1.0 docker scout cves myapp:1.0

2. 运行时安全

# 只读根文件系统 docker run --read-only nginx # 丢弃特权 docker run --security-opt=no-new-privileges nginx # 用户命名空间隔离 docker run --userns-remap=default nginx

容器编排:Kubernetes 入门

Pod 基础

apiVersion: v1 kind: Pod metadata: name: web-pod spec: containers: - name: nginx image: nginx:1.25 ports: - containerPort: 80 resources: requests: memory: "64Mi" cpu: "250m" limits: memory: "128Mi" cpu: "500m"

Deployment

apiVersion: apps/v1 kind: Deployment metadata: name: web-deployment spec: replicas: 3 selector: matchLabels: app: web template: metadata: labels: app: web spec: containers: - name: nginx image: nginx:1.25 ports: - containerPort: 80

Service

apiVersion: v1 kind: Service metadata: name: web-service spec: selector: app: web ports: - port: 80 targetPort: 80 type: LoadBalancer

最佳实践总结

  1. 镜像优化:多阶段构建、层缓存、最小化镜像
  2. 安全第一:定期扫描、非 root 用户、只读文件系统
  3. 资源管理:设置 limits、监控资源使用
  4. 日志管理:集中收集、定期清理
  5. CI/CD 集成:自动化构建、测试、部署

总结

Docker 简化了应用部署,提高了开发效率。掌握 Docker 是现代云原生开发的基础,建议从简单应用开始实践,逐步深入 Kubernetes 编排。


发布者: 作者: 转发
评论区 (0)
U