【保姆级教程】如何在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上,如图所示

image-20231110172054758


IDEA配置

首先在要在IDEA中安装docker插件,如下图所示

image-20231110165323127

接着选择IDEA左下方的Services中的Docker Connection选项,

image-20231110171342108

在如下窗口中配置:

image-20231110171829237

点击OK保存配置就可以愉快用IDEA地连上Docker了!!!

如果连不上,可能你的服务器安全组没有配置开放2375端口入站


进行项目部署

首先需要对项目进行打包,如图所示

image-20231110182550703

接下来,你就可以在项目根目录创建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的相关运行参数,不然可能端口没有暴露导致连接不上等问题,要配置运行参数,如图所示

image-20231110185855928

image-20231110190214598

保存之后,就可以点击运行按钮启动了

image-20231110190322502

注意事项:

每次运行时都需要对项目进行打包操作,这样传到Docker上运行的才是最新的版本

运行docker-compose.yml则比DockerFile简单,直接点击运行按钮启动就行

image-20231110190548094

至此,基本的步骤已经完成了(可用),但如果想要更好的效果,请看下文


优化部署

基于上面的做法每次运行Dockerfile时都要把相关的依赖包都传上去,每次盯着大小动不动都是几十上百M的Sending build context to Docker daemon进度条发愁,而且package的时候还要把测试用例都执行一遍,执行耗不了多少时间,但执行的时候要启动SpringBoot啊,这时间才是大头。照这样下去修改一次代码就要执行一次Dockerfile,这时间根本耗不起啊!所以必须得优化一下了。

基本思路是先禁用掉package的测试功能,然后把jar包给剔除掉,只传代码包;

要禁用掉package的测试功能,如图所示,只要把这个小图标点亮就行了

image-20231110212614616

接下来就是重头戏,优化传输:

第一步:修改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文件

image-20231110211235597

实现完全自动化

在之前的步骤中,我们需要先执行maven的package功能再执行Dockerfile,有没有一种可能能将这两个操作一键完成能??

当然可以!我们可以借助IDEA的Dockerfile运行配置中的Before Launch功能,在执行Dockerfile文件前就执行某项操作,其中就有Maven Goal。

以下是具体步骤:

image-20231110220731626

image-20231110220819865

image-20231110220856575

image-20231110221000690

参考链接

Maven打包,减少jar体积的方法_maven 打包过大-CSDN博客
.dockerignore始终不生效,急死我了 · Issue #317 · wangduanduan/wangduanduan.github.io · GitHub

posted @   TimQiu  阅读(1269)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示