idea使用docker-maven-plugin插件将项目编译为docker镜像到远程linux服务器
1、先配置docker-maven-plugin插件
在pom文件中加入docker-maven-plugin插件相关配置
绑定docker命令到maven各阶段
这里需要服务器开启2375端口,后面详细描述
具体代码:
-
<!--docker 插件-->
-
<docker.repostory>hub.*****.com</docker.repostory>
-
<docker.registry.name>****</docker.registry.name>
-
<plugin>
-
<groupId>com.spotify</groupId>
-
<artifactId>docker-maven-plugin</artifactId>
-
<version>0.4.14</version>
-
<configuration>
-
<serverId>my-hub</serverId>
-
<registryUrl>http://${docker.repostory}</registryUrl>
-
<!--<pushImage>true</pushImage>-->
-
<imageName>${docker.repostory}/${docker.registry.name}/${project.artifactId}:${project.version}</imageName>
-
<imageTags>
-
<imageTag>${project.version}</imageTag>
-
<imageTag>latest</imageTag>
-
</imageTags>
-
<dockerHost>http://192.168.*.*:2375</dockerHost>
-
<baseImage>daocloud.io/library/java:openjdk-8u40</baseImage>
-
<entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
-
<exposes>
-
<expose>8080</expose>
-
</exposes>
-
<resources>
-
<resource>
-
<targetPath>/</targetPath>
-
<directory>${project.build.directory}</directory>
-
<include>${project.build.finalName}.jar</include>
-
</resource>
-
</resources>
-
</configuration>
-
<!-- 运行命令 mvn clean package docker:build 打包并生成docker镜像 -->
-
</plugin>
-
</plugins>
2、配置docker-wagon-plugin插件(非本次方式必须,可以安装,是另外一种部署方式,直接通过wagon命令,直接把jar包推到服务器,然后替换)
具体代码:
-
<!--wagon plugin 配置-->
-
<service-path>/work/${project.artifactId}</service-path>
-
<pack-name>${project.artifactId}.jar</pack-name>
-
<remote-addr>192.168.*.*:*</remote-addr>
-
<remote-username>root</remote-username>
-
<remote-passwd>****</remote-passwd>
-
<extensions>
-
<extension>
-
<groupId>org.apache.maven.wagon</groupId>
-
<artifactId>wagon-ssh</artifactId>
-
<version>2.8</version>
-
</extension>
-
</extensions>
-
<plugin>
-
<groupId>org.codehaus.mojo</groupId>
-
<artifactId>wagon-maven-plugin</artifactId>
-
<version>1.0</version>
-
<configuration>
-
<fromFile>target/${pack-name}</fromFile>
-
<url><![CDATA[scp://${remote-username}:${remote-passwd}@${remote-addr}${service-path}]]></url>
-
<commands>
-
<!-- Kill Old Process -->
-
<command>kill -9 `ps -ef |grep ${project.artifactId}.jar|grep -v "grep" |awk "{print $2}"`</command>
-
<!-- Restart jar package,write result into renren.log -->
-
<command><![CDATA[nohup java -jar ${service-path}/${pack-name} --spring.profiles.active=test > ${service-path}/renren.log 2>&1 & ]]></command>
-
<command><![CDATA[netstat -nptl]]></command>
-
<command><![CDATA[ps -ef | grep java | grep -v grep]]></command>
-
</commands>
-
<!-- 运行命令 mvn clean package wagon:upload-single wagon:sshexec-->
-
<displayCommandOutputs>true</displayCommandOutputs>
-
</configuration>
-
</plugin>
3、完了后,可以在maven-project看到docker插件和wagon插件
4、需要在上面配置的Linux服务器,通过docker开启2375端口,提供外部访问docker
编辑docker文件:/usr/lib/systemd/system/docker.service
vim /usr/lib/systemd/system/docker.service
修改ExecStart行为下面内容
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
重新加载docker配置
-
systemctl daemon-reload // 1,加载docker守护线程
-
systemctl restart docker // 2,重启docker
5、关闭防火墙
ss -luntp
systemctl status firewalld
-
systemctl stop firewalld
-
systemctl disable firewalld
如果开放成功,访问2375端口,会看到如下效果:
6、安全认证配置
当我们 push 镜像到 Docker 仓库中时,不管是共有还是私有,经常会需要安全认证,登录完成之后才可以进行操作。当然,我们可以通过命令行
docker login -u user_name -p password docker_registry_host
登录,但是对于自动化流程来说,就不是很方便了。使用 docker-maven-plugin 插件我们可以很容易实现安全认证。
首先在 Maven 的配置文件 setting.xml 中增加相关 server 配置,主要配置 Docker registry用户认证信息。
路径:
-
<servers>
-
<server>
-
<id>my-hub</id>
-
<username>**</username>
-
<password>***</password>
-
<configuration>
-
<email>***@163.com</email>
-
</configuration>
-
</server>
7、测试、验证
先配置镜像images版本c-0311
执行完第一步,控制台看到日志,正在构建、打包jar
接下来,执行第二步,镜像生成完成,且推到了内网了
接下来,去内网看下c-0311版本的镜像已存在,则测试成功了!
8、相关报错,以及解决办法:
问题1:
docker pull 的时候报错 Get https://hub.xxx.com/v1/_ping: dial tcp 192.168.1.8:443: getsockopt: connection refused
-
内网搭建自己的docker 仓库时遇到这个问题,原因是docker 默认不支持http的registry ,
-
vim /etc/docker/daemon.json 添加 { "insecure-registries":["hub.***.com"] }
-
-
hub.***.com 这是私有docker仓库域名,与前面配置匹配
-
-
重启 docker
-
systemctl restart docker.service
问题2:
-
#内网连不上harbor线上仓库
-
[root@localhost ~]# docker login hub.***.com
-
Username: user1
-
Password:
-
Error response from daemon: Get http://hub.***.com/v1/users/: dial tcp: lookup hub.***.com on 222.86.101.63:53: no such host
-
#甚至连ping都不通时
-
[root@localhost ~]# ping hub.***.com
-
ping: hub.***.com: 未知的名称或服务
-
-
-
#解决办法,配置hosts
-
[root@localhost ~]# vi /etc/hosts
9、搭建docker私有镜像仓库Harhor
具体操作详见另外一篇博客:Centos7安装Docker镜像仓库Harbor1.5.3
在域名的服务器上搭建了镜像仓库Harbor后,需要确保以下几个地方都正确:
a、在https://hub.***.com,注册普通账号,然后新建普通账号的项目,用以保存镜像
b、把注册好的harbor账号密码,配置在maven的setting.xml上
c、在idea的pom设定推送的地址为 hub.***.com,与前面配置好的Harbor地址一致
把 docker-maven-plugin 下的 pushImage标签的注释放开
<pushImage>true</pushImage>
需要确保 ${docker.repostory} 的指与线上hub仓库地址一致了
d、需要保证内网以及开发的windows环境能访问的通线上的镜像仓库地址,配置hosts文件
这里贴一个,如果碰上没有权限修改hosts文件的解决办法:
都OK后,会发现 docker:build 命令,控制台会推送成功,也可到线上仓库去检查
线上环境直接 docker pull 拉去该镜像即可