一次构建,到处运行

第一步 拉取项目

从 GitLab 上将项目拉取下来
image.png

第二步 编译

然后用 Maven 进行打包
mvn clean deploy -Dmaven.test.skip=true
image.png
在打包的过程会从我的私有仓库 Nexus 上下载依赖并打包
image.png
image.png
以上显示表示打包完成

第三步 打包

将编译好的项目打成压缩包
image.png

第四步 构建镜像

用 Dockerfile 将项目构建成镜像
image.png
创建 Dockerfile 并将刚打包好的压缩文件上传
image.png
编辑 Dockerfile 内容如下:

  1. FROM tomcat:8.5.38
  2. RUN rm -fr /usr/local/tomcat/webapps/ROOT/*
  3. COPY my-shop-web-admin-1.0.0-SNAPSHOT.zip /usr/local/tomcat/webapps/ROOT/
  4. WORKDIR /usr/local/tomcat/webapps/ROOT
  5. RUN unzip my-shop-web-admin-1.0.0-SNAPSHOT.zip \
  6. && rm -fr my-shop-web-admin-1.0.0-SNAPSHOT.zip
  7. WORKDIR /usr/local/tomcat
  8. EXPOSE 8080

需要指定 tomcat 版本,2018 年,Java EE 改名为 Jakarta EE。这导致一些 JAR 包的包名也在之后的版本中进行了更改。这对本项目的影响是,Spring 本身是不含 Servlet、JSP 的 JAR 包的,但其依赖这些 JAR 包。如果在 Tomcat 服务器中部署的项目使用了 Spring,则这部分的 JAR 包将由 Tomcat 服务器来提供。而问题在于,Spring 5.2.9.RELEASE 期望的 JAR 包前缀是 javax,而Tomcat 10.0.0 提供的 JAR 包前缀是 jakarta。因此,Spring 报了一个认为没有 Servlet、JSP 的 JAR 包的错。

开始构建镜像
# docker build -t myshop-admin .
构建成功
image.png
image.png

第五步 构建容器

编辑 docker-compose.yml 文件

  1. version: '3.1'
  2. services:
  3. myshop-admin:
  4. image: myshop-admin
  5. container_name: myshop-admin
  6. ports:
  7. - 8085:8080

启动容器:
# docker-compose up -d
容器已启动
image.png
测试访问:
image.png

第六步 镜像上传私服

将镜像上传到 docker 的 harbor 私有仓库
标记:docker tag myshop-admin 192.168.3.202/myshop/admin
image.png
推送:docker push 192.168.3.202/myshop/admin

  1. [root@brettwu ~]# docker push 192.168.3.202/myshop/admin
  2. Using default tag: latest
  3. The push refers to repository [192.168.3.202/myshop/admin]
  4. f4312d8a68c3: Pushed
  5. 4f8707d41def: Pushed
  6. eb134ba0baa3: Pushed
  7. ee934a1cf131: Pushed
  8. 524e7c6c8f81: Pushed
  9. 35e1fbb194d7: Pushed
  10. 2489d7a0e827: Pushed
  11. b234086ec9dd: Pushed
  12. af2a4009a54d: Pushed
  13. 1908d3f22285: Pushed
  14. 2fe266fe1ee6: Pushed
  15. 12cb127eee44: Pushed
  16. 604829a174eb: Pushed
  17. fbb641a8b943: Pushed
  18. latest: digest: sha256:dc02dbd996e6adcd8fe2e2e9b5d33386805b0721234f6acbc2319612310086b7 size: 3257

推送完成后可以在仓库中看到
image.png
image.png
复制拉取命令,这就可以在其他服务器上拉取镜像部署容器了
image.png
前提是拉取镜像的服务器要配置 harbor 的客户端 “insecure-registries”: [ “192.168.3.202”]
# vim /etc/docker/daemon.json

  1. {
  2. "registry-mirrors": ["https://pixarvda.mirror.aliyuncs.com"],
  3. "insecure-registries": [ "192.168.3.202"]
  4. }

拉取镜像:docker pull 192.168.3.202/myshop/admin:latest
拉取的时候会提示需要登录,先登录再拉取
# docker login 192.168.3.202 - u admin -p Harbor12345
至此,一次构建,到处运行的步骤就完成了,后续还要优化 harbor 免登录进行推送和拉取操作