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 --networkmy_network --name service1 my_image docker run -d --networkmy_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 --frombuilder /app/target/*.jar app.jar EXPOSE 8080 ENTRYPOINT [java,-jar,app.jar]构建命令docker build -t springboot-app .3.2 生产环境配置要点内存限制docker run -m 512m --memory-swap1g my_image健康检查HEALTHCHECK --interval30s --timeout3s \ CMD curl -f http://localhost:8080/actuator/health || exit 1日志管理docker run --log-driverjson-file --log-opt max-size10m 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:MaxRAMPercentage75.0 my_image关键参数说明UseContainerSupport启用容器内存感知MaxRAMPercentage限制堆内存占比-XX:ExitOnOutOfMemoryErrorOOM时立即退出6. 安全最佳实践6.1 最小权限原则使用非root用户运行RUN adduser -D myuser USER myuser只读文件系统docker run --read-only my_image能力限制docker run --cap-dropALL --cap-addNET_BIND_SERVICE my_image6.2 镜像扫描策略使用Trivy扫描trivy image my_image检查依赖漏洞docker scout quickview my_image定期更新基础镜像7. 微服务编排进阶7.1 Docker Compose实战典型docker-compose.ymlversion: 3.8 services: app: image: springboot-app ports: - 8080:8080 environment: - SPRING_PROFILES_ACTIVEprod 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.defaultZonehttp://eureka:8761/eureka/ spring.cloud.consul.hostconsul对应的Docker网络配置docker network create service_net docker run -d --networkservice_net --nameeureka eureka-server docker run -d --networkservice_net --namemy_service my_image8. 监控与日志方案8.1 Prometheus监控配置添加Actuator依赖dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-actuator/artifactId /dependency暴露metrics端点management.endpoints.web.exposure.includehealth,metrics,prometheus management.metrics.export.prometheus.enabledtrueDocker配置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.confinput { gelf { port 12201 } } output { elasticsearch { hosts [elasticsearch:9200] } }9. CI/CD流水线集成9.1 GitHub Actions自动化示例workflow.ymlname: Build and Push on: [push] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkoutv3 - name: Login to Docker Hub uses: docker/login-actionv2 with: username: ${{ secrets.DOCKER_HUB_USERNAME }} password: ${{ secrets.DOCKER_HUB_TOKEN }} - name: Build and push uses: docker/build-push-actionv3 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_PASSWORDsecret \ mysql:5.7查看卷信息docker volume inspect mysql_data11.2 配置文件管理使用configMap的典型方案# 创建配置 docker config create my_config config.properties # 运行服务 docker service create \ --name my_service \ --config sourcemy_config,target/app/config.properties \ my_imageSpringBoot外部化配置spring.config.importoptional: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 --interval30s --timeout3s \ 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:jdwptransportdt_socket,servery,suspendn,address*:5005 \ my_imageIntelliJ连接配置创建Remote JVM Debug配置设置端口5005确保防火墙允许该端口13.2 实时日志追踪同时监控多个服务日志docker-compose logs -f --tail100 service1 service2高级过滤docker logs --since 10m container_id | grep ERROR14. 资源限制与调优14.1 CPU限制策略设置CPU份额和核心数docker run --cpus1.5 --cpu-shares512 my_image实时调整限制docker update --cpus2 container_id14.2 内存优化方案JVM容器内存感知配置docker run -m 1g \ -e JAVA_OPTS-XX:UseContainerSupport -XX:MaxRAMPercentage70 \ my_image监控内存使用docker stats container_id15. 企业级实践总结15.1 镜像仓库管理搭建私有Registrydocker run -d -p 5000:5000 --restartalways --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-actionmaster with: image-ref: my_image exit-code: 1 severity: HIGH,CRITICAL处理扫描结果trivy image --severity HIGH,CRITICAL my_image