容器化部署应该是目前的主流方案。

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

将 Spring Boot 项目打包到 Docker 容器中部署,有很多不同的方法,主要将 Spring Boot 项目一键打包到远程 Docker 容器,然后通过运行一个镜像的方式来启动一个 Spring Boot 项目。


安装 Docker

参考文章:https://blog.csdn.net/m0_59196543/article/details/124749175

配置 Docker 远程访问

Docker 安装成功之后,我们首先需要修改 Docker 配置,开启允许远程访问 Docker 的功能,开启方式很简单,修改 /usr/lib/systemd/system/docker.service 文件,修改如下内容:

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

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

1
2
systemctl daemon-reload
service docker restart

IDEA

  • 安装 Docker 插件。
  • 在 设置 -> 构建 -> Docker 中,配置一下 Docker 的远程连接地址。

配置完成后,可以看到下面有一个 Connection successful 提示,这个表示 Docker 已经连接上了。


简单项目测试

依赖项

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

配置 Dockerfile

  • 在项目的根目录下,创建一个 Dockerfile ,作为镜像的构建文件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # Spring Boot 项目的运行依赖 Java 环境,所以我自己的镜像基于 Java 镜像来构建。
    FROM hub.c.163.com/library/java:latest

    # 由于 Spring Boot 运行时需要 tmp 目录,这里数据卷配置一个 /tmp 目录出来
    VOLUME /tmp

    # 将本地 target 目录中打包好的 .jar 文件复制一份新的 到 /app.jar。
    ADD target/docker-test-0.0.1-SNAPSHOT.jar app.jar

    # 最后就是配置一下启动命令,由于打包的 jar 已经成为 app.jar 了,所以启动命令也是启动 app.jar。
    ENTRYPOINT ["java","-jar","/app.jar"]

配置 Maven 插件

  • 首先在 execution 节点中配置当执行 mvn package 的时候,顺便也执行一下 docker:build
  • 然后在 configuration 中分别配置 Docker 的主机地址,镜像的名称,镜像的 tags,其中 dockerDirectory 表示指定 Dockerfile 的位置。
  • 最后 resource 节点中再配置一下 jar 的位置和名称即可。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    <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://localhost:2375</dockerHost>
    <imageName>sihai/${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
2
3
4
5
6
7
@RestController
public class HelloDockerController {
@GetMapping("/hello")
public String hello() {
return "hello docker!";
}
}

项目打包

  • 打包完成后,项目会自动构建成一个镜像,并且上传到 Docker 容器中。
  • 打包完成后,就可以在 Docker 容器中看到刚刚打包成的镜像了。

项目运行

  • 注意文件名不要写错
1
docker run -d --name sihai -p 8080:8080 sihai/docker-test:0.0.1-SNAPSHOT