说明
在macOS上使用IDEA开发项目时,可以直接通过IDEA的Run配置,把项目打包成Docker镜像,然后部署到本机的Docker Desktop里运行.
这个方式适合本地调试Docker环境,不用每次手动执行docker build和docker run.
前提条件
- macOS已经安装并启动
Docker Desktop - IDEA已经安装
Docker插件 - 项目里有可用的
Dockerfile - Java项目已经可以正常打包,比如Maven或Gradle打包成功
整体流程
IDEA部署服务到本机Docker Desktop,本质上就是把手动命令配置到IDEA的Run里.
手动执行时一般是这样:
mvn clean package -DskipTests
docker build -t my-app:latest .
docker run --name my-app -p 8080:8080 my-app:latest
配置到IDEA之后,点击Run就可以自动完成打包,构建镜像,启动容器.
配置Docker连接
打开IDEA设置:
Settings | Build, Execution, Deployment | Docker
点击+,选择Docker for Mac.
然后点击Test Connection,看到连接成功就说明IDEA已经能连接到本机Docker Desktop.
准备Dockerfile
Spring Boot项目可以在项目根目录准备一个简单的Dockerfile.
FROM eclipse-temurin:17-jre
WORKDIR /app
COPY target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
如果项目端口不是8080,这里的EXPOSE和后面的端口映射都要换成实际端口.
配置Run
打开:
Run | Edit Configurations
点击+,这里常用有两个选择:
Docker | Dockerfile
适合项目里有Dockerfile,需要IDEA先构建镜像,再运行容器的场景.
它会执行类似下面的流程:
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
适合镜像已经存在,只需要运行这个镜像的场景.
它会执行类似下面的流程:
docker run --name mysql-test -p 3306:3306 mysql:8
比如运行mysql,redis,nginx,nacos这类现成镜像,或者已经手动build好了镜像,只想让IDEA帮忙启动容器,就选这个.
简单记:
有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 | 按需配置环境变量 |
常用配置可以这样填:
Server: Docker for Mac
Dockerfile: ./Dockerfile
Context folder: 项目根目录
Image tag: my-app:latest
Container name: my-app
Bind ports: 8080:8080
Before launch
如果是Spring Boot项目,建议在Before launch里加打包任务.
Maven项目可以配置:
clean package -DskipTests
Gradle项目可以配置:
bootJar
这样点击Run时,IDEA会先打包项目,再根据Dockerfile构建镜像并启动容器.
启动后验证
启动成功后,可以在Docker Desktop里看到容器.
也可以在终端检查:
docker ps
如果服务端口是8080,可以访问:
http://localhost:8080
如果需要看日志,可以在IDEA的Run窗口查看,也可以执行:
docker logs -f my-app
常见问题
端口被占用
修改Bind ports里的本机端口.
比如容器内部还是8080,本机可以改成18080.
18080 -> 8080
容器需要访问宿主机服务
macOS的Docker Desktop里,容器访问宿主机可以使用:
host.docker.internal
比如容器里的程序要连接本机MySQL,可以把数据库地址配置成:
host.docker.internal:3306
挂载本机目录失败
检查Docker Desktop是否允许访问这个目录.
可以在Docker Desktop里查看:
Settings | Resources | File Sharing
总结
本地项目通过IDEA部署到macOS的Docker Desktop,核心就是两步:
- 在IDEA里配置
Docker for Mac - 在Run配置里选择
Docker | Dockerfile
如果只是运行已有镜像,才选择Docker | Docker Image.