本文章介绍IDEA界面化远程构建部署到服务方式,本文提供大致思路,具体细节可以配合AI执行
方式一(推荐单节点少服务)
前置连接证书准备
- 如果你对安全无需求(比如在虚拟机上)可以跳过证书准备环节
-
自行配置好顶部信息栏
#!/bin/bash #vi /lib/systemd/system/docker.service #--tlsverify --tlscacert=/etc/docker/ca.pem --tlscert=/etc/docker/server-cert.pem --tlskey=/etc/docker/server-key.pem SERVER="你的服务器主机" PASSWORD="你的服务器密码" COUNTRY="CN" STATE="ShanXi" CITY="XiAn" ORGANIZATION="bitejiuyeke" ORGANIZATIONAL_UNIT="Dev" EMAIL="[email protected]" #临时文件夹 TEMP_DIR='/data/cert/docker' mkdir -p ${TEMP_DIR} cd ${TEMP_DIR} #生成`ca-key.pem` 文件 设置密码 openssl genrsa -aes256 -passout pass:${PASSWORD} -out ca-key.pem 4096 echo "生成ca私钥完成" #生成 `ca.pem` 文件,设置国家、省市、组织名、邮箱 openssl req -new -x509 -passin "pass:${PASSWORD}" -days 3650 -key ca-key.pem -sha256 -out ca.pem -subj "/C=${COUNTRY}/ST=${STATE}/L=${CITY}/O=${ORGANIZATION}/OU=${ORGANIZATIONAL_UNIT}/emailAddress=${EMAIL}" echo "填写配置信息完成" #生成 `server-key.pem` 文件 openssl genrsa -out server-key.pem 4096 #生成 `server.csr` 文件 openssl req -subj "/CN=${SERVER}" -sha256 -new -key server-key.pem -out server.csr #生成配置文件 `extfile.cnf` echo subjectAltName = IP:${SERVER},IP:0.0.0.0 >> extfile.cnf echo extendedKeyUsage = serverAuth >> extfile.cnf #生成服务器证书,需要输入之前输入的密码 openssl x509 -req -days 3650 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -passin "pass:${PASSWORD}" \-CAcreateserial -out server-cert.pem -extfile extfile.cnf echo "生成自签证书完成" #添加配置,使密钥适合客户端身份验证 echo extendedKeyUsage = clientAuth >> extfile.cnf #生成 `key.pem` 文件 openssl genrsa -out key.pem 4096 #创建`client.csr`文件 openssl req -subj '/CN=client' -new -key key.pem -out client.csr #生成证书 openssl x509 -req -days 3650 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -passin "pass:${PASSWORD}" \-CAcreateserial -out cert.pem -extfile extfile.cnf echo "生成client自签证书完成" rm -v -f client.csr server.csr chmod -v 0444 ca-key.pem key.pem server-key.pem chmod -v 0444 ca.pem server-cert.pem cert.pem echo "复制证书到指定目录" cp server-*.pem /etc/docker/ cp ca.pem /etc/docker/ -
将脚本复制到服务器然后执行
sh cert.sh -
证书会复制到
/etc/docker目录下,复制ca.pemcert.pemkey.pem后缀的文件到本机Windows项目中
得到目录结构

-
开放端口号
进入到/lib/systemd/system/docker.service
添加此配置
-H tcp://0.0.0.0:2376 --tlsverify=true --tlscacert=/etc/docker/ca.pem --tlscert=/etc/docker/server-cert.pem --tlskey=/etc/docker/server-key.pem -H fd:// --containerd=/run/containerd/containerd.sockroot@Ubuntu:/etc/docker# cat /lib/systemd/system/docker.service [Unit] Description=Docker Application Container Engine Documentation=https://docs.docker.com After=network-online.target nss-lookup.target docker.socket firewalld.service containerd.service time-set.target Wants=network-online.target containerd.service Requires=docker.socket StartLimitBurst=3 StartLimitIntervalSec=60 [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 tcp://0.0.0.0:2376 --tlsverify=true --tlscacert=/etc/docker/ca.pem --tlscert=/etc/docker/server-cert.pem --tlskey=/etc/docker/server-key.pem -H fd:// --containerd=/run/containerd/containerd.sock ExecReload=/bin/kill -s HUP $MAINPID TimeoutStartSec=0 RestartSec=2 Restart=always -
重启Docker
systemctl daemon-reload service docker restart
配置 IDEA 的 Docker 连接
-
Dockerfile示例FROM openjdk:21-jdk-slim ENV TZ=Asia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone WORKDIR /workspace MAINTAINER bitejiuyeke COPY target/*.jar /workspace/app.jar ENTRYPOINT exec java $JAVA_OPTS -jar app.jar -
在IDEA左下角点击三角符号
Services

-
进入Connection设置

-
tcp://你的虚拟机或者服务器主机:2376
证书选择的是存放ca.pemcert.pemkey.pem的文件夹
如果连接失败,就改成https://你的虚拟机或者服务器主机:2376

-
右击Dockerfile文件

自行选择修改端口号

添加 Run Maven Goal 跳过测试环节

-
在本地先打包
package,然后Dockerfile用本地jar包打镜像
-
Run Dockerfile可以直接打镜像并启动容器,如果有挂载需求可以先打镜像,手动启动挂载-v

方式二(单节点多服务)
通过pom文件中的Docker插件一键部署
<!--docker部署配置-->
<dockerhost.addr>tcp://192.168.56.107:2376</dockerhost.addr>
<dockerregistry.url>registry.cn-chengdu.aliyuncs.com</dockerregistry.url>
<dockerregistry.username>[email protected]</dockerregistry.username>
<dockerregistry.password>admin@666777</dockerregistry.password>
<dockerregistry.namespace>flashcode</dockerregistry.namespace>
<docker.skip.push>true</docker.skip.push>
配置基本信息,还可以配置卷映射,环境一些更常用的一些参数
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.45.0</version>
<configuration>
<!--指定远程服务器的Docker服务访问地址-->
<dockerHost>${dockerhost.addr}</dockerHost>
<certPath>${project.basedir}/../deploy/dev/app/config/cert</certPath>
<!--指定私有仓库的访问路径-->
<pushRegistry>${dockerregistry.url}</pushRegistry>
<!--指定库的用户名与密码-->
<authConfig>
<username>${dockerregistry.username}</username>
<password>${dockerregistry.password}</password>
</authConfig>
<containerNamePattern>${dockerregistry.namespace}-%n-%i</containerNamePattern>
<images>
<image>
<!--指定私有仓库访问地址/镜像名称-->
<name>${dockerregistry.namespace}/${project.build.finalName}:${project.version}</name>
<build>
<!--指定Dockerfile的路径-->
<dockerFileDir>${project.basedir}</dockerFileDir>
</build>
<run>
<volumes>
<bind>
<volume>/root/emrys-java/flashcode/deploy/dev/data/flashcodedata/flashcode-app/user-code:/workspace/user-code</volume>
<volume>/root/emrys-java/flashcode/deploy/dev/data/flashcodedata/flashcode-app/user-preview:/workspace/user-preview</volume>
<volume>/root/emrys-java/flashcode/deploy/dev/data/flashcodedata/flashcode-app/user-deploy:/workspace/user-deploy</volume>
<volume>/root/emrys-java/flashcode/deploy/dev/app/config/cert:/workspace/cert:ro</volume>
</bind>
</volumes>
<ports>
<port>18080:18080</port>
</ports>
<env>
<NACOS_ADDR>${nacos.addr}</NACOS_ADDR>
<RUN_ENV>${runenv}</RUN_ENV>
<JAVA_OPTS>${java.opts.default}</JAVA_OPTS>
</env>
</run>
</image>
</images>
</configuration>
<executions>
<execution>
<id>build</id>
<phase>deploy</phase>
<goals>
<goal>stop</goal>
<goal>build</goal>
<goal>start</goal>
<!--推送到远端仓库 -->
<goal>push</goal>
</goals>
</execution>
</executions>
</plugin>
执行:mvn deploy 一键部署,建议每次clean。
两种方式区别
| 对比项 | 方式一:IDEA + Dockerfile Run | 方式二:docker-maven-plugin |
|---|---|---|
| 适用场景 | 单服务、学习演示、临时发版 | 多微服务、参数多、希望命令可脚本化 |
| 操作入口 | Services 里连 Docker + 运行 Dockerfile | IDEA Maven 面板 deploy 或命令行 mvn deploy |
| 打 jar | 需先 package(可绑在 Before launch) | 随 deploy 生命周期,依赖前面 phase 已编译打包 |
| 构建发生在哪里 | 本地有 jar;镜像 build 在连接的 Docker 守护进程(配远程即远程) | 由插件连 dockerHost,在远程守护进程 build |
| 环境变量 / 端口 | IDEA 运行配置里填 | 写在 pom 的 <run><env>、<ports> |
| 卷挂载 | 运行配置 Volume 或手动 docker run -v | 写在 <run><volumes>,可进 Git 统一 |
| 停旧容器 / 命名 | 需手动删容器或改配置 | stop + containerNamePattern |
| 推私有镜像仓库 | 不内置,需另执行 docker push 或 CI | 可绑 push goal |
| 多服务依赖顺序 | 需 Compound / Compose / 手动起 | 可用 <dependsOn>(如 portal 依赖 mcp) |
| 团队可复现性 | 配置多在 .idea 或本机,易不一致 | pom + 父工程属性,更易对齐 |
| 证书 | IDEA 选证书文件夹(客户端三件套) | certPath 指向项目内 cert 目录 |
| 与 Maven 私服 deploy | 无关,不用点 deploy | 需 maven-deploy-plugin skip,否则会报 distributionManagement |
| 学习 / 维护成本 | 低,直观 | 中高,需懂 Maven 与插件 goal |
怎么选:
- 一个 demo / 一个 jar:方式一足够。
- 多模块、固定挂载与 Nacos:方式二更省事;本地调试仍可方式一。
生产流水线部署
通常使用 CI/CD 自动化或 k8s 部署,Dockerfile同样有作用.本文不提及
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/2301_79245606/article/details/167920266




