【保姆级教程】如何在IDEA中实现项目部署自由(快速将项目部署在docker上)?
Linux系统端配置
1、安装docker,此过程略。附上在阿里云服务器上部署docker和docker-compose的链接:如何部署并使用Docker_云服务器 ECS-阿里云帮助中心 (aliyun.com)
2、安装完docker后,随便找一个目录(本例的路径是/ocos/docker/cert
,也可以选其他的路径,下面要用)创建安全连接docker所需的证书文件,执行如下脚本即可。
#Docker tls script
#!/bin/bash
#settings
SERVER="服务器的IP地址"
PASSWORD="连接密码"
COUNTRY="CN"
STATE="HuBei"
CITY="xxx"
ORGANIZATION=""
ORGANIZATIONAL_UNIT="Dev"
EMAIL="xxx@xxx.com"
###start###
echo "script start"
#gen ca.pem - aes256
openssl genrsa -aes256 -passout pass:$PASSWORD -out ca-key.pem 4096
openssl req -new -x509 -passin "pass:$PASSWORD" -days 365 -key ca-key.pem -sha256 -out ca.pem -subj "/C=$COUNTRY/ST=$STATE/L=$CITY/O=$ORGANIZATION/OU=$ORGANIZATIONAL_UNIT/CN=$SERVER/emailAddress=$EMAIL"
#gen server cert
openssl genrsa -out server-key.pem 4096
openssl req -subj "/CN=$SERVER" -sha256 -new -key server-key.pem -out server.csr
echo subjectAltName = IP:$SERVER,IP:0.0.0.0 >> extfile.cnf
echo extendedKeyUsage = serverAuth >> extfile.cnf
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -passin "pass:$PASSWORD" \-CAcreateserial -out server-cert.pem -extfile extfile.cnf
#gen client cert
openssl genrsa -out key.pem 4096
openssl req -subj '/CN=client' -new -key key.pem -out client.csr
echo extendedKeyUsage = clientAuth >> extfile.cnf
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -passin "pass:$PASSWORD" \-CAcreateserial -out cert.pem -extfile extfile.cnf
#cert authorized
chmod -v 0400 ca-key.pem key.pem server-key.pem
chmod -v 0444 ca.pem server-cert.pem cert.pem
#del useless file
rm client.csr server.csr
echo "script done"
###end###
3、执行命令:
vim /lib/systemd/system/docker.service
然后找到[Service]
中的ExecStart
项,在-H fd:// --containerd=/run/containerd/containerd.sock
后加上
-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --tlsverify --tlscacert=/第二步存放的路径/ca.pem --tlscert=/第二步存放的路径/server-cert.pem --tlskey=/第二步存放的路径/server-key.pem
配置参考:
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --tlsverify --tlscacert=/ocos/docker/cert/ca.pem --tlscert=/ocos/docker/cert/server-cert.pem --tlskey=/ocos/docker/cert/server-key.pem
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutStartSec=0
RestartSec=2
Restart=always
然后执行如下命令刷新配置并重启docker
systemctl daemon-reload
systemctl restart docker
至此Linux端的准备工作就告一段落了,接下来我们配置IDEA
Windows系统端配置
将刚刚在Linux中创建的证书文件(后缀为pem,文件名为ca、cert、key)复制到Windows上,如图所示
IDEA配置
首先在要在IDEA中安装docker插件,如下图所示
接着选择IDEA左下方的Services中的Docker Connection选项,
在如下窗口中配置:
点击OK保存配置就可以愉快用IDEA地连上Docker了!!!
如果连不上,可能你的服务器安全组没有配置开放2375端口入站
进行项目部署
首先需要对项目进行打包,如图所示
接下来,你就可以在项目根目录创建DockerFile
(适合项目本体)和docker-compose.yml
(适合项目相关中间件)这两个文件了,以SpringBoot为例,这两个文件的内容如下:
DockerFile:
# 该镜像需要依赖的基础镜像
FROM openjdk:17 #最好不要用openjdk:17-slim!!后续优化传输时会出问题
# 指定维护者的名字
MAINTAINER timqiu
# 将当前目录下的jar包复制到docker容器的/目录下
ADD ./target/ocos-api-0.0.1-SNAPSHOT.jar /ocos-api.jar
# 声明服务运行在8080端口
EXPOSE 8080
# 指定docker容器启动时运行jar包
ENTRYPOINT ["java", "-jar","/ocos-api.jar"]
docker-compose.yml:
services:
redis:
image: redis
container_name: ocos_redis
restart: always
ports:
- 6379:6379
volumes:
- /ocos/docker/redis/data:/data
- /ocos/docker/redis/conf/redis.conf:/etc/redis/redis.conf
command: redis-server /etc/redis/redis.conf
mysql:
image: mysql:8
container_name: ocos_mysql
restart: always
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: xxxxxx
volumes:
- /ocos/docker/mysql/data:/var/lib/mysql
- /ocos/docker/mysql/conf:/etc/mysql/conf.d
nginx:
image: nginx:1.10
container_name: ocos_nginx
restart: always
ports:
- 80:80
volumes:
- /ocos/docker/nginx/html:/usr/share/nginx/html
- /ocos/docker/nginx/logs:/var/log/nginx
- /ocos/docker/nginx/conf:/etc/nginx
rabbitmq:
image: rabbitmq:management
container_name: ocos_rabbitmq
restart: always
ports:
- 5671:5671
- 5672:5672
- 4369:4369
- 25672:25672
- 15671:15671
- 15672:15672
mongodb:
image: mongo:5
container_name: ocos_mongodb
restart: always
ports:
- 27017:27017
volumes:
- /ocos/docker/mongodb/data:/data/db
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: xxxxxx
在创建完这两个文件后,如果要运行DockerFile,第一步就是要配置DockerFile的相关运行参数,不然可能端口没有暴露导致连接不上等问题,要配置运行参数,如图所示
保存之后,就可以点击运行按钮启动了
注意事项:
每次运行时都需要对项目进行打包操作,这样传到Docker上运行的才是最新的版本
运行docker-compose.yml则比DockerFile简单,直接点击运行按钮启动就行
至此,基本的步骤已经完成了(可用),但如果想要更好的效果,请看下文
优化部署
基于上面的做法每次运行Dockerfile时都要把相关的依赖包都传上去,每次盯着大小动不动都是几十上百M的Sending build context to Docker daemon
进度条发愁,而且package的时候还要把测试用例都执行一遍,执行耗不了多少时间,但执行的时候要启动SpringBoot啊,这时间才是大头。照这样下去修改一次代码就要执行一次Dockerfile,这时间根本耗不起啊!所以必须得优化一下了。
基本思路是先禁用掉package的测试功能,然后把jar包给剔除掉,只传代码包;
要禁用掉package的测试功能,如图所示,只要把这个小图标点亮就行了
接下来就是重头戏,优化传输:
第一步:修改pom.xml文件,在执行package操作时将代码和依赖包分开
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
<!--解决windows命令行窗口中文乱码-->
<jvmArguments>-Dfile.encoding=UTF-8</jvmArguments>
<!-- 拆开依赖-->
<mainClass>com.timqiu.ocos.OcosApiApplication</mainClass>
<layout>ZIP</layout>
<includes>
<include>
<!-- 排除所有Jar -->
<groupId>nothing</groupId>
<artifactId>nothing</artifactId>
</include>
</includes>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal> <!-- 将引入的 jar 打入其中 -->
</goals>
</execution>
</executions>
</plugin>
<!--此插件用于将依赖包抽出-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<excludeTransitive>false</excludeTransitive>
<stripVersion>false</stripVersion>
<includeScope>runtime</includeScope>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
第二步:配置.dockerignore
文件,将无关文件排除(至关重要)
之前我以为只要把Dockerfile
中的ADD
相关文件体积减少了就行了,其实不是的,它会将与Dockerfile
平级的文件和文件夹都上传到服务器上!!!
src/**
!target/*.jar
target/**
.dockerignore
.gitignore
LICENSE
pom.xml
踩坑警告:文件夹前面不要加/
!!!这样会导致.dockerignore
文件不生效!!
# 正确写法
.git
docs
# 错误写法
/.git
/docs
第三步:将依赖包传到服务器上。在第一步中,我们已经将代码和依赖包分开了,其中依赖包在/target/lib
文件夹中。将此文件夹上传到服务器的路径上,这里就把上传的过程给略了
第四步:修改并重新配置Dockerfile文件
实现完全自动化
在之前的步骤中,我们需要先执行maven的package功能再执行Dockerfile,有没有一种可能能将这两个操作一键完成能??
当然可以!我们可以借助IDEA的Dockerfile运行配置中的Before Launch功能,在执行Dockerfile文件前就执行某项操作,其中就有Maven Goal。
以下是具体步骤:
参考链接
Maven打包,减少jar体积的方法_maven 打包过大-CSDN博客
.dockerignore始终不生效,急死我了 · Issue #317 · wangduanduan/wangduanduan.github.io · GitHub
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南