1. Docker 镜像与容器基础操作解析
1.1 镜像导入导出实战
Docker镜像的导入导出是开发者在不同环境间迁移应用的基础技能。使用docker save和docker load命令可以实现镜像的离线传输,这在没有网络连接或需要批量部署的场景特别有用。
实际操作示例:
# 导出镜像到tar文件 docker save -o my_springboot_app.tar myregistry/springboot-app:1.0 # 导入镜像文件 docker load -i my_springboot_app.tar重要提示:导出镜像时会包含其所有历史层,因此文件体积较大。对于生产环境,建议优先使用镜像仓库进行分发。
1.2 容器导出与导入技巧
与镜像不同,容器导出使用docker export命令,这会生成一个扁平化的文件系统快照:
# 导出运行中的容器 docker export -o my_container.tar container_id # 从tar文件创建新镜像 cat my_container.tar | docker import - my_new_image:latest关键区别:
- 导出容器不包含元数据、卷或网络配置
- 适合需要精简部署的场景
- 导入后会生成新镜像,需要重新配置启动参数
2. 容器网络互联方案
2.1 默认网络模式分析
Docker提供多种网络驱动:
- bridge:默认模式,通过docker0虚拟网桥通信
- host:直接使用宿主机网络栈
- none:完全隔离的网络环境
- overlay:支持跨主机通信
查看网络配置:
docker network ls docker inspect network_name2.2 自定义网络实践
创建自定义bridge网络能获得更好的隔离性和DNS自动发现功能:
docker network create --driver bridge my_network docker run -d --network=my_network --name service1 my_image docker run -d --network=my_network --name service2 my_image此时service2可以直接通过主机名service1访问第一个容器,无需知道其IP地址。
3. SpringBoot微服务容器化
3.1 多阶段构建优化
典型的多阶段Dockerfile示例:
# 构建阶段 FROM maven:3.8.6-jdk-11 AS builder WORKDIR /app COPY pom.xml . RUN mvn dependency:go-offline COPY src ./src RUN mvn package -DskipTests # 运行阶段 FROM openjdk:11-jre-slim WORKDIR /app COPY --from=builder /app/target/*.jar app.jar EXPOSE 8080 ENTRYPOINT ["java","-jar","app.jar"]构建命令:
docker build -t springboot-app .3.2 生产环境配置要点
- 内存限制:
docker run -m 512m --memory-swap=1g my_image- 健康检查:
HEALTHCHECK --interval=30s --timeout=3s \ CMD curl -f http://localhost:8080/actuator/health || exit 1- 日志管理:
docker run --log-driver=json-file --log-opt max-size=10m my_image4. 常见问题排查指南
4.1 容器启动失败分析
典型错误排查流程:
- 查看容器日志:
docker logs container_id- 检查退出代码:
docker inspect -f '{{.State.ExitCode}}' container_id- 交互式调试:
docker run -it --entrypoint=/bin/sh my_image4.2 网络连接问题
诊断步骤:
- 检查容器网络配置:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_id- 测试容器间连通性:
docker exec -it container1 ping container2- 验证端口映射:
docker port container_id netstat -tulnp | grep docker5. 性能优化实践
5.1 镜像瘦身技巧
- 使用Alpine基础镜像:
FROM openjdk:11-jre-slim- 清理构建缓存:
RUN apt-get update && \ apt-get install -y build-essential && \ # 安装依赖... apt-get remove -y build-essential && \ apt-get autoremove -y && \ rm -rf /var/lib/apt/lists/*- 合并RUN指令减少层数
5.2 JVM调优参数
典型Java容器启动参数:
docker run -e JAVA_OPTS="-XX:+UseContainerSupport -XX:MaxRAMPercentage=75.0" my_image关键参数说明:
UseContainerSupport:启用容器内存感知MaxRAMPercentage:限制堆内存占比-XX:+ExitOnOutOfMemoryError:OOM时立即退出
6. 安全最佳实践
6.1 最小权限原则
- 使用非root用户运行:
RUN adduser -D myuser USER myuser- 只读文件系统:
docker run --read-only my_image- 能力限制:
docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE my_image6.2 镜像扫描策略
- 使用Trivy扫描:
trivy image my_image- 检查依赖漏洞:
docker scout quickview my_image- 定期更新基础镜像
7. 微服务编排进阶
7.1 Docker Compose实战
典型docker-compose.yml:
version: '3.8' services: app: image: springboot-app ports: - "8080:8080" environment: - SPRING_PROFILES_ACTIVE=prod depends_on: - redis redis: image: redis:alpine volumes: - redis_data:/data volumes: redis_data:启动命令:
docker-compose up -d7.2 服务发现集成
Spring Cloud与Docker网络集成配置:
eureka.client.serviceUrl.defaultZone=http://eureka:8761/eureka/ spring.cloud.consul.host=consul对应的Docker网络配置:
docker network create service_net docker run -d --network=service_net --name=eureka eureka-server docker run -d --network=service_net --name=my_service my_image8. 监控与日志方案
8.1 Prometheus监控配置
- 添加Actuator依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>- 暴露metrics端点:
management.endpoints.web.exposure.include=health,metrics,prometheus management.metrics.export.prometheus.enabled=true- Docker配置:
services: prometheus: image: prom/prometheus ports: - "9090:9090" volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml8.2 集中式日志收集
ELK栈配置示例:
services: app: logging: driver: "json-file" options: max-size: "10m" max-file: "3" logstash: image: docker.elastic.co/logstash/logstash:7.17.0 volumes: - ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf对应的logstash.conf:
input { gelf { port => 12201 } } output { elasticsearch { hosts => ["elasticsearch:9200"] } }9. CI/CD流水线集成
9.1 GitHub Actions自动化
示例workflow.yml:
name: Build and Push on: [push] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Login to Docker Hub uses: docker/login-action@v2 with: username: ${{ secrets.DOCKER_HUB_USERNAME }} password: ${{ secrets.DOCKER_HUB_TOKEN }} - name: Build and push uses: docker/build-push-action@v3 with: context: . push: true tags: user/app:latest9.2 镜像版本策略
推荐标签方案:
latest:最新稳定版v1.0.0:语义化版本git-commit-id:精确对应代码版本build-date:带时间戳的版本
构建多标签镜像:
docker build -t myapp:1.0.0 -t myapp:latest . docker push myapp:1.0.0 docker push myapp:latest10. 生产环境部署方案
10.1 滚动更新策略
Kubernetes部署示例:
apiVersion: apps/v1 kind: Deployment metadata: name: springboot-app spec: replicas: 3 strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 maxUnavailable: 0 template: spec: containers: - name: app image: myrepo/springboot-app:1.1.0 readinessProbe: httpGet: path: /actuator/health port: 808010.2 蓝绿部署实现
通过Docker标签切换流量:
# 部署新版本 docker-compose -f docker-compose-green.yml up -d # 测试验证 curl http://localhost:8081/actuator/health # 切换流量 docker service update --image myapp:green app_service对应的Nginx配置:
upstream backend { server green_app:8080; server blue_app:8080 backup; }11. 存储与数据管理
11.1 卷挂载最佳实践
数据库容器示例:
docker run -d \ --name mysql \ -v mysql_data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=secret \ mysql:5.7查看卷信息:
docker volume inspect mysql_data11.2 配置文件管理
使用configMap的典型方案:
# 创建配置 docker config create my_config config.properties # 运行服务 docker service create \ --name my_service \ --config source=my_config,target=/app/config.properties \ my_imageSpringBoot外部化配置:
spring.config.import=optional:file:/app/config.properties[.yml]12. 跨平台构建技巧
12.1 多架构镜像构建
使用buildx创建跨平台镜像:
docker buildx create --use docker buildx build --platform linux/amd64,linux/arm64 -t myapp:multi-arch .12.2 Windows容器注意事项
SpringBoot在Windows容器的特殊配置:
# 使用Windows基础镜像 FROM mcr.microsoft.com/openjdk:11-windowsservercore # 设置健康检查(Windows版) HEALTHCHECK --interval=30s --timeout=3s \ CMD powershell -command \ try { \ $response = Invoke-WebRequest http://localhost:8080/actuator/health -UseBasicParsing; \ if ($response.StatusCode -eq 200) { return 0} \ else {return 1}; \ } catch { return 1 }13. 微服务调试技巧
13.1 远程调试配置
启动Java容器启用调试:
docker run -p 8080:8080 -p 5005:5005 \ -e JAVA_TOOL_OPTIONS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005" \ my_imageIntelliJ连接配置:
- 创建Remote JVM Debug配置
- 设置端口5005
- 确保防火墙允许该端口
13.2 实时日志追踪
同时监控多个服务日志:
docker-compose logs -f --tail=100 service1 service2高级过滤:
docker logs --since 10m container_id | grep "ERROR"14. 资源限制与调优
14.1 CPU限制策略
设置CPU份额和核心数:
docker run --cpus=1.5 --cpu-shares=512 my_image实时调整限制:
docker update --cpus=2 container_id14.2 内存优化方案
JVM容器内存感知配置:
docker run -m 1g \ -e JAVA_OPTS="-XX:+UseContainerSupport -XX:MaxRAMPercentage=70" \ my_image监控内存使用:
docker stats container_id15. 企业级实践总结
15.1 镜像仓库管理
搭建私有Registry:
docker run -d -p 5000:5000 --restart=always --name registry \ -v registry_data:/var/lib/registry \ registry:2推送镜像到私有仓库:
docker tag my_image localhost:5000/my_image docker push localhost:5000/my_image15.2 安全扫描集成
在CI中加入扫描步骤:
- name: Scan image uses: aquasecurity/trivy-action@master with: image-ref: my_image exit-code: '1' severity: 'HIGH,CRITICAL'处理扫描结果:
trivy image --severity HIGH,CRITICAL my_image