SpringBoot一键部署Docker

做过项目都知道,有很多的部署方式,springboot都怎么部署的呢?
是打成jar包直接java运行?还是打成war包丢到tomcat等服务中运行?其实前面两种是非常普遍的部署方式,但如果服务数量多时,同样的部署操作我们可能需要做很多次,并且非常容易出现部署环境的配置等不同导致的部署问题,docker的部署方式就能够解决这个问题。
今天我们来看看docker的部署方式。

一、环境准备

在开始之前,我们需要把环境准备一下,需要以下内容:
VMware Workstation
CentOS-7
Docker

这里就不去细讲 VMware Workstation 的下载操作以及
CentOS-7的安装步骤了,给大家精选了一下讲得非常好的安装的教程:

其中需要注意的一点,文章中安装完CentOS-7后进入的虚拟机界面是桌面化的,实际上我们自己在安装完毕后是需要自己安装插件以及修改配置才能实现桌面可视化的,默认是命令行的桌面。

看完上面的教程,我们就已经准备好了2/3的环境了,还差Docker的安装,参考下面讲得非常好的文章即可:

二、操作准备

Docker已经安装完毕,接下来我们需要做的就是使用IDEA连接到虚拟机上的Docker

1.修改docker配置文件
编辑Docker的配置文件:
vi /usr/lib/systemd/system/docker.service

将下面这行注释掉:
# ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

新写一行:
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock

idea docker插件 tools路径设置 idea使用docker_java

2.修配置完成后,保存退出,然后重启 Docker:
重新加载配置文件和启动:
systemctl daemon-reload
systemctl start docker

查看docker进程是否监听

[root@localhost ~]# netstat -ano | grep 2375
tcp6       0      0 :::2375                 :::*                    LISTEN      off (0.00/0/0)

查看系统网络端口2375是否被docker所监听

[root@localhost ~]# netstat -tulp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTEN      3124/sshd           
tcp        0      0 localhost:smtp          0.0.0.0:*               LISTEN      3379/master         
tcp6       0      0 [::]:2375               [::]:*                  LISTEN      13964/dockerd

添加防火墙2375/tcp ,并重载防火墙

[root@localhost ~]#  firewall-cmd --zone=public --add-port=2375/tcp --permanent
success
[root@localhost ~]# firewall-cmd --reload
success
3.准备IDEA
在IDEA中下载插件Docker,若已有请忽略
File->Settings->Build,Execution,Deployment->Docker
填写URL进行调试,如果有如下图的Connection successful则表示远程连接Docker成功!
注意:URL的ip是虚拟机的ip地址,2375是配置的port,需要在虚拟机中关闭防火墙

idea docker插件 tools路径设置 idea使用docker_jar_02

5.配置Dockerfile
接下来,在项目的根目录下,我创建一个 Dockerfile ,作为我镜像的构建文件,具体位置如下图:

idea docker插件 tools路径设置 idea使用docker_java_03

FROM java:8
VOLUME /tmp
ADD jeecg-boot-module-system-2.2.0.jar jeecg-boot.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/jeecg-boot.jar"]

这里只有简单的四行,我说一下:
1、Spring Boot 项目的运行依赖 Java 环境,所以我自己的镜像基于 Java 镜像来构建。
2、由于Spring Boot 运行时需要 tmp 目录,这里数据卷配置一个 /tmp 目录出来。
3、将本地 target 目录中打包好的 .jar文件复制一份新的 到 /jeecg-boot.jar。
4、最后就是配置一下启动命令,由于我打包的 jar 已经成为jeecg-boot.jar 了,所以启动命令也是启动 jeecg-boot.jar。
这是我们配置的一个简单的 Dockerfile

6.配置 Maven 插件

接下来在 pom.xml 文件中,添加如下插件:

<plugin>
    <groupId>com.spotify</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>1.2.0</version>
    <executions>
        <execution>
            <id>build-image</id>
            <phase>package</phase>
            <goals>
                <goal>build</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <dockerHost>http://192.168.21.150:2375</dockerHost>
        <imageName>javaboy/${project.artifactId}</imageName>
        <imageTags>
            <imageTag>${project.version}</imageTag>
        </imageTags>
        <forceTags>true</forceTags>
        <dockerDirectory>${project.basedir}</dockerDirectory>
        <resources>
            <resource>
                <targetPath>/</targetPath>
                <directory>${project.build.directory}</directory>
                <include>${project.build.finalName}.jar</include>
            </resource>
        </resources>
    </configuration>
</plugin>

这个插件的配置不难理解:
1、首先在 execution 节点中配置当执行 mvn package 的时候,顺便也执行一下docker:build
2、然后在 configuration 中分别配置 Docker 的主机地址,镜像的名称,镜像的 tags,其中dockerDirectory 表示指定 Dockerfile 的位置。
3、最后 resource 节点中再配置一下 jar的位置和名称即可。 OK,做完这些我们就算大功告成了。

7.打包运行
接下来对项目进行打包,打包完成后,项目会自动构建成一个镜像,并且上传到 Docker 容器中,打包方式如下:

idea docker插件 tools路径设置 idea使用docker_docker_04


打包过程会稍微有一点久,因为还包含了镜像的构建,特别是第一次打包,需要下载基础镜像,会更慢一些。

项目打包成功之后,我们就可以在 Docker 容器中看到我们刚刚打包成的镜像了,如下:

idea docker插件 tools路径设置 idea使用docker_Docker_05

8.运行Docker
  1. 运行方式一
    此时,我们可以直接在 Linux 上像创建普通容器一样创建这个镜像的容器,然后启动,执行如下命令即可:
docker run -d --name jeecgboot -p 8080:8080 jeecgboot:0.0.1
  1. 启动成功之后,我们就可以访问容器中的接口了。
    但是这种操作显然还是有点麻烦,结合我们一开始安装的 Docker 插件,这个运行步骤还可以做进一步的简化。
  2. 运行方式二
    大家注意,此时我们的 IDEA 中多了一个选项,就是 docker,如下:
    选中刚刚生成的镜像,创建容器