IDEA 远程一键部署 SpringBoot 到 Docker
一、开发准备
-
安装 Docker
-
配置开启 docker 远程连接端口
1
2
3
4# Centos
vim /usr/lib/systemd/system/docker.service
# Ubuntu
vim /usr/lib/systemd/system/docker.service在 ExecStart 最后加上
-H tcp://0.0.0.0:2375
如果是阿里云服务器,就在
云服务器 ECS / 安全组
中添加 TCP 端口 2375 -
加载 docker 守护进程
1
systemctl daemon-reload
-
重启 docker
1
systemctl restart docker
-
测试是否开启成功
1
curl http://localhost:2375/version
或者查看端口是否打开
ps aux | grep docker
-
远程连接服务器 docker
填写远程 docker 地址
Settings - Build, Execution, Deployment - Docker:新加 Docker,并配置 TCP socket 的 Engine API URL 为
tcp://服务器 ip:2375
连接成功后在 IDEA 主界面 services 的 dock 栏有新配置的 Docker 列表,双击连接后会列出远程的 docker 容器和镜像
二、建项目
-
改 pom
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73<?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>com.xkcoding</groupId>
<artifactId>spring-boot-demo</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<groupId>com.liumulin</groupId>
<artifactId>demo-docker1</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo-docker1</name>
<description>demo-docker1</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
<dockerDirectory>src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<!-- 打包到 target 目录,等于父 pom 文件的 <directory>${project.basedir}/target</directory>-->
<directory>${project.build.directory}</directory>
<!-- 等于父 pom 文件的 <finalName>${project.artifactId}-${project.version}</finalName>-->
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<configuration>
<tasks>
<copy todir="src/main/docker"
file="target/${project.artifactId}-${project.version}.${project.packaging}"/>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project> -
在 src/main 目录下创建 docker 目录,并创建 Dockerfile 文件
1
2
3FROM openjdk:8-jdk-alpine
ADD *.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"] -
建 YAML
1
2
3
4server:
port: 9090
logging:
path: /docker/logs -
主启动类
1
2
3
4
5
6
7
8
9
10
11
12
13
14package com.liumulin.demodocker1.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
public class HelloController {
public String hello() {
return "Hello,From Docker!";
}
} -
新增 Dockerfile 配置
IDEA - Edit Configurations…
命令解释:
Image tag:指定镜像名称和 tag,镜像名称为 docker-demo,tag 为 1.1
Bind ports:绑定宿主机端口到容器内部端口。格式为 [宿主机端口]:[容器内部端口]
Bind mounts:将宿主机目录挂到到容器内部目录中。格式为 [宿主机目录]:[容器内部目录]。这个 springboot 项目会将日志打印在容器 /home/developer/app/logs/ 目录下,将宿主机目录挂载到容器内部目录后,那么日志就会持久化容器外部的宿主机目录中。
-
maven 打 jar 包
mvn clean install
-
运行 Dockerfile
会先 pull 基础镜像(比如 openjdk),然后再打包镜像,并将镜像部署到远程 docker 运行
成功后可以看到镜像名为 docker-demo:1.1,容器名为 docker-server
-
查看日志
IDEA 的 Docker 容器可以看到 Log 输出到了控制台