为了便于自测或他测,我们可能会有这样的需求:

本机写完代码后,可以一键发布到远程服务器构建镜像并启动运行。

我试了几种方式,发现最方便的还是使用 IDEA 的 Docker 插件,而且本机无需安装任何其它 Docker 程序。

1. 环境说明

本机:Windows 10 系统,IDEA 2023.2.8 旗舰版,未安装 Docker Desktop

远程:Ubuntu 24.04,已安装 Docker Engine

2. 监听方式

交互模式

客户端 (Docker cli) <——-> 守护程序 (Docker daemon)

监听本地请求

守护程序默认通过 Unix Socket 来监听来自本地客户端请求。

Linux 下默认监听 /var/run/docker.sock,Windows 下默认监听 npipe:////./pipe/docker_engine

监听远程请求

守护程序如要监听远程客户端请求,可通过 docker.servicedaemon.json 配置为监听 IP 地址和端口。

其中 2375 默认为 HTTP 端口, 2376 默认为 HTTPS 端口。

详情见:https://docs.docker.com/engine/daemon/remote-access/

3. 插件配置

如下图所示,IDEA 的 Docker 插件与守护程序的交互有三种方式:

Docker for Windows;② TCP socket;③ SSH

我们的需求是要远程构建和运行,使用 ② 或 ③ 均可。

交互方式

3.1. TCP socket

远程服务器的 IP 地址为 192.168.50.92,但我这里配置的是 tcp://127.0.0.1:2375。为什么呢?

原因

新版本的守护程序出于安全考虑,配置了监听非安全连接的 2375 端口后,无法以后台服务方式启动。

当然,可以配置为启用 HTTPS2376 端口,但要分别创建服务端和客户端证书(双向认证),配置和使用都非常非常麻烦。

另外,服务器的端口开放应该是越少越好。

见:https://docs.docker.com/engine/security/protect-access

SSH 隧道

通常来说,开发人员都有权限通过 SSH 登录远程测试服务器。

所以,我这里就取了个巧:以 SSH 隧道方式转发 IDEA 的 Docker 插件发送的请求。

如此一来,则远程服务器无需更改配置也无需开放端口,非常简单。

执行命令:

ssh -NL 2375:/var/run/docker.sock patrick@192.168.50.92

注:

1、此命令是将本机的 2375 端口接收到的请求转发给 192.168.50.92 主机的 /var/run/docker.sock

2、使用 Docker 插件前,需先执行此命令。

3、SSH 登录请使用密钥对,以加强安全保障。

如果 SSH 转发成功,我们会看到 “Connection successful” 提示。否则:

连接失败

3.2. SSH

这里再介绍下 SSH 方式。

配置 SSH 连接

SSH连接

选择 SSH 方式

选择SSH

注:这种方式更简单,无需再提前建立 SSH 隧道进行转发。

3.3. 小结

IDEA 的 Docker 插件与守护程序的远程交互有两种方式: TCP socketSSH ,两者任选其一即可。

4. 项目测试

4.1. 创建项目

创建一个标准的 SpringBoot 项目:

代码文件

@RestController
public class HelloController {

    @GetMapping("/")
    public String hello() {
        return "Hello Docker!";
    }

}

Dockerfile

FROM eclipse-temurin:21-jdk

COPY target/*.jar /app.jar

ENTRYPOINT ["java", "-jar","/app.jar"]

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.5.5</version>
        <relativePath/>
    </parent>
    <groupId>com.igeeksky</groupId>
    <artifactId>spring-docker-test</artifactId>
    <version>0.0.1</version>
    <name>spring-docker-test</name>
    <properties>
        <java.version>21</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

4.2. 项目配置

编辑配置

编辑项目配置

具体配置

项目配置

其它都是常规选项,按需填写即可。

这里比较重要的是:构建 Docker 镜像之前先执行 Maven package 命令打成 Jar 包。

4.3. 运行测试

启动容器

点击上方的运行按钮,如下图所示,可以看到构建镜像成功,并自动启动容器。

构建镜像

而且,我们可以看到远程服务器的镜像信息和容器信息都以列表方式完整呈现,非常便于查看。

接口测试

浏览器输入:http://192.168.50.92:8080/,顺利返回 Hello Docker!

接口测试

5. 推送镜像

IDEA 的 Docker 插件还可以直接推送镜像到指定仓库。

仓库配置

仓库配置

推送镜像

推送镜像

推送成功

推送成功

6. 小结

这篇文章介绍了如何通过 IDEA 的 Docker 插件一键在远程服务器构建镜像并运行,并演示了如何推送镜像到指定仓库。

官方文档:https://www.jetbrains.com/help/idea/settings-docker.html