一、前言

目前基于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

idea连接docker里的redis docker idea一键部署教程_idea连接docker里的redis

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远程连接配置:

idea连接docker里的redis docker idea一键部署教程_Docker_02

点击绿色小三角启动按钮,连接成功后会列出远程所有Docker镜像和容器:

idea连接docker里的redis docker idea一键部署教程_docker_03


三、新建SpringBoot项目

项目结构

idea连接docker里的redis docker idea一键部署教程_Docker_04

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. 增加配置

idea连接docker里的redis docker idea一键部署教程_idea连接docker里的redis_05


idea连接docker里的redis docker idea一键部署教程_spring_06


idea连接docker里的redis docker idea一键部署教程_docker_07


命令解释:

Image tag : 指定镜像名称和tag,镜像名称为 docker-demo,tag为1.1

Bind ports : 绑定宿主机端口到容器内部端口。格式为[宿主机端口]:[容器内部端口]

Bind mounts : 将宿主机目录挂到到容器内部目录中(提前在宿主机创建好目录)。
格式为[宿主机目录]:[容器内部目录]。这个springboot项目会将日志打印在容器 /home/developer/app/logs/ 目录下,将宿主机目录挂载到容器内部目录后,那么日志就会持久化容器外部的宿主机目录中。

6. Maven打包

idea连接docker里的redis docker idea一键部署教程_idea连接docker里的redis_08

7. 运行

idea连接docker里的redis docker idea一键部署教程_Docker_09


我们发现远程构建成功了一个docker-demo:1.1镜像,并启动了一个名为docker-demo的容器

idea连接docker里的redis docker idea一键部署教程_docker_10


Docker应用程序启动成功日志

idea连接docker里的redis docker idea一键部署教程_spring_11

8. 访问接口

idea连接docker里的redis docker idea一键部署教程_Docker_12

9. 查看日志
cd /home/developer/app/logs/
cat spring.log  # 实时刷新日志使用此命令 tail -fn200 spring.log

idea连接docker里的redis docker idea一键部署教程_Docker_13

此时,IDEA构建SpringBoot项目就已经完成了,so easy,嘿嘿!