前言:随着项目初始化的结束,接踵而来的问题则是我们应该如何去部署这些服务,如果依然采用之前单体项目的部署方式,那无疑是非常消耗时间的,有点事倍功半的感觉,部署起来会非常不方便。目前公司采用的是Jenkins+Gitlab自动化部署,这种方式我也有去考虑过,不过感觉有点不太适合,因为这需要更多的服务器资源来配合完成。比较了几款当下非常流行的部署技术,最终考虑选择使用docker-compose来进行部署,因为目前的这些服务都会被部署在同一台服务器上面,使用docker-compose相对而言会更加的适合一些。为了服务的成功部署以及运行,小主今日从腾某云上又购置了一台2核4G的服务器,即将进入今日的部署研究工作,希望这次的分享能够给大家带来帮助。
部署工作的开始需要考虑的是如何将项目打成jar包并成功运行。我们需要将bubble-diary-service、bubble-member-service以及bubble-gateway打成jar包,由于目前没有搭建maven私服,只能使用mvn install命令将需要依赖的jar/pom工程打入本地maven仓库,在执行打包命令之前,如果是jar工程的话需要在pom.xml文件中加入maven打包插件。
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
plugins>
build>
加入打包插件后,我们在将bubble-common-base、bubble-member-api等工程打成jar包的时候出现了异常,异常如下:
Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.4.2:repackage (repackage) on project bubble-common-base: Execution repackage of goal org.springframework.boot:spring-boot-maven-plugin:2.4.2:repackage failed: Unable to find main class
经过错误的描述信息,我们可以知道这是因为bubble-common-base、bubble-member-api等工程中没有加入主启动类所导致的异常。因此我们可以将maven插件给过滤掉。
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<configuration>
<skip>trueskip>
configuration>
plugin>
plugins>
build>
当然,bubble-common-base、bubble-member-api等工程将maven插件去掉也可以解决install失败的问题。
注意:在打jar包之前需要将所有项目都打入本地maven仓库哟!(mvn install)
把所有需要被依赖的工程打入到本地maven仓库之后,我们就可以将bubble-diary-service、bubble-member-service以及bubble-gateway这些工程打成jar包啦。(mvn clean package)
安装开始的第一步当然是得先打开那可爱的FinalShell工具呀嘻嘻嘻。
1.从github上下载docker-compose二进制文件进行安装
sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
不过由于github的下载速度非常慢,我这里选择从daocloud上下载。
sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
3.测试安装结果
docker-compose --version
有一说一,安装docker-compose实在是太简单了,连我这种Java开发小白也能上手运维部署,docker真是太牛了。
在部署之前,我们需要去简单的学习一下dockerfile以及docker-compose等相关知识,在这里我就先不聊这些题外话了。
OK,话不多说,开始进行部署!
准备工作:整理先前打包好的3个Jar包以及编写Dockerfile文件。
创建一个部署的文件夹
其目录结构如下所示:
-------bubble
--------------bubble-diary
---------------------Dockerfile
---------------------bubble-diary.jar
--------------bubble-member
---------------------Dockerfile
---------------------bubble-member.jar
--------------bubble-gateway
---------------------Dockerfile
---------------------bubble-gateway.jar
--------------docker-compose.yml
bubble-diary.Dockerfile
FROM adoptopenjdk/openjdk11:jdk-11.0.8_10-alpine
# 复制文件到容器
ADD bubble-diary.jar /bubble-diary.jar
# 配置容器启动后执行的命令
ENTRYPOINT ["java","-jar","-Duser.timezone=GMT+08 -XX:+HeapDumpOnOutOfMemoryError -Xms512m -Xmx512m","/bubble-diary.jar","--spring.profiles.active=dc"]
bubble-member.Dockerfile
FROM adoptopenjdk/openjdk11:jdk-11.0.8_10-alpine
# 复制文件到容器
ADD bubble-member.jar /bubble-member.jar
# 配置容器启动后执行的命令
ENTRYPOINT ["java","-jar","-Duser.timezone=GMT+08 -XX:+HeapDumpOnOutOfMemoryError -Xms512m -Xmx512m","/bubble-member.jar","--spring.profiles.active=dc"]
bubble-gateway.Dockerfile
FROM adoptopenjdk/openjdk11:jdk-11.0.8_10-alpine
# 复制文件到容器
ADD bubble-gateway.jar /bubble-gateway.jar
# 配置容器启动后执行的命令
ENTRYPOINT ["java","-jar","-Duser.timezone=GMT+08 -XX:+HeapDumpOnOutOfMemoryError -Xms512m -Xmx512m","/bubble-gateway.jar","--spring.profiles.active=dc"]
docker-compose.yml
version: '3.0'
services:
bubble-gateway:
image: bubble-gateway:1.0.0 # 指定镜像名称
build: ./bubble-gateway # 指定Dockerfile所在路径
container_name: bubble-gateway # 指定启动容器名称
ports:
- 81:81
volumes:
- /etc/localtime:/etc/localtime:ro # 同步宿主机与容器时间,ro代表readonly只读
restart: always
bubble-member:
image: bubble-member:1.0.0
build: ./bubble-member
container_name: bubble-member
ports:
- 8070:8070
volumes:
- /etc/localtime:/etc/localtime:ro
restart: always
bubble-diary:
image: bubble-diary:1.0.0
build: ./bubble-diary
container_name: bubble-diary
ports:
- 8060:8060
volumes:
- /etc/localtime:/etc/localtime:ro
restart: always
东西准备好了之后,我们在服务器的根目录上创建一个bubble文件夹,然后按照上面的目录结构上传到服务器
再进入到bubble目录下,执行docker-compose运行命令。
docker-compose up -d
补充几条命令用于杀死所有进程、删除所有容器以及所有镜像,方便部署。
docker kill $(docker ps -a -q)
docker rm $(docker ps -a -q)
docker rmi $(docker images -q)
下面的命令是基于Dockerfile构建镜像并运行,在执行命令的时候需要进入到有Dockerfile文件的目录。
docker build -f Dockerfile -t bubble-gateway:v1 .
docker run -it bubble-gateway:v1
到了这里我们依然是访问不了的,因为我们还需要去腾讯云把端口开放出来。
OK,如果可以访问了,则说明已经成功部署
好啦,到这里项目部署就已经结束啦,小伙伴们有什么疑问可以咨询小主哟
早成者未必有成,晚达者未必不达。不可以年少而自恃,不可以年老而自弃。