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,如下图所示
image

1.重启docker

systemctl daemon-reload
systemctl start docker

二、安装配置idea的docker插件

在File --> Settings --> Plugins 在输入框中搜索Docker,选择并安装。安装完成后重启Docker。
image

配置docker
在File–> Settings–>Build,Execution,Deployment中找到Docker

新建一个docker实例,然后在Engine API URL中将docker所在ip端口号填上,填完如果下面显示Connection successful证明连接docker成功。如果失败,可能是我们上一步docker开启远程连接未成功。
image
我们设置完成后,回到idea主界面,可以看到页面下面有一个docker窗口。点击绿色箭头,连接docker。连接上后显示Containers和Images就是我们现在docker中已经有的容器和镜像。
image

三、配置项目

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镜像中已经有了我们项目名的镜像:
image

五、创建容器,运行项目

我们在docker窗口中,找到我们刚才创建的镜像文件,鼠标右键,选择Create container,我们修改创建容器所需要的配置。
image
填写响应的信息:
image

创建好容器之后就能看到了,点击运行即可:
image

这时我们就能访问宿主机的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虚拟网卡。

posted @ 2022-10-26 16:47  hucat  阅读(663)  评论(0编辑  收藏  举报