42| 容器化部署Docker镜像打包&私有镜像仓和自动化构建脚本编写

2024-09-19 · · 原创 · · 本文共 1,062个字,预计阅读需要 4分钟。

微服务Docker打包插件介绍和配置实战

  • 微服务采用容器化部署->本地推送镜像到镜像仓库->Paas容器云管理平台拉取部署

  • SpringBoot打包插件配置

    • 聚合工程pom添加全局变量
    1. <docker.image.prefix>nla-cloud</docker.image.prefix>
    • 每个微服务都添加依赖(服务名记得修改)
    1. <build>
    2. <finalName>alibaba-cloud-coupon</finalName>
    3. <plugins>
    4. <plugin>
    5. <groupId>org.springframework.boot</groupId>
    6. <artifactId>spring-boot-maven-plugin</artifactId>
    7. <!--需要加这个,不然打包镜像找不到启动文件-->
    8. <executions>
    9. <execution>
    10. <goals>
    11. <goal>repackage</goal>
    12. </goals>
    13. </execution>
    14. </executions>
    15. <configuration>
    16. <fork>true</fork>
    17. <addResources>true</addResources>
    18. </configuration>
    19. </plugin>
    20. <plugin>
    21. <groupId>com.spotify</groupId>
    22. <artifactId>dockerfile-maven-plugin</artifactId>
    23. <version>1.4.10</version>
    24. <configuration>
    25. <repository>${docker.image.prefix}/${project.artifactId}</repository>
    26. <buildArgs>
    27. <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
    28. </buildArgs>
    29. </configuration>
    30. </plugin>
    31. </plugins>
    32. </build>

Dockerfile配置文件编写和镜像仓库过大优化思路

  • 微服务Dockerfile编写
  1. FROM adoptopenjdk/openjdk11:ubi
  2. VOLUME /tmp
  3. ARG JAR_FILE
  4. COPY ${JAR_FILE} app.jar
  5. ENTRYPOINT ["java","-jar","/app.jar"]
  • docker镜像过大怎么办?
  1. # 当下主流互联网公司,基本都是容器化部署微服务项目,但是存在一个比较多的问题是
  2. # 每个微服务打包后的镜像特别大,虽然不影响业务,但是特别消耗内存,浪费资源。
  3. # 使用docker前:一个springboot项目基本100M以下。
  4. # 使用docker后:一个springboot项目的镜像就翻了好几倍
  5. # 云服务器就很容易内存溢出导致成本过大
  6. # 你知道哪些方式可以优化这个镜像打包过大的问题?
  • 常见的优化思路,还有更多大家一起讨论
  1. # 1、串联 Dockerfile 指令
  2. # 在 Dockerfile 中, 每一条指令都会创建一个镜像层,会增加整体镜像的大小。
  3. # 合并多个指令串起来执行,Dockerfile 中的 RUN 指令通过 && 和 /支持将命令串联在一起,可以省不少镜像层
  4. # 2、选用更小的基础镜像,比如运行spring cloud项目,不必用jdk,直接选用jre镜像即可,
  5. # 可以节省50%的内存甚至更多
  • 优化后的Dockerfile
  1. #FROM adoptopenjdk/openjdk11:ubi
  2. FROM adoptopenjdk/openjdk11:jre11u-nightly
  3. VOLUME /tmp
  4. ARG JAR_FILE
  5. COPY ${JAR_FILE} app.jar
  6. ENTRYPOINT ["java","-jar","/app.jar"]

多个微服务Docker镜像打包实战和注意事项

  • 多个微服务本地镜像打包。如果本地是windows没有安装docker,可以放到服务器安装docker/maven/jdk进行操作

    • 步骤一:最外层 mvn clean install
    • 步骤二:去到子模块pom文件下(在cmd下执行,在idea/PowerShell中会报错),本地要安装docker
    1. mvn install -Dmaven.test.skip=true dockerfile:build
  • 问题点:如果发现运行的镜像不是最新的

    • 项目的路径一定不要有中文和空格
    • 建议mvn clean install 构建下项目,
    • 再把本地历史docker镜像删除,再重新构建打包镜像

在CentOs服务器上删除原有的JDK,在安装新的JDK:

  1. # 查询java安装路径: 此时返回路径:/usr/bin/java`,该路径为软连接路径
  2. which java
  3. # 查询真实: 返回: /usr/bin/java -> /etc/alternatives/java
  4. ls -l /usr/bin/java
  5. # 继续查询:此时返回真实路径:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-1.el7.x86_64/jre/bin/java`
  6. ls -l /etc/alternatives/java
  7. # 确定安装的jdk:
  8. sudo yum list installed | grep java
  9. # 返回:java-1.7/8.0-openjdk-headless.x86_64,依次删除
  10. sudo yum remove java-1.8.0-openjdk
  11. sudo yum remove java-1.8.0-openjdk-headless.x86_64
  12. sudo yum remove java-1.7.0-openjdk-headless.x86_64
  13. # 安装新的jdk
  14. yum install java-11-openjdk
  15. # 查询安装版本
  16. java -version

多个微服务镜像本地运行和问题修复重新打包

  • 本地运行docker镜像
  1. docker run --name xdclass-coupon -d -p 9002:9002 镜像id
  • 查看容器运行日志
  1. docker logs -f 容器id

容器化部署必备Docker公有+阿里云私有镜像仓库

  • 为啥要用镜像仓库
  • 官方公共镜像仓库和私有镜像仓库(画图)
  • 开通阿里云私有镜像仓库
    • 登录阿里云账号访问地址:
    • 初次使用会提示开通
    • 设置固定访问密码: 概览 -> 新手指引 (访问凭证) -> 设置固定密码,用户名为阿里云账号
    • docker login --username=用户名 registry.cn-hangzhou.aliyuncs.com

