【Docker】【IDEA】springboot项目在服务器docker容器化部署,IDEA远程debug

478 阅读4分钟

在这里插入图片描述

前言

前期环境配置可以参考

【虚拟机】【ssh】本地ssh连接虚拟机 - Xshell配置与虚拟机ip配置

【虚拟机】vmware虚拟机创建 centos7系统配置

安装docker

安装docker,输入:

yum install -y docker

在这里插入图片描述 检查一下是否下载docker成功:

docker version

在这里插入图片描述

依次输入:

systemctl start docker.service
systemctl enable docker.service

在这里插入图片描述

JDK部署docker

装个jdk11

docker pull openjdk:11

在这里插入图片描述

随后查看镜像列表:

docker images

可以看到

在这里插入图片描述

创建将jdk镜像容器化运行:

docker run -d -t --name java11 openjdk:11

在这里插入图片描述

随后查看docker的容器化进程:

docker ps

在这里插入图片描述

我们可以看看运行进程的log:

docker logs 容器ID

在这里插入图片描述

Springboot项目准备

随便创建一个springboot项目,

在这里插入图片描述

随便命名为

springboot-print

在这里插入图片描述

项目结构为:

在这里插入图片描述 配置依赖和代码如下:

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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>springboot-print</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.7.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>


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

        <!-- validation -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.7.RELEASE</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

注意<build> ... </build>部分能够让maven把项目和项目需要的依赖一起打包,才能打包好的jar包正常运行。

application.properties

server.port=8080

MainApplication.java

package org.sample;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MainApplication {

    public static void main(String[] args) {
        SpringApplication.run(MainApplication.class, args);
    }
}

HelloController.java

package org.sample.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;


/**
 * 控制器
 */
@RestController
public class HelloController {

    @ResponseBody
    @GetMapping("/hello")
    public String modifyPassword() {
        System.out.println("hello, docker");
        int a = 1;
        System.out.println("hello, springboot");
        return "hello, world";
    }

}

我们可以本地运行一下 MainApplication.java,随后访问 http://localhost:8080/hello

可以看到网页显示: 在这里插入图片描述

控制台也打印了: 在这里插入图片描述

部署准备

我们进入 usr 文件夹

cd /usr/

在这里插入图片描述

在这里创建一个docker文件夹:

mkdir docker

在这里插入图片描述

在docker文件夹中再创建一个 springboot-print文件夹:

mkdir springboot-print

在这里插入图片描述

关闭防火墙,关闭防火墙开机自启,输入:

systemctl stop firewalld
systemctl disable firewalld.service

在这里插入图片描述

修改/usr、/usr/docker、/usr/docker/springboot-print文件夹的所有者和所属组均为我们用户:

chown 账号:密码 /usr/docker/springboot-print
chown 账号:密码 /usr/docker
chown 账号:密码 /usr

在这里插入图片描述

在这里插入图片描述

重启虚拟机:

reboot

在这里插入图片描述

项目部署docker

我们把项目maven clean,再maven package

在这里插入图片描述 在这里插入图片描述 完成后,在项目文件夹的target文件夹中应该能找到打包好的项目:

在这里插入图片描述

随后把这个jar包传入 /usr/docker/springboot-print 文件夹:

我这里是通过Xshell中的文件传输平台:

在这里插入图片描述

打开目标文件夹 /usr/docker/springboot-print 后,把jar包拖入进去就行

在这里插入图片描述

在这里插入图片描述

进入 springboot-print 文件夹:

在这里插入图片描述 在这里插入图片描述

创建Dockerfile:

vi Dockerfile

i进入insert模式,输入:

FROM openjdk:11
LABEL maintainer="zhuiliDylan"
VOLUME /usr/docker
ADD springboot-print-1.0-SNAPSHOT.jar app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-jar","-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005","/app.jar"]

这里我们设置了java运行的参数,设置debug端口为5005

在这里插入图片描述

输入:wq,回车,这时我们有如下文件:

在这里插入图片描述

随后构建镜像:

docker build -t springboot-print:1.0 .

在这里插入图片描述

可以看到构建成功了。

docker images 可以查看刚刚的创建的镜像:

在这里插入图片描述

接着容器化运行:

docker run -d -t --name springboot-print -v /usr/docker:/usr/docker -p 9091:8080 -p 9092:5005 springboot-print:1.0

这里,我们将docker容器中的8080端口(用于项目访问)映射到了外部的9091端口,5005端口(用于debug)映射到了外部9092端口

在这里插入图片描述

成功后,查看docker 容器化运行的进程:

docker ps

在这里插入图片描述

查看我们的 springboot-print:1.0的log,(这里的ID复制自 docker ps的进程ID),可以看到项目运行时的控制台输出:

docker logs -f 容器ID

在这里插入图片描述

可以看到,我们的项目在docker中运行成功。

打开浏览器通过http://192.168.10.200:9091/hello访问一下项目:

在这里插入图片描述

成功!在命令行也能看到输出:

在这里插入图片描述

IDEA远程debug

回到IDEA中,点击

在这里插入图片描述

或者

在这里插入图片描述

可以看到这个界面:

在这里插入图片描述

点击+号:

在这里插入图片描述

点击Remote或者Remote JVM Debug

在这里插入图片描述

接下来配置远程debug,做命名,填上IP和端口:

在这里插入图片描述

我将连接命名为Docker-springboot-print-debug,这个命名可以随意,host为192.168.10.200,端口号为9092(我们在docker中将debug的5005端口映射成了9092端口)。

填好之后点击Apply,点击确定。直接点击右上角debug按钮:

在这里插入图片描述

在这里插入图片描述

能够正常进行debug,需要项目代码和本地代码完全一致,这点本文肯定是满足的。出现这个界面就说明成功了:

在这里插入图片描述

接下来就可以像本地debug一样,在感兴趣的地方打断点了,比如:

在这里插入图片描述

我们接下来再到浏览器去访问http://192.168.10.200:9091/hello接口:

在这里插入图片描述

远程debug成功啦!

问题参考

docker 拉取镜像失败:

[root@docker /]# docker pull openjdk:11
Trying to pull repository docker.io/library/openjdk ...
11: Pulling from docker.io/library/openjdk
001c52e26ad5: Pulling fs layer
d9d4b9b6e964: Downloading [>                                                  ] 52.58 kB/5.156 MB
2068746827ec: Pulling fs layer
9daef329d350: Waiting
d85151f15b66: Waiting
66223a710990: Waiting
db38d58ec8ab: Waiting
error pulling image configuration: Get https://production.cloudflare.docker.com/registry-v2/docker/registry/v2/blobs/sha256/47/47a932d998b743b9b0bcce55aa8ede77de94a6a183c8a67dec9d5e3b8ce0faa7/data?verify=1691761388-zuTNHbS7xIot0becB8ByKTd4QdU%3D: net/http: TLS handshake timeout

参考

blog.csdn.net/u010197332/…

另外 1)在/etc/docker中必须用daemon.json,不能daemon.conf,否则可能镜像拉不了

2)如果出现docker启动不了,可以在/etc/docker 把daemon.json.savem中的内容删掉