Docker - idea中集成docker插件发布SpringBoot项目
2026/4/20 14:07:17 网站建设 项目流程

IDEA使用Docker

安装docker插件

先确定是否安装docker插件:File → Settings… 找到plugins,在中间栏搜索“docker”,如果没安装则安装,如果已经安装了就不用再次安装

服务器上开启docker远程访问

编辑docker配置文件

vi /lib/systemd/system/docker.service

添加以下内容

ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H 0.0.0.0:2375

重启docker服务

systemctl daemon-reload systemctl restart docker

开启2375端口

firewall-cmd --zone=public --add-port=2375/tcp --permanent systemctl restart firewalld.service
新建连接

IDEA中 File → Settings…

指定docker的URL

点击“OK”完成创建,创建完毕之后会在IDEA的Services选项卡中出现docker信息

在Docker上右键 → Connect连接Docker

SpringBoot项目发布到docker

在项目的main文件夹下创建docker文件夹,并在该文件夹下创建Dockerfile文件,添加以下配置

FROM java:8 VOLUME /tmp ADD dockertest-0.0.1-SNAPSHOT.jar app.jar EXPOSE 8080 ENTRYPOINT [ "java", "-jar", "/app.jar" ]

目录结构

在static下创建index.html

<body><ahref="hello/test">hello</a></body></html>

创建controller

@RestController@RequestMapping("/hello")publicclassHelloController{@GetMapping("/test")publicStringtest(){return"success";}}

在pom.xml文件中导入docker的maven插件

<plugin><!-- docker-maven插件--><groupId>com.spotify</groupId><artifactId>docker-maven-plugin</artifactId><version>1.0.0</version><configuration><dockerHost>http://192.168.174.130:2375</dockerHost><imageName>${project.artifactId}</imageName><dockerDirectory>src/main/docker</dockerDirectory><resources><resource><targetPath>/</targetPath><directory>${project.build.directory}</directory><include>${project.build.finalName}.jar</include></resource></resources></configuration></plugin>

clean项目

然后执行package重新打包项目

再然后通过docker插件打包项目为镜像文件,打包成功之后IDEA会自动将镜像文件上传到服务器

重新连接docker,可以看到在镜像列表中已经有了刚才生成的镜像

在镜像上右键 → Create Container创建新容器

在弹出的对话框中给容器指定名字

点击“Modify options”设置启动项

指定端口映射,然后点击“Run”运行容器

在linux下可以看到运行情况

开启Linux的8080端口

firewall-cmd --zone=public --add-port=8080/tcp --permanent systemctl restart firewalld.service

在Windows的浏览器中访问项目

点击“hello”获取结果

补充:利用Java代码操作docker

外部引入docker-java所需要的jar包

将docker-java.rar添加到maven本地仓库com.github下并解压

该文件夹下包含java操作docker需要的包

在SpringBoot项目中导入依赖

<dependency><groupId>com.github.docker-java</groupId><artifactId>docker-java</artifactId><version>0-SNAPSHOT</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.4</version></dependency>

将一下pem文件拷贝到项目的resources目录下

application.yml配置

spring:application:name:dockertestserver:port:8080docker:url:tcp://192.168.232.129:2375

创建Docker配置类