本地Docker镜像推送阿里云私有镜像仓

  • 阿里云镜像仓-创建命名空间:nla-cloud、创建仓库 nla-gateway/nla-coupon-service/nla-order-service/nla-product-service/nla-user-service/,选择本地仓库
  • 微服镜像推送私有镜像仓测试
  • 先要登录: docker login --username=用户名 registry.cn-hangzhou.aliyuncs.com
  • 打tag + 推送
  1. #方式一
  2. docker tag 1473a42a5d37 registry.cn-hangzhou.aliyuncs.com/nla-cloud/nla-gateway:v1
  3. docker push registry.cn-hangzhou.aliyuncs.com/nla-cloud/nla-gateway:v1
  4. #方式二
  5. docker tag nla-cloud/nla-gateway:latest registry.cn-hangzhou.aliyuncs.com/nla-cloud/nla-gateway:v2
  6. docker push registry.cn-hangzhou.aliyuncs.com/nla-cloud/nla-gateway:v2
  • 全部微服务推送
  1. # 网关
  2. docker tag nla-cloud/nla-gateway:latest registry.cn-hangzhou.aliyuncs.com/nla-cloud/nla-gateway:v1.1
  3. docker push registry.cn-hangzhou.aliyuncs.com/nla-cloud/nla-gateway:v1.1
  4. #订单
  5. docker tag nla-cloud/nla-order-service:latest registry.cn-hangzhou.aliyuncs.com/nla-cloud/nla-order-service:v1.1
  6. docker push registry.cn-hangzhou.aliyuncs.com/nla-cloud/nla-order-service:v1.1
  7. #商品
  8. docker tag nla-cloud/nla-product-service:latest registry.cn-hangzhou.aliyuncs.com/nla-cloud/nla-product-service:v1.1
  9. docker push registry.cn-hangzhou.aliyuncs.com/nla-cloud/nla-product-service:v1.1
  10. #用户
  11. docker tag nla-cloud/nla-user-service:latest registry.cn-hangzhou.aliyuncs.com/nla-cloud/nla-user-service:v1.1
  12. docker push registry.cn-hangzhou.aliyuncs.com/nla-cloud/nla-user-service:v1.1
  13. #优惠券
  14. docker tag nla-cloud/nla-coupon-service:latest registry.cn-hangzhou.aliyuncs.com/nla-cloud/nla-coupon-service:v1.1
  15. docker push registry.cn-hangzhou.aliyuncs.com/nla-cloud/nla-coupon-service:v1.1

自动化构建微服务推送阿里云镜像仓shell脚本开发

  • 常见的自动化构建工具
    • Jenkins
    • gitlab runner
    • shell脚本
  • 编写shell脚本自动化构建推送镜像仓(./docker/push.sh)
  1. #登录阿里云镜像仓
  2. docker login --username=用户名 registry.cn-hangzhou.aliyuncs.com --password=xxx
  3. #构建整个项目,或者单独构建common项目,避免依赖未被构建上去
  4. cd ../nla-common
  5. mvn install
  6. #构建网关
  7. cd ../nla-gateway
  8. mvn install -Dmaven.test.skip=true dockerfile:build
  9. docker tag nla-cloud/nla-gateway:latest registry.cn-hangzhou.aliyuncs.com/nla-cloud/nla-gateway:v1.2
  10. docker push registry.cn-hangzhou.aliyuncs.com/nla-cloud/nla-gateway:v1.2
  11. echo "网关构建推送成功"
  12. #用户服务
  13. cd ../nla-user-service
  14. mvn install -Dmaven.test.skip=true dockerfile:build
  15. docker tag nla-cloud/nla-user-service:latest registry.cn-hangzhou.aliyuncs.com/nla-cloud/nla-user-service:v1.2
  16. docker push registry.cn-hangzhou.aliyuncs.com/nla-cloud/nla-user-service:v1.2
  17. echo "用户服务构建推送成功"
  18. #商品服务
  19. cd ../nla-product-service
  20. mvn install -Dmaven.test.skip=true dockerfile:build
  21. docker tag nla-cloud/nla-product-service:latest registry.cn-hangzhou.aliyuncs.com/nla-cloud/nla-product-service:v1.2
  22. docker push registry.cn-hangzhou.aliyuncs.com/nla-cloud/nla-product-service:v1.2
  23. echo "商品服务构建推送成功"
  24. #订单服务
  25. cd ../nla-order-service
  26. mvn install -Dmaven.test.skip=true dockerfile:build
  27. docker tag nla-cloud/nla-order-service:latest registry.cn-hangzhou.aliyuncs.com/nla-cloud/nla-order-service:v1.2
  28. docker push registry.cn-hangzhou.aliyuncs.com/nla-cloud/nla-order-service:v1.2
  29. echo "订单服务构建推送成功"
  30. #优惠券服务
  31. cd ../nla-coupon-service
  32. mvn install -Dmaven.test.skip=true dockerfile:build
  33. docker tag nla-cloud/nla-coupon-service:latest registry.cn-hangzhou.aliyuncs.com/nla-cloud/nla-coupon-service:v1.2
  34. docker push registry.cn-hangzhou.aliyuncs.com/nla-cloud/nla-coupon-service:v1.2
  35. echo "优惠券服务构建推送成功"
  36. echo "=======构建脚本执行完毕====="
  • 核心关键
    • shell脚本编写能力
    • 作业
      • 通过传参构建指定微服务(推荐大家完成)
      • 版本号 通过 年-月-日-时-分 v-2021-10-10-13-12