Docker-Maven-Plugin
微服务部署有两种方法:
- 手动部署:首先基于源码打包生成jar包(或war包),写个Dockerfile文件,基于基础镜像搞个新镜像,将jar包(或war包)上传至虚拟机并拷贝至JDK容器。(太麻烦了)
- 通过Maven插件自动部署。 这也是企业实际开发中经常使用的方法。
Maven插件自动部署步骤
写在最前面:该方法有漏洞,容易被黑客远程放入挖矿机镜像,开启需做好防范,年少无知的我,开房了2375,没做ip限制,被拉去挖矿了。。。推荐使用CA加密端口
1、修改宿主机的docker配置,开放2375端口,让其可以远程访问
本地执行maven命令对于宿主机来说是远程操作,docker的远程操作是默认关闭的,先开启2375端口
首先在宿主机上执行命令,修改配置文件(centos 7)
vi /lib/systemd/system/docker.service
在ExecStart=
后添加配置 ‐H tcp://0.0.0.0:2375 ‐H unix:///var/run/docker.sock
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock \
unix://var/run/docker.sock
:unix socket,本地客户端将通过这个来连接 Docker Daemon
tcp://0.0.0.0:2375
:tcp socket,表示允许任何远程客户端通过 2375 端口连接 Docker Daemon。
原来
修改后
如果是centos7以下修改为
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375
2、刷新配置,重启服务
systemctl daemon-reload //加载docker守护线程
systemctl restart docker //重启docker
3、配置容器防火墙
即使开放了2375端口,外部也是不能访问的,只能内部访问,如果要让外部可以访问。得要配置下防火墙。如果阿里云不配置,当心被拉去挖矿-_-,我这是学校服务器,要vpn才能访问,无所谓
这里就关了
使用命令
systemctl stop firewalld (关闭防火墙)
systemctl disable firewalld (禁用防火墙,开机不会启动)
关闭 selinux
vi /etc/selinux/config,SELINUX=enforcing改为disabled
重启完成后,检查防火墙和selinux状态
systemctl status firewalld(查看防火墙状态)
secon(查看selinux状态)
阿里云建议配置安全诅
此时我连一下 docker
,成功
4、在pom.xml 添加配置
用下面配置就会自动生成Dockerfile
<build>
<finalName>testDocker</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!--docker的maven插件-->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.1.0</version>
<!--配置部分-->
<configuration>
<!--修改imageName节点的内容,改为私有仓库地址和端口,再加上镜像id和TAG,我们要直接传到私服-->
<!--配置最后生成的镜像名,docker images里的,我们这边取项目名:版本-->
<imageName>172.19.240.208:5000/${project.artifactId}:${project.version}</imageName>
<!--基础镜像,相当于Dockerfile里的from-->
<baseImage>ascdc/jdk8</baseImage>
<!--入口点,project.build.finalName就是project标签下的build标签下的filename标签内容,testDocker-->
<!--相当于启动容器后,会自动执行java-jar/testDocker.jar-->
<entryPoint>["java", "‐jar", "/${project.build.finalName}.jar"]</entryPoint>
<!--是否推送到docker私有仓库-->
<pushImage>true</pushImage>
<registryUrl>172.19.240.208:5000</registryUrl>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<!--把哪个文件上传到docker,相当于Dockerfile里的add testDocker.jar /-->
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
<dockerHost>http://172.19.240.208:2375</dockerHost>
</configuration>
</plugin>
</plugins>
</build>
注意,push到私有仓库有三点,并且前提是容器处于启动状态
<!-- 1、新增registryUrl节点,内容是私有仓库地址和端口(我这边设置了5000端口)-->
<registryUrl>你的ip:5000</registryUrl>
<!-- 2、新增pushImage节点 -->
<pushImage>true</pushImage>
<!-- 3、修改imageName节点的内容,改为私有仓库地址和端口,再加上镜像id和TAG,到仓库里的名字就是你的项目名:版本 -->
<imageName>你的ip:5000/${project.artifactId}:${project.version}</imageName>
mvn clean,mvn install一下,先放到本地仓库再说
然后执行mvn docker:build
命令创建镜像,如果还要上传,加个-DpushImage
参数
跑的时候有一个错误
[ERROR] Failed to execute goal com.spotify:docker-maven-plugin:1.1.0:build (default-cli) on project demo:
Exception caught: pull access denied for jdk1.8, repository does not exist or may require 'docker login':
denied: requested access to the resource is denied -> [Help 1]
百度查了一下,很多人说是要登录,实际上不是要登录,也不是仓库不存在,实际上是我的docker上没有jdk1.8的镜像文件,需要自己下一个,可以docker search jdk8,pull一个,或者自己传tar包上去然后Dockerfile搞一个。我直接pull了一个docker images
在项目中改下基础镜像名
成功构建并push上去
查看镜像
查看仓库