微服务Docker打包插件介绍和配置实战
微服务采用容器化部署->本地推送镜像到镜像仓库->Paas容器云管理平台拉取部署
SpringBoot打包插件配置
- 聚合工程pom添加全局变量
<docker.image.prefix>nla-cloud</docker.image.prefix>
- 每个微服务都添加依赖(服务名记得修改)
<build>
<finalName>alibaba-cloud-coupon</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<!--需要加这个,不然打包镜像找不到启动文件-->
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<configuration>
<fork>true</fork>
<addResources>true</addResources>
</configuration>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.4.10</version>
<configuration>
<repository>${docker.image.prefix}/${project.artifactId}</repository>
<buildArgs>
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
</plugins>
</build>
Dockerfile配置文件编写和镜像仓库过大优化思路
- 微服务Dockerfile编写
FROM adoptopenjdk/openjdk11:ubi
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
- docker镜像过大怎么办?
# 当下主流互联网公司,基本都是容器化部署微服务项目,但是存在一个比较多的问题是
# 每个微服务打包后的镜像特别大,虽然不影响业务,但是特别消耗内存,浪费资源。
# 使用docker前:一个springboot项目基本100M以下。
# 使用docker后:一个springboot项目的镜像就翻了好几倍
# 云服务器就很容易内存溢出导致成本过大
# 你知道哪些方式可以优化这个镜像打包过大的问题?
- 常见的优化思路,还有更多大家一起讨论
# 1、串联 Dockerfile 指令
# 在 Dockerfile 中, 每一条指令都会创建一个镜像层,会增加整体镜像的大小。
# 合并多个指令串起来执行,Dockerfile 中的 RUN 指令通过 && 和 /支持将命令串联在一起,可以省不少镜像层
# 2、选用更小的基础镜像,比如运行spring cloud项目,不必用jdk,直接选用jre镜像即可,
# 可以节省50%的内存甚至更多
- 优化后的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
mvn install -Dmaven.test.skip=true dockerfile:build
问题点:如果发现运行的镜像不是最新的
- 项目的路径一定不要有中文和空格
- 建议mvn clean install 构建下项目,
- 再把本地历史docker镜像删除,再重新构建打包镜像
在CentOs服务器上删除原有的JDK,在安装新的JDK:
# 查询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镜像
docker run --name xdclass-coupon -d -p 9002:9002 镜像id
- 查看容器运行日志
docker logs -f 容器id
容器化部署必备Docker公有+阿里云私有镜像仓库
- 为啥要用镜像仓库
- 官方公共镜像仓库和私有镜像仓库(画图)
- 公共镜像仓库:
- 官方:https://hub.docker.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/
,选择本地仓库 - 微服镜像推送私有镜像仓测试
- 先要登录:
docker login --username=用户名 registry.cn-hangzhou.aliyuncs.com
- 打tag + 推送
#方式一
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
- 全部微服务推送
# 网关
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
)
#登录阿里云镜像仓
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