丝滑的打包部署,一套带走~ 深碍√TFBOYSˉ_ 2024-03-23 12:24 39阅读 0赞 **以下文章来源于悟空聊架构 ,作者悟空聊架构** 本文主要内容如下: ![3c3aae9d1b462c77e9c3690db728ffc5.png][] 目录 ### 一、背景 ### ![3f45685a484cb1d485af442720880a83.png][] Docker打包部署方案 项目背景:新项目的后端框架是刚起步,搭建的是一套微服务框架,基础服务有网关 Gateway, Nacos 注册中心,以及其他的微服务。现在需要弄个简单且方便的,基于 Docker 的部署方式。 为什么用 Docker:为了让后端程序更容易打包部署和管理,所以用上了 Docker 容器化部署。比如用 Docker Swarm 或 K8s 来管理多个容器。 为什么要提到 Windows:本地机器是 Windows 系统开发,通过 Windows + IDEA 将应用程序打成 Docker 镜像,然后拷贝到 `Linux` 服务器进行容器化部署。 * 疑问1:有同学可能会有疑问,Windows 还能跑 Docker 吗???那必须的! * 疑问2:如果项目的代码改了,是不是得重新打包 docker 镜像?不需要,直接替换 docker volume 里面的 JAR 包即可。 * 疑问3:怎么没有用 Jenkins?新项目,新项目,牛奶和面包都会有的。 ### 二、Windows 运行 Docker ### #### 2.1 原理 #### 为了在 Windows 能够打包 Docker 镜像,就必须弄个可以运行 Docker 的环境。 Docker 依赖于已存在并运行的 Linux 内核环境。实质上是在已经运行的 Linux 下制造了一个隔离的文件环境,因此它执行的效率几乎等同于所部署的 Linux 主机。 如果其他系统想部署 Docker 就必须安装一个虚拟 Linux 环境。 #### 2.2 启用 Hyper-V #### ![71a947f308931ee1d75f97426090c88f.png][] Windows+虚拟机+Docker Windows 自带的 Hyper-V 工具就是一款管理和创建虚拟机的工具,要求:Windows 10 企业版、专业版或教育版。启用 Hyper-V 如下所示: ![933330b25cb91f85b8ae7b6553bd229f.png][] 启用 Hyper-V 操作步骤:程序和功能->打开或关闭 Windows 功能->选择“Hyper-V”,然后单击“确定 参考链接: https://learn.microsoft.com/zh-cn/virtualization/hyper-v-on-windows/quick-start/enable-hyper-v #### 2.3 安装 Docker for Windows #### 点击 官网下载地址,并下载 Windows 的版本,安装就是一路点击 next 就好了。 官网下载地址:https://www.docker.com/products/docker-desktop/ 安装好之后,打开 Windows 的Powershell 命令行窗口,执行 docker run hello-world。当看到 Hello from Docker!就表示安装成功。 ![da80cbaa33a2fb81cfdd73aee5df4f85.png][] 好了,现在我们开发环境拥有了运行 docker 容器,打包 docker 镜像的能力。接下来我们来看下如何用 IDEA 开发工具来启动 docker 容器和打包镜像。 ### 三、IDEA 打包镜像 ### IDEA 工具很强大,提供 Docker 相关的功能。 IDEA 打包 Docker 镜像的方式主要分为这么几步: * 通过 Maven 工具将 SpringBoot 应用程序打成可执行的 JAR 包。 * IDEA 执行指定的 Dockerfile 打包成 Docker 镜像。 这里我写了一个简单 SpringBoot 项目,定义了一个简单的 Rest API 接口。 ![c0b381290a2cf1d9c60f49b0ec154691.png][] 应用程序的端口为 9600。 server.port=9600 #### **3.1 Maven Build JAR 包** #### Maven 打包的话这个我们都比较熟悉,直接执行 Maven 命令(mvn package)或者在 IDEA 上点击 Maven 相关按钮即可。就会生成这样一个包 operation-core-0.0.1-SNAPSHOT,我们可以把它的名字改短一点,就改为 operation.jar 吧 #### **3.2 编写 Dockerfile** #### Dockerfile 又是什么呢? 它是一个用来构建镜像的文本文件,文件内容就是一条条构建镜像所需的指令和说明。 我们就到项目创建两个 dockerfile 文件吧,一个用作开发环境的,一个用作生产环境的。 ![fa172968b24735252e4c2435b2d5c2b9.png][] 如下所示: # 拉取指定的镜像文件 FROM hub.c.163.com/library/java:latest # MAINTAINER 指令允许你给将要制作的镜像设置作者信息 MAINTAINER wukong <1@163.com> # 容器内创建一个 apps 目录,用来挂载 jar 包 RUN mkdir -p /apps # 将 passjavas-demo-1.0 jar 包复制到 /apps/passjava-demo.jar ADD passjava-demo-1.0.jar /apps/passjava-demo.jar # 设置时区 ENV TZ "Asia/Shanghai" # 设置暴露的端口 EXPOSE 9600 #dockerfile中增加健康检查,interval表示每个5分钟检查一次,timeout每次超过5秒钟认定为失败,retries失败后轮询3次认定为容器不健康,考虑重启。 #HEALTHCHECK --interval=60s --timeout=5s --retries=6 \ # CMD curl -f http://localhost:8989/health || exit 1 # 运行 Java 应用程序的命令 ENTRYPOINT ["java","-jar","/apps/passjava-demo.jar"] #### 3.3 配置和执行 Dockerfile #### 在 IDEA 里面创建一个 运行配置,添加一个 Dockerfile 配置,如下所示: ![8ec4b79bf52990114f1b72e6355ba1b0.png][] 开始运行这个配置后,IDEA 就会根据 dockerfile 里面的配置自动拉取 Java JDK 镜像文件,这个过程会比较长,Java JDK 还是比较大的。 拉取之后,会一步步执行 dockerfile 里面的命令,最后会启动一个 docker 容器。 ![eadab7c8a7c12cd6f09a96a6457d31b2.png][] #### 3.4 测试 #### 我们来测试下 Java 程序是否正常运行。还是用 curl 命令访问 Restful API。 curl http://localhost:9600/test ![84769f532ef721d9a2f869affe61305f.png][] 咦?居然访问不通,这是为啥?? 我们来排查下。先看下容器日志,执行命令 docker logs <容器id>,可以看到 Java 应用程序正常启动,也没有报错日志。 ![b8093df1a5b3d2df2a65221ee18583a0.png][] 那说明可能是网络问题,比如容器的端口和我们本机的端口没有映射。果不其然。这里端口是否没有映射的,如下图所示。 ![df3ad2a30afbd62230a5c6c2c115ba81.png][] 那说明通过这种方式虽然能正常启动程序,但是程序不能提供服务,那就换一种方式。上面的方式是通过 Dockerfile 创建了一个镜像文件,然后 IDEA 工具帮我们启动了一个 Docker 容器,但是这种容器还缺少一些参数,比如端口映射没有做。要不我们就自己来启动一个容器看看?自己启动就是通过 docker run 命令即可,不过也可以通过创建一个 IDEA container 配置来启动一个容器。 #### 3.5 IDEA 自定义容器 #### 如下图所示,自定义一个容器跑配置。因为上面的步骤我们已经创建了镜像了,所以可以直接用这个镜像即可。 ![7ec05e574b0002b5c7d72b96481a5129.png][] 话不多说,直接运行起来看下。 ![6db3f87027e9b53bb1976990da66d5d4.png][] 再来看下端口映射,这次就映射好了,完美! ![fb5e6735ad01d7d43d68eaf683ac4ead.png][] 再来测试下是否能访问 API。还是用 curl 命令,返回结果如下,这次就成功了。 passjava,悟空聊架构 ![2c5d7018fb7999642738429c5fbe1b1e.png][] ### 四、部署到服务器 ### #### 4.1 部署思路 #### 不过这都是在我们本地玩的,如何把它弄到服务器上呢??步骤如下: * 把镜像保存为一个压缩包,上传到服务器,服务器上用命令启动容器。 * 如果有代码修改,把项目重新打成 JAR 包上传到挂载的目录就可以了。 如下图,和文章最开始看到的图相比,做了一些简化,思路是一致的。 ![0adc6f4b0f8d7abc8aa1d9557c78e3fa.png][] #### **4.2 部署** #### 先在本地把 docker 镜像打成一个 tar 包。 docker save passjava-docker-demo-23.02 -o D:\passjava-demo.tar 然后把这个 tar 包拷贝到 Linux 服务器。 ![7672e4cf374c279648534fac0f288cc4.png][] 将镜像拷贝到服务器 接着将 tar 加载为 docker 镜像 docker load -i passjava-demo.tar ![008c29c9292a1c29ca61c9e8e13b2863.png][] passjava-demo镜像包 然后就可以通过命令来启动容器了。命令里面包含了挂载的目录卷,端口映射,启动方式等。 docker run --name passjava-demo -d \ -v /nfs-data/service:/nfs-data/service \ -v /nfs-data/service/apps:/apps \ -v /nfs-data/service/logs:/nfs-data/service/logs \ --restart=always \ -p 9600:9600 \ passjava-docker-demo-23.02 咦,启动容器又报错了,查看日志提示找不到 jar 包。 ![6f7b29dec68ad8a1210f7c97b2d81b2e.png][] 启动报错,找不到 jar 包 哦,想起来了,挂载上面的 apps 目录后,容器会从容器里面的 apps 目录找 JAR 包,发现没有这个 jar 包,当然报错了呀! ![83eac56a72b85efe39639002019d17b1.png][] 运行命令 而这个 apps 目录正好是和宿主服务器的 /nfs-data/service/apps 目录做了映射的,这个目录没有 jar 包,容器里面的 apps 目录也就没有 jar 包。所以我们可以把 jar 包拷贝到这个目录就好了。 ![2204bc90e038b042cfab3192f91290a0.png][] 等等,为什么用 IDEA 启动容器时没有问题?因为当时没有 IDEA 做目录的映射。 启动完成后,我们来测试下部署的服务是否正常。 ![661234f46b878e80b970dc0ba504e51f.png][] [3c3aae9d1b462c77e9c3690db728ffc5.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/23/890d79e6a554431696f72e01c6c55049.png [3f45685a484cb1d485af442720880a83.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/23/69d5a36c65014f50872e53b24436f1be.png [71a947f308931ee1d75f97426090c88f.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/23/10e5892a5e364278a0bc4509b824250f.png [933330b25cb91f85b8ae7b6553bd229f.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/23/43b8bdf7f78b48a89a7f1d7655f3bca6.png [da80cbaa33a2fb81cfdd73aee5df4f85.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/23/04064f2e44834f7d9279e84c8284e724.png [c0b381290a2cf1d9c60f49b0ec154691.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/23/359fa3d78e454f48b597f2c6268e532a.png [fa172968b24735252e4c2435b2d5c2b9.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/23/f0aabb695d774132ac9664c4b3e3cb20.png [8ec4b79bf52990114f1b72e6355ba1b0.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/23/9cb15fa77cc54fcfb0fccda0244af3ad.png [eadab7c8a7c12cd6f09a96a6457d31b2.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/23/2a582f2bfea84366a5979cd0dbe4fe9d.png [84769f532ef721d9a2f869affe61305f.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/23/aa7a6e4ca3a34af1b3bbe1b017514a63.png [b8093df1a5b3d2df2a65221ee18583a0.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/23/b6b4b0ccf95b4714a8d203fca9eb74e8.png [df3ad2a30afbd62230a5c6c2c115ba81.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/23/51c77f3a23494a0ca389c1bf542683bf.png [7ec05e574b0002b5c7d72b96481a5129.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/23/4e7aa76ebc514029a59ee39de41c5d13.png [6db3f87027e9b53bb1976990da66d5d4.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/23/6c8cefa2efb547bba8474916dce5b439.png [fb5e6735ad01d7d43d68eaf683ac4ead.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/23/c9927e52a5454d88b55b2420f23d513e.png [2c5d7018fb7999642738429c5fbe1b1e.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/23/7d4b8529fd5343c78ce97f38881343f7.png [0adc6f4b0f8d7abc8aa1d9557c78e3fa.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/23/ccf3fa3cce01419cb1b53df9a3cf3ffd.png [7672e4cf374c279648534fac0f288cc4.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/23/db4caf452ddc4c84b67969098fa497fd.png [008c29c9292a1c29ca61c9e8e13b2863.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/23/c6a01bae9ab34a14a3a3107b1adb29ed.png [6f7b29dec68ad8a1210f7c97b2d81b2e.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/23/04dd7b92c2124c07a089d54d6cb0cd62.png [83eac56a72b85efe39639002019d17b1.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/23/2697bacd98a14baeadbf8f1ed9d640d2.png [2204bc90e038b042cfab3192f91290a0.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/23/64653d981ae64607aa03a769b0336e58.png [661234f46b878e80b970dc0ba504e51f.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/23/4511c77f4f9945f0a94f02dafc5b1dd1.png
还没有评论,来说两句吧...