一键部署 Spring Boot 到远程 Docker 容器,就是这么秀!

不知道各位小伙伴在生产环境都是怎么部署 Spring Boot 的,打成 jar 直接一键运行?打成 war 扔到 Tomcat 容器中运行?不过据松哥了解,容器化部署应该是目前的主流方案。java

不一样于传统的单体应用,微服务因为服务数量众多,在部署的时候出问题的可能性更大,这个时候,结合 Docker 来部署,就能够很好的解决这个问题,这也是目前使用较多的方案之一。git

将 Spring Boot 项目打包到 Docker 容器中部署,有不少不一样的方法,今天松哥主要来和你们聊一聊如何将 Spring Boot 项目一键打包到远程 Docker 容器,而后经过运行一个镜像的方式来启动一个 Spring Boot 项目。github

至于其余的 Spring Boot 结合 Docker 的用法,你们不要着急,后续的文章,松哥会和你们慢慢的一一道来。web

1.准备工做

1.1 准备 Docker

我这里以 CentOS7 为例来给你们演示。spring

首先须要在 CentOS7 上安装好 Docker,这个安装方式网上不少,我就很少说了,我本身去年写过一个 Docker 入门教程,你们能够在公众号后台回复 Docker 获取教程下载地址。docker

Docker 安装成功以后,咱们首先须要修改 Docker 配置,开启容许远程访问 Docker 的功能,开启方式很简单,修改 /usr/lib/systemd/system/docker.service 文件,加入以下内容:浏览器

-H tcp://0.0.0.0:2375  -H unix:///var/run/docker.sock

以下图:服务器

配置完成后,保存退出,而后重启 Docker:app

systemctl daemon-reload    
service docker restart

Docker 重启成功以后,Docker 的准备工做就算是 OK 了。maven

1.2 准备 IDEA

IDEA 上的准备工做,主要是安装一个 Docker 插件,点击 File->Settings->Plugins->Browse Repositories 以下:

点击右边绿色的 Install 按钮,完成安装,安装完成以后须要重启一下 IDEA。

IDEA 重启成功以后,咱们依次打开 File->Settings->Build,Execution,Deployment->Docker ,而后配置一下 Docker 的远程链接地址:

配置一下 Docker 的地址,配置完成后,能够看到下面有一个 Connection successful 提示,这个表示 Docker 已经链接上了。

如此以后,咱们的准备工做就算是 OK 了。

2.准备项目

接下来咱们来建立一个简单的 Spring Boot 项目(只须要引入 spring-boot-starter-web 依赖便可),项目建立成功以后,咱们再建立一个普通的 HelloDockerController,用来作测试,以下:

@RestController
public class HelloDockerController {
    @GetMapping("/hello")
    public String hello() {
        return "hello docker!";
    }
}

这是一个很简单的接口,无需多说。

3.配置 Dockerfile

接下来,在项目的根目录下,我建立一个 Dockerfile ,做为我镜像的构建文件,具体位置以下图:

文件内容以下:

FROM hub.c.163.com/library/java:latest
VOLUME /tmp
ADD target/docker-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

这里只有简单的四行,我说一下:

  1. Spring Boot 项目的运行依赖 Java 环境,因此我本身的镜像基于 Java 镜像来构建。
  2. 考虑到 Docker 官方镜像下载较慢,我这里使用了网易提供的 Docker 镜像。
  3. 因为 Spring Boot 运行时须要 tmp 目录,这里数据卷配置一个 /tmp 目录出来。
  4. 将本地 target 目录中打包好的 .jar 文件复制一份新的 到 /app.jar。
  5. 最后就是配置一下启动命令,因为我打包的 jar 已经成为 app.jar 了,因此启动命令也是启动 app.jar。

这是咱们配置的一个简单的 Dockerfile。

4.配置 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.66.131: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,作完这些咱们就算大功告成了。

5.打包运行

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

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

部分打包日志以下(项目构建过程):

项目打包成功以后,咱们就能够在 Docker 容器中看到咱们刚刚打包成的镜像了,以下:

5.1 运行方式一

此时,咱们能够直接在 Linux 上像建立普通容器同样建立这个镜像的容器,而后启动,执行以下命令便可:

docker run -d --name javaboy -p 8080:8080 javaboy/docker:0.0.1

启动成功以后,咱们就能够访问容器中的接口了。

可是这种操做显然仍是有点麻烦,结合咱们一开始安装的 Docker 插件,这个运行步骤还能够作进一步的简化。

5.2 运行方式二

你们注意,此时咱们的 IDEA 中多了一个选项,就是 docker,以下:

点击左边的绿色启动按钮,链接上 Docker 容器,链接成功以后,咱们就能够看到目前 Docker 中的全部容器和镜像了,固然也包括咱们刚刚建立的 Docker 镜像,以下:

此时,咱们选中这个镜像,右键单击,便可基于此镜像建立出一个容器,以下图:

咱们选择 Create container,而后填入容器的一些必要信息,配置一下容器名称,镜像 ID 会自动填上,暴露的端口使用 Specify 便可,而后写上端口的映射关系:

配置完成后,点击下方的 run 按钮,就能够开始运行了。运行日志以下:

注意,这个日志是在 Docker 的那个窗口里打印出来的。

项目运行成功以后,在浏览器输入远程服务器的地址,就能够访问了:

如此以后,咱们的 Spring Boot 项目就算顺利发布到远程 Docker 容器中了。

好玩吗?试试!

本文案例我已经上传到 GitHub,小伙伴们能够参考:https://github.com/lenve/java...

图片描述

相关文章
相关标签/搜索