Docker - 在IntelliJ IDEA中一键部署项目
一、 docker开启远程连接访问
首先我们要开启docker的远程连接访问。保证不是docker所在的服务器,也能够远程访问docker。
Linux版的docker:
修改 docker.service 文件,添加监听端口 -H tcp://0.0.0.0:2375
vi /usr/lib/systemd/system/docker.service
找到 ExecStart,在最后面添加 -H tcp://0.0.0.0:2375,如下图所示
1.重启docker
systemctl daemon-reload
systemctl start docker
二、安装配置idea的docker插件
在File --> Settings --> Plugins 在输入框中搜索Docker,选择并安装。安装完成后重启Docker。
配置docker
在File–> Settings–>Build,Execution,Deployment中找到Docker
新建一个docker实例,然后在Engine API URL中将docker所在ip端口号填上,填完如果下面显示Connection successful证明连接docker成功。如果失败,可能是我们上一步docker开启远程连接未成功。
我们设置完成后,回到idea主界面,可以看到页面下面有一个docker窗口。点击绿色箭头,连接docker。连接上后显示Containers和Images就是我们现在docker中已经有的容器和镜像。
三、配置项目
1.在你项目中的pom.xml文件中新增docker插件:
<!--使用docker-maven-plugin插件-->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<!--将插件绑定在某个phase执行-->
<executions>
<execution>
<id>build-image</id>
<!--将插件绑定在package这个phase上。也就是说,
用户只需执行mvn package ,就会自动执行mvn docker:build-->
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<!--指定生成的镜像名,这里是我们的项目名-->
<imageName>${project.artifactId}</imageName>
<!--指定标签 这里指定的是镜像的版本,我们默认版本是latest-->
<imageTags>
<imageTag>latest</imageTag>
</imageTags>
<!-- 指定我们项目中Dockerfile文件的路径-->
<dockerDirectory>${project.basedir}/src/main/resources</dockerDirectory>
<!--指定远程docker 地址-->
<dockerHost>http://127.0.0.1:2375</dockerHost>
<!-- 这里是复制 jar 包到 docker 容器指定目录配置 -->
<resources>
<resource>
<targetPath>/</targetPath>
<!--jar包所在的路径 此处配置的即对应项目中target目录-->
<directory>${project.build.directory}</directory>
<!-- 需要包含的 jar包 ,这里对应的是 Dockerfile中添加的文件名 -->
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
2. 在项目的src\main\resources目录下新建文件Dockerfile,没有后缀,内容如下:
FROM jdk8:1
VOLUME /tmp
ADD *.jar app.jar
EXPOSE 8888
ENTRYPOINT [ "java","-jar", "/app.jar" ]
其中8888这个端口要和你的项目端口一致,自行修改即可。
这里的FROM jdk8:1
是指要基于一个已有的镜像,在这里这个镜像是提供了jdk8环境的。这个镜像是我自己创建的,如果不知道怎么创建镜像,可以看我的这篇文章:Docker学习笔记-4 创建镜像。
如果不想自己创建镜像,也可以使用仓库中已有的jdk8镜像,可以使用docker search jdk8
来搜索,选择一个然后使用docker pull 镜像名
命令将镜像拉到本地。
四、构建镜像
刚才我们已经创建了Dockerfile文件,也配置了maven插件,现在我们运行mvn package命令即可。成功后可以看到docker镜像中已经有了我们项目名的镜像:
五、创建容器,运行项目
我们在docker窗口中,找到我们刚才创建的镜像文件,鼠标右键,选择Create container,我们修改创建容器所需要的配置。
填写响应的信息:
创建好容器之后就能看到了,点击运行即可:
这时我们就能访问宿主机的8889端口来访问我们的项目端口了。
六、问题
1. 大量旧镜像和关闭的容器占用磁盘空间
这种idea一键部署项目的方式虽然方便,但是部署的次数多了就会导致docker文件目录存了很多旧镜像文件和关闭的容器,我们可以用下面的命令来清理这些不需要的文件
docker system prune
也可以加参数"-a"清理的更彻底,这个要慎用,会把没有启动容器的镜像都清除掉:
docker system prune -a
2. 部署好项目后访问失败
如果访问不到,可以在宿主机用curl http://localhost:8889/项目名 来测试,如果报下面这个错误,可以看看我这篇文章Docker - curl: (56) Recv failure: Connection reset by peer解决方式,我也遇到了这个问题,这个好像是docker server的bug,目前还没有好的解决方案只能重建docker0虚拟网卡。