importcom.github.dockerjava.api.DockerClient;importcom.github.dockerjava.api.command.DockerCmdExecFactory;importcom.github.dockerjava.core.DefaultDockerClientConfig;importcom.github.dockerjava.core.DockerClientBuilder;importcom.github.dockerjava.core.DockerClientConfig;importcom.github.dockerjava.jaxrs.JerseyDockerCmdExecFactory;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;/** * @author: Mr·Xiang * @create 2023-03-15 20:31 */@ConfigurationpublicclassDockerConfig{@Value("${docker.url}")privateStringurl;@BeanpublicDockerClientdockerClient(){// 进行安全认证DockerClientConfigconfig=DefaultDockerClientConfig.createDefaultConfigBuilder()// 服务器ip.withDockerHost(url).withDockerTlsVerify(true)// 压缩包解压的路径.withDockerCertPath(DockerClient.class.getClassLoader().getResource("").getPath())// API版本 可通过在服务器 docker version 命令查看.withApiVersion("1.38").build();// docker命令执行工厂DockerCmdExecFactorydockerCmdExecFactory=newJerseyDockerCmdExecFactory().withReadTimeout(60000).withConnectTimeout(60000).withMaxTotalConnections(100).withMaxPerRouteConnections(10);DockerClientdockerClient=DockerClientBuilder.getInstance(config).withDockerCmdExecFactory(dockerCmdExecFactory).build();//returndockerClient;}}

添加Docker工具类

importcom.github.dockerjava.api.DockerClient;importcom.github.dockerjava.api.command.CreateContainerResponse;importcom.github.dockerjava.api.command.PullImageCmd;importcom.github.dockerjava.api.model.ExposedPort;importcom.github.dockerjava.api.model.Ports;importorg.springframework.stereotype.Component;importjavax.annotation.Resource;importstaticcom.github.dockerjava.api.model.HostConfig.newHostConfig;/** * @author: Mr·Xiang * @create 2023-03-15 20:41 */@ComponentpublicclassDockerUtil{@ResourceprivateDockerClientdockerClient;/** * * @param containerName 容器名 * @param imageName 镜像名 * @param containerPort 容器端口 * @param linuxPort Linux操作系统端口 * @return 容器信息 */publicCreateContainerResponsecreateContainers(StringcontainerName,StringimageName,intcontainerPort,intlinuxPort){//映射端口8088—>80ExposedPortexposedPort=ExposedPort.tcp(containerPort);PortsportBindings=newPorts();portBindings.bind(exposedPort,Ports.Binding.bindPort(linuxPort));CreateContainerResponsecontainer=dockerClient.createContainerCmd(imageName).withName(containerName).withHostConfig(newHostConfig().withPortBindings(portBindings)).withExposedPorts(exposedPort).exec();// 启动容器startContainer(container.getId());returncontainer;}/** * 开启容器 * @param containerId 容器id */publicbooleanstartContainer(StringcontainerId){try{dockerClient.startContainerCmd(containerId).exec();returntrue;}catch(Exceptione){e.printStackTrace();returnfalse;}}/** * 停止容器 * @param containerId 容器id */publicbooleanstopContainer(StringcontainerId){try{dockerClient.stopContainerCmd(containerId).exec();returntrue;}catch(Exceptione){e.printStackTrace();returnfalse;}}/** * 删除容器 * @param containerId 容器id */publicbooleanremoveContainer(StringcontainerId){try{dockerClient.removeContainerCmd(containerId).exec();returntrue;}catch(Exceptione){e.printStackTrace();returnfalse;}}/** * 拉取镜像 * @param repository 仓库 * @return */publicPullImageCmdpullImage(Stringrepository){PullImageCmdpullImageCmd=dockerClient.pullImageCmd(repository);returnpullImageCmd;}/** * 删除镜像 * @param imageId */publicbooleanremoveImage(StringimageId){try{dockerClient.removeImageCmd(imageId).exec();returntrue;}catch(Exceptione){e.printStackTrace();returnfalse;}}}

创建Controller

importcom.example.dockertest2.DockerUtil;importcom.github.dockerjava.api.command.CreateContainerResponse;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;importjavax.annotation.Resource;/** * @author: Mr·Xiang * @create 2023-03-15 20:40 */@RestController@RequestMapping("/docker")publicclassDockerController{@ResourceprivateDockerUtildockerUtil;@GetMapping("/create")publicCreateContainerResponsecreate(){CreateContainerResponsecontainerResponse=dockerUtil.createContainers("nginx-java","nginx",80,81);System.out.println(containerResponse);returncontainerResponse;}@GetMapping("/stop")publicvoidstop(Stringid){dockerUtil.stopContainer(id);}@GetMapping("/del")publicvoiddel(Stringid){dockerUtil.removeContainer(id);}}

启动项目请求接口进行测试,浏览器得到以下信息表示创建成功

通过docker ps指令验证容器是否启动成功,看到以下信息表示容器启动成功

开启Linux的81端口可以访问nginx

firewall-cmd --zone=public --add-port=81/tcp --permanent systemctl restart firewalld.service

自主生成docker-java所需要的jar包(可选)

拉取docker-java源代码到本地文件夹

git clone https://github.com/docker-java/docker-java.git

编译包,生成本地jar

cd docker-java mvn install -Dmaven.test.skip=true

成功入下图所示

生成Java项目需要的pem文件

在Linux的任意目录下创建auto_gen_docker.sh文件,并添加以下内容

#!/bin/bash## -------------------------------------------------------------# 自动创建 Docker TLS 证书# -------------------------------------------------------------# 以下是配置信息# --[BEGIN]------------------------------CODE="docker"IP="192.168.1.1"PASSWORD="123456"COUNTRY="CN"STATE="HUNAN"CITY="CHANGSHA"ORGANIZATION="thyc"ORGANIZATIONAL_UNIT="Dev"COMMON_NAME="$IP"EMAIL="an23gn@163.com"# --[END]--# Generate CA keyopenssl genrsa-aes256-passout"pass:$PASSWORD"-out"ca-key-$CODE.pem"4096# Generate CAopenssl req-new-x509-days365-key"ca-key-$CODE.pem"-sha256-out"ca-$CODE.pem"-passin"pass:$PASSWORD"-subj"/C=$COUNTRY/ST=$STATE/L=$CITY/O=$ORGANIZATION/OU=$ORGANIZATIONAL_UNIT/CN=$COMMON_NAME/emailAddress=$EMAIL"# Generate Server keyopenssl genrsa-out"server-key-$CODE.pem"4096# Generate Server Certs.openssl req-subj"/CN=$COMMON_NAME"-sha256-new-key"server-key-$CODE.pem"-outserver.csrecho"subjectAltName = IP:$IP,IP:127.0.0.1">>extfile.cnfecho"extendedKeyUsage = serverAuth">>extfile.cnf openssl x509-req-days365-sha256-inserver.csr-passin"pass:$PASSWORD"-CA"ca-$CODE.pem"-CAkey"ca-key-$CODE.pem"-CAcreateserial-out"server-cert-$CODE.pem"-extfileextfile.cnf# Generate Client Certs.rm-fextfile.cnf openssl genrsa-out"key-$CODE.pem"4096openssl req-subj'/CN=client'-new-key"key-$CODE.pem"-outclient.csrechoextendedKeyUsage=clientAuth>>extfile.cnf openssl x509-req-days365-sha256-inclient.csr-passin"pass:$PASSWORD"-CA"ca-$CODE.pem"-CAkey"ca-key-$CODE.pem"-CAcreateserial-out"cert-$CODE.pem"-extfileextfile.cnfrm-vfclient.csr server.csrchmod-v0400"ca-key-$CODE.pem""key-$CODE.pem""server-key-$CODE.pem"chmod-v0444"ca-$CODE.pem""server-cert-$CODE.pem""cert-$CODE.pem"# 打包客户端证书mkdir-p"tls-client-certs-$CODE"cp-f"ca-$CODE.pem""cert-$CODE.pem""key-$CODE.pem""tls-client-certs-$CODE/"cd"tls-client-certs-$CODE"tarzcf"tls-client-certs-$CODE.tar.gz"*mv"tls-client-certs-$CODE.tar.gz"../cd..rm-rf"tls-client-certs-$CODE"# 拷贝服务端证书mkdir-p/etc/docker/certs.dcp"ca-$CODE.pem""server-cert-$CODE.pem""server-key-$CODE.pem"/etc/docker/certs.d/

给auto_gen_docker.sh添加执行权限

chmod a+x auto_gen_docker.sh

执行脚本

./auto_gen_docker.sh

执行完毕之后会在当前文件夹下生成一个压缩包:tls-client-certs-docker.tar.gz,该压缩包中的文件就是Java项目需要的pem文件,解压压缩包将其中的文件拷贝到springboot项目的resources目录下即可

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询