项目
博客
文档
归档
资源链接
关于我
项目
博客
文档
归档
资源链接
关于我
42| 容器化部署Docker镜像打包&私有镜像仓和自动化构建脚本编写
2024-09-19
·
·
原创
·
·
本文共 1,062个字,预计阅读需要 4分钟。
### 微服务Docker打包插件介绍和配置实战 * 微服务采用容器化部署->本地推送镜像到镜像仓库->Paas容器云管理平台拉取部署 * SpringBoot打包插件配置 * 聚合工程pom添加全局变量 ```xml
nla-cloud
``` * 每个微服务都添加依赖(服务名记得修改) ```xml
alibaba-cloud-coupon
org.springframework.boot
spring-boot-maven-plugin
repackage
true
true
com.spotify
dockerfile-maven-plugin
1.4.10
${docker.image.prefix}/${project.artifactId}
target/${project.build.finalName}.jar
``` ### Dockerfile配置文件编写和镜像仓库过大优化思路 * 微服务Dockerfile编写 ```dockerfile FROM adoptopenjdk/openjdk11:ubi VOLUME /tmp ARG JAR_FILE COPY ${JAR_FILE} app.jar ENTRYPOINT ["java","-jar","/app.jar"] ``` * docker镜像过大怎么办? ```shell # 当下主流互联网公司,基本都是容器化部署微服务项目,但是存在一个比较多的问题是 # 每个微服务打包后的镜像特别大,虽然不影响业务,但是特别消耗内存,浪费资源。 # 使用docker前:一个springboot项目基本100M以下。 # 使用docker后:一个springboot项目的镜像就翻了好几倍 # 云服务器就很容易内存溢出导致成本过大 # 你知道哪些方式可以优化这个镜像打包过大的问题? ``` * 常见的优化思路,还有更多大家一起讨论 ```shell # 1、串联 Dockerfile 指令 # 在 Dockerfile 中, 每一条指令都会创建一个镜像层,会增加整体镜像的大小。 # 合并多个指令串起来执行,Dockerfile 中的 RUN 指令通过 && 和 /支持将命令串联在一起,可以省不少镜像层 # 2、选用更小的基础镜像,比如运行spring cloud项目,不必用jdk,直接选用jre镜像即可, # 可以节省50%的内存甚至更多 ``` * 优化后的Dockerfile ```dockerfile #FROM adoptopenjdk/openjdk11:ubi FROM adoptopenjdk/openjdk11:jre11u-nightly VOLUME /tmp ARG JAR_FILE COPY ${JAR_FILE} app.jar ENTRYPOINT ["java","-jar","/app.jar"] ``` ### 多个微服务Docker镜像打包实战和注意事项 * 多个微服务本地镜像打包。如果本地是windows没有安装docker,可以放到服务器安装docker/maven/jdk进行操作 * 步骤一:最外层 mvn clean install * 步骤二:去到子模块pom文件下(在cmd下执行,在idea/PowerShell中会报错),本地要安装docker ```shell mvn install -Dmaven.test.skip=true dockerfile:build ``` * 问题点:如果发现运行的镜像不是最新的 * 项目的路径一定不要有中文和空格 * 建议mvn clean install 构建下项目, * 再把本地历史docker镜像删除,再重新构建打包镜像 在CentOs服务器上删除原有的JDK,在安装新的JDK: ```shell # 查询java安装路径: 此时返回路径:/usr/bin/java`,该路径为软连接路径 which java # 查询真实: 返回: /usr/bin/java -> /etc/alternatives/java ls -l /usr/bin/java # 继续查询:此时返回真实路径:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-1.el7.x86_64/jre/bin/java` ls -l /etc/alternatives/java # 确定安装的jdk: sudo yum list installed | grep java # 返回:java-1.7/8.0-openjdk-headless.x86_64,依次删除 sudo yum remove java-1.8.0-openjdk sudo yum remove java-1.8.0-openjdk-headless.x86_64 sudo yum remove java-1.7.0-openjdk-headless.x86_64 # 安装新的jdk yum install java-11-openjdk # 查询安装版本 java -version ``` ### 多个微服务镜像本地运行和问题修复重新打包 * 本地运行docker镜像 ```dockerfile docker run --name xdclass-coupon -d -p 9002:9002 镜像id ``` * 查看容器运行日志 ```dockerfile docker logs -f 容器id ``` ### 容器化部署必备Docker公有+阿里云私有镜像仓库 - 为啥要用镜像仓库 - 官方公共镜像仓库和私有镜像仓库(画图) - 公共镜像仓库: - 官方:https://hub.docker.com/,基于各个软件开发或者有软件提供商开发的 - 非官方:其他组织或者公司开发的镜像,供大家免费试用 - 私有镜像仓库: - 用于存放公司内部的镜像,不提供给外部试用; - 开通阿里云私有镜像仓库 - 登录阿里云账号访问地址: - https://cr.console.aliyun.com/ - 初次使用会提示开通 - 设置固定访问密码: 概览 -> 新手指引 (访问凭证) -> 设置固定密码,用户名为阿里云账号 - `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/`,选择本地仓库 * https://cr.console.aliyun.com/ * 微服镜像推送私有镜像仓测试 * 先要登录: `docker login --username=用户名 registry.cn-hangzhou.aliyuncs.com` * 打tag + 推送 ```dockerfile #方式一 docker tag 1473a42a5d37 registry.cn-hangzhou.aliyuncs.com/nla-cloud/nla-gateway:v1 docker push registry.cn-hangzhou.aliyuncs.com/nla-cloud/nla-gateway:v1 #方式二 docker tag nla-cloud/nla-gateway:latest registry.cn-hangzhou.aliyuncs.com/nla-cloud/nla-gateway:v2 docker push registry.cn-hangzhou.aliyuncs.com/nla-cloud/nla-gateway:v2 ``` * 全部微服务推送 ```dockerfile # 网关 docker tag nla-cloud/nla-gateway:latest registry.cn-hangzhou.aliyuncs.com/nla-cloud/nla-gateway:v1.1 docker push registry.cn-hangzhou.aliyuncs.com/nla-cloud/nla-gateway:v1.1 #订单 docker tag nla-cloud/nla-order-service:latest registry.cn-hangzhou.aliyuncs.com/nla-cloud/nla-order-service:v1.1 docker push registry.cn-hangzhou.aliyuncs.com/nla-cloud/nla-order-service:v1.1 #商品 docker tag nla-cloud/nla-product-service:latest registry.cn-hangzhou.aliyuncs.com/nla-cloud/nla-product-service:v1.1 docker push registry.cn-hangzhou.aliyuncs.com/nla-cloud/nla-product-service:v1.1 #用户 docker tag nla-cloud/nla-user-service:latest registry.cn-hangzhou.aliyuncs.com/nla-cloud/nla-user-service:v1.1 docker push registry.cn-hangzhou.aliyuncs.com/nla-cloud/nla-user-service:v1.1 #优惠券 docker tag nla-cloud/nla-coupon-service:latest registry.cn-hangzhou.aliyuncs.com/nla-cloud/nla-coupon-service:v1.1 docker push registry.cn-hangzhou.aliyuncs.com/nla-cloud/nla-coupon-service:v1.1 ``` ### 自动化构建微服务推送阿里云镜像仓shell脚本开发 * 常见的自动化构建工具 * Jenkins * gitlab runner * shell脚本 * 编写shell脚本自动化构建推送镜像仓(`./docker/push.sh`) ```shell #登录阿里云镜像仓 docker login --username=用户名 registry.cn-hangzhou.aliyuncs.com --password=xxx #构建整个项目,或者单独构建common项目,避免依赖未被构建上去 cd ../nla-common mvn install #构建网关 cd ../nla-gateway mvn install -Dmaven.test.skip=true dockerfile:build docker tag nla-cloud/nla-gateway:latest registry.cn-hangzhou.aliyuncs.com/nla-cloud/nla-gateway:v1.2 docker push registry.cn-hangzhou.aliyuncs.com/nla-cloud/nla-gateway:v1.2 echo "网关构建推送成功" #用户服务 cd ../nla-user-service mvn install -Dmaven.test.skip=true dockerfile:build docker tag nla-cloud/nla-user-service:latest registry.cn-hangzhou.aliyuncs.com/nla-cloud/nla-user-service:v1.2 docker push registry.cn-hangzhou.aliyuncs.com/nla-cloud/nla-user-service:v1.2 echo "用户服务构建推送成功" #商品服务 cd ../nla-product-service mvn install -Dmaven.test.skip=true dockerfile:build docker tag nla-cloud/nla-product-service:latest registry.cn-hangzhou.aliyuncs.com/nla-cloud/nla-product-service:v1.2 docker push registry.cn-hangzhou.aliyuncs.com/nla-cloud/nla-product-service:v1.2 echo "商品服务构建推送成功" #订单服务 cd ../nla-order-service mvn install -Dmaven.test.skip=true dockerfile:build docker tag nla-cloud/nla-order-service:latest registry.cn-hangzhou.aliyuncs.com/nla-cloud/nla-order-service:v1.2 docker push registry.cn-hangzhou.aliyuncs.com/nla-cloud/nla-order-service:v1.2 echo "订单服务构建推送成功" #优惠券服务 cd ../nla-coupon-service mvn install -Dmaven.test.skip=true dockerfile:build docker tag nla-cloud/nla-coupon-service:latest registry.cn-hangzhou.aliyuncs.com/nla-cloud/nla-coupon-service:v1.2 docker push registry.cn-hangzhou.aliyuncs.com/nla-cloud/nla-coupon-service:v1.2 echo "优惠券服务构建推送成功" echo "=======构建脚本执行完毕=====" ``` * 核心关键 * shell脚本编写能力 * 作业 * 通过传参构建指定微服务(推荐大家完成) * 版本号 通过 年-月-日-时-分 v-2021-10-10-13-12