说明

在macOS上使用IDEA开发项目时,可以直接通过IDEA的Run配置,把项目打包成Docker镜像,然后部署到本机的Docker Desktop里运行.

这个方式适合本地调试Docker环境,不用每次手动执行docker builddocker run.

前提条件

  1. macOS已经安装并启动Docker Desktop
  2. IDEA已经安装Docker插件
  3. 项目里有可用的Dockerfile
  4. Java项目已经可以正常打包,比如Maven或Gradle打包成功

配置Docker连接

打开IDEA设置:

Settings | Build, Execution, Deployment | Docker

点击+,选择Docker for Mac.

然后点击Test Connection,看到连接成功就说明IDEA已经能连接到本机Docker Desktop.

配置Run

打开:

Run | Edit Configurations

点击+,这里常用有两个选择:

Docker | Dockerfile

适合项目里有Dockerfile,需要IDEA先构建镜像,再运行容器的场景.

它会执行类似下面的流程:

1
2
docker build -t my-app:latest .
docker run --name my-app -p 8080:8080 my-app:latest

也就是说,代码改了以后,可以让IDEA重新build镜像,再启动容器.

Spring Boot项目,前端项目,或者自己写了Dockerfile的项目,一般选这个.

Docker | Docker Image

适合镜像已经存在,只需要运行这个镜像的场景.

它会执行类似下面的流程:

1
docker run --name mysql-test -p 3306:3306 mysql:8

比如运行mysql,redis,nginx,nacos这类现成镜像,或者已经手动build好了镜像,只想让IDEA帮忙启动容器,就选这个.

简单记:

1
2
有Dockerfile,需要构建镜像 -> Docker | Dockerfile
已有镜像,只想运行容器 -> Docker | Docker Image

Dockerfile配置项

如果选择Docker | Dockerfile,关键配置如下:

配置项 说明
Server 选择前面配置好的Docker for Mac
Dockerfile 选择项目里的Dockerfile
Context folder 一般选择项目根目录
Image tag 镜像名称,比如my-app:latest
Container name 容器名称,比如my-app
Run built image 勾选,表示构建完成后直接运行镜像
Bind ports 端口映射,比如本机8080映射容器8080
Environment variables 按需配置环境变量

Before launch

如果是Spring Boot项目,建议在Before launch里加打包任务.

Maven项目可以配置:

1
clean package -DskipTests

Gradle项目可以配置:

1
bootJar

这样点击Run时,IDEA会先打包项目,再根据Dockerfile构建镜像并启动容器.

常见问题

端口被占用

修改Bind ports里的本机端口.

比如容器内部还是8080,本机可以改成18080.

1
18080 -> 8080

容器需要访问宿主机服务

macOS的Docker Desktop里,容器访问宿主机可以使用:

1
host.docker.internal

比如容器里的程序要连接本机MySQL,可以把数据库地址配置成:

1
host.docker.internal:3306

挂载本机目录失败

检查Docker Desktop是否允许访问这个目录.

可以在Docker Desktop里查看:

Settings | Resources | File Sharing

总结

本地项目通过IDEA部署到macOS的Docker Desktop,核心就是两步:

  1. 在IDEA里配置Docker for Mac
  2. 在Run配置里选择Docker | Dockerfile

如果只是运行已有镜像,才选择Docker | Docker Image.