文章目录
前言
除了 IDEA,其他 IntelliJ-based 的 IDE 也支持。
运用场景:
- 本地环境不满足项目运行要求,但是 Docker 环境可以运行
- 项目运行方式比较特殊,无法直接运行(例如:依赖基础镜像)
- 本地 Windows 环境不明原因运行项目特别慢,但是以此为宿主的虚拟机中不存在这个问题
其实场景 3 才是我配置远程 Docker 环境开发本地项目的根本原因。
很多项目,不明原因(其实有些影响因素我了解,但是不便于深入研究),在宿主机启动耗时是虚拟机的很多倍。
实践
(本地环境可忽略)通过 TCP 暴露 Docker API
以 Ubuntu Server 为例:
编辑文件 /lib/systemd/system/docker.service
找到 ExecStart 部分,原有内容:
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
在结尾添加 -H tcp://0.0.0.0:2375
,代表通过 TCP 2375 端口暴露 Docker API,修改后内容:
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375
需要重启服务:
sudo systemctl daemon-reload
sudo systemctl restart docker
除非你愿意把机器借给别人挖矿,外网环境暴露 API 必须进行安全配置
曾经我暴露了自己某一台 ECS 的 Docker API,因为没有做安全措施,被别人用来挖矿了。
默认情况下,Docker 可以挂载任何目录,不做任何安全措施直接暴露 API 相当于宿主裸奔。在内网环境安全问题可控,但是外网必须做好安全措施。
具体请参考官方文档:
在 IDEA 中配置 Docker 运行环境
IntelliJ-based 的 IDE 内置了 Docker 插件,方便操作 Docker。
打开 Settings,依次进入 Build, Execution, Deployment
-> Docker
如果本地环境就有 Docker 的话,可以直接通过 Unix socket
连接。Docker Desktop for Windows 也可以使用该方式。
如果 Docker 在外部通过 TCP 暴露 API,则配置 TCP socket
创建后,可以在 Services 面板管理 Docker
找不到 Services 面板?
可以通过 Ctrl + Shift + A
或双击 Shift
打开 Actions
搜索。每个人的快捷键可能不同。
Services 中集成更多 Configurations
Services 中没有 Gradle,运行 Gradle build 时会开一个新的 Tab。
如何把 Gradle 或其他类型也集成到 Services 中?
点一下加号,选择 Run Configuration Type:
然后就可以选择自己想添加进来的类型了:
项目运行配置(以 Java 项目为例)
准备好 Dockerfile
FROM openjdk:8-jre-alpine
ENV JAVA_OPTS=""
ENTRYPOINT java -jar $JAVA_OPTS app.jar
COPY build/libs/camel-micro-service-*.jar /app.jar
配置远程 Debug
复制那一串命令行参数备用。
构建镜像前自动编译代码
一个 SpringBoot 项目要打 Docker 镜像,需要先打包 SpringBoot Jar。使用 IDEA 直接运行项目可能是基于 Classpath 运行的,这时候项目没有 jar 包,所以要先 build 项目。
保存一个 Gradle build 的 Configuration。
可以勾上右上角的 Store as project file
,就没那么容易丢配置了。
用刚才写的 Dockerfile 文件创建一个 Docker Configuration,配置一下参数:
- Image tag:镜像名称
- Container name:容器名称
- Bind ports:至少要暴露远程 Debug 的端口
- Environment variables:将刚才复制的远程 Debug 的参数贴进去
- Before launch:构建 Docker 镜像前执行下 Gradle build
底下的 Before launch 添加刚才保存的 Gradle build。
之后,点击运行 Dockerfile,会自动先执行 Gradle build。
切换到 Docker 中对应容器的 Log Tab,可以看到日志:
然后就可以运行 Remote Debug 了。(日志只能到 Docker 的容器 Tab 去看)
(可选)调整 Gradle 配置减少 build 耗时
使用较旧的 Gradle 可以在 .gradle/gradle.properties
添加参数,减少 build 耗时。
org.gradle.parallel=true
org.gradle.configureondemand=true
org.gradle.daemon=true