一、前言
目前基于SpringBoot的微服务和Docker容器非常火,平时我们不使用Docker时部署应用一般都是打成jar包后上传至服务器,再启动;使用Docker后我们也是先上传jar包到服务器,使用Dockerfile构建镜像后,然后使用docker run命令启动一个容器;我们发现以上步骤非常麻烦,特别是开发中,为了快速在测试环境验证我们的程序,这样重复的步骤就显得十分繁琐,对于这个问题使用我们熟悉IDEA即可迎刃而解,教你开启新姿势。
二、准备工作
1. Docker安装
2. 配置docker远程连接端口
vim /usr/lib/systemd/system/docker.service
找到ExecStart位置,在末尾加上-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
3. 重启Docker
systemctl daemon-reload
systemctl start docker #已经启动使用 systemctl restart docker命令
4. 开放端口
firewall-cmd --zone=public --add-port=2375/tcp --permanent
还可以直接关闭防火墙 systemctl stop firewalld
,云服务器如阿里云需要设置安全组并开放指定端口
5. 远程连接Docker
注:IDEA一般都安装了Docker插件,若没安装则到File – Settings – Plugins 搜索Docker安装并重启IDEA。
Docker远程连接配置:
点击绿色小三角启动按钮,连接成功后会列出远程所有Docker镜像和容器:
三、新建SpringBoot项目
项目结构
1. 配置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>2.1.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>docker</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>docker</name>
<description>Demo project for Spring Boot</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>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!--Docker Image构建插件-->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
<!--指定docker目录-->
<dockerDirectory>src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<configuration>
<tasks>
<!-- 复制jar包到docker目录 -->
<copy todir="src/main/docker" file="target/${project.artifactId}-${project.version}.${project.packaging}"></copy>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<!-- 配置依赖仓库 阿里云镜像 -->
<repositories>
<repository>
<id>aliyun-repos</id>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<!-- 配置插件仓库 阿里云镜像 -->
<pluginRepositories>
<pluginRepository>
<id>aliyun-plugin</id>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</project>
2. 在src/main目录下创建docker目录,并创建Dockerfile文件
FROM openjdk:8-jdk-alpine
ADD *.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
3. 在resource目录下创建application.properties文件
# logging.config=classpath:logback.xml
logging.path=/home/developer/app/logs/
server.port=8990
4. 创建接口
package com.example.docker;
import lombok.extern.log4j.Log4j2;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Log4j2
@RestController
@SpringBootApplication
public class DockerApplication {
public static void main(String[] args) {
SpringApplication.run(DockerApplication.class, args);
}
@RequestMapping("/")
public String index() {
log.info("Hello Docker!");
return "Hello Docker!";
}
}
5. 增加配置
命令解释:
Image tag : 指定镜像名称和tag,镜像名称为 docker-demo,tag为1.1
Bind ports : 绑定宿主机端口到容器内部端口。格式为[宿主机端口]:[容器内部端口]
Bind mounts : 将宿主机目录挂到到容器内部目录中(提前在宿主机创建好目录)。
格式为[宿主机目录]:[容器内部目录]。这个springboot项目会将日志打印在容器 /home/developer/app/logs/ 目录下,将宿主机目录挂载到容器内部目录后,那么日志就会持久化容器外部的宿主机目录中。
6. Maven打包
7. 运行
我们发现远程构建成功了一个docker-demo:1.1镜像,并启动了一个名为docker-demo的容器
Docker应用程序启动成功日志
8. 访问接口
9. 查看日志
cd /home/developer/app/logs/
cat spring.log # 实时刷新日志使用此命令 tail -fn200 spring.log
此时,IDEA构建SpringBoot项目就已经完成了,so easy,嘿嘿!