idea使用docker-maven-plugin插件将项目编译为docker镜像到远程linux服务器

1、先配置docker-maven-plugin插件

ad5d9a0c8996bafe234c863baac5b4080bf.jpg

在pom文件中加入docker-maven-plugin插件相关配置

e104fa8d9e67925344c8530049f4e8e3f2a.jpg

绑定docker命令到maven各阶段

b3c862a2d8407e563bbea231371a561c163.jpg

这里需要服务器开启2375端口,后面详细描述

具体代码:

 
  1.  
    <!--docker 插件-->
  2.  
    <docker.repostory>hub.*****.com</docker.repostory>
  3.  
    <docker.registry.name>****</docker.registry.name>
 
  1.  
    <plugin>
  2.  
    <groupId>com.spotify</groupId>
  3.  
    <artifactId>docker-maven-plugin</artifactId>
  4.  
    <version>0.4.14</version>
  5.  
    <configuration>
  6.  
    <serverId>my-hub</serverId>
  7.  
    <registryUrl>http://${docker.repostory}</registryUrl>
  8.  
    <!--<pushImage>true</pushImage>-->
  9.  
    <imageName>${docker.repostory}/${docker.registry.name}/${project.artifactId}:${project.version}</imageName>
  10.  
    <imageTags>
  11.  
    <imageTag>${project.version}</imageTag>
  12.  
    <imageTag>latest</imageTag>
  13.  
    </imageTags>
  14.  
    <dockerHost>http://192.168.*.*:2375</dockerHost>
  15.  
    <baseImage>daocloud.io/library/java:openjdk-8u40</baseImage>
  16.  
    <entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
  17.  
    <exposes>
  18.  
    <expose>8080</expose>
  19.  
    </exposes>
  20.  
    <resources>
  21.  
    <resource>
  22.  
    <targetPath>/</targetPath>
  23.  
    <directory>${project.build.directory}</directory>
  24.  
    <include>${project.build.finalName}.jar</include>
  25.  
    </resource>
  26.  
    </resources>
  27.  
    </configuration>
  28.  
    <!-- 运行命令 mvn clean package docker:build 打包并生成docker镜像 -->
  29.  
    </plugin>
  30.  
    </plugins>

2、配置docker-wagon-plugin插件(非本次方式必须,可以安装,是另外一种部署方式,直接通过wagon命令,直接把jar包推到服务器,然后替换)

c6994cb17127accebf3f8ffd7395629ab81.jpg

b7b7dc0003ce4b23e277e82938772a3b1a3.jpg

3b6d9c6ed23aa0e2ca9037264dafea28fa4.jpg

具体代码:

 
  1.  
    <!--wagon plugin 配置-->
  2.  
    <service-path>/work/${project.artifactId}</service-path>
  3.  
    <pack-name>${project.artifactId}.jar</pack-name>
  4.  
    <remote-addr>192.168.*.*:*</remote-addr>
  5.  
    <remote-username>root</remote-username>
  6.  
    <remote-passwd>****</remote-passwd>
 
  1.  
    <extensions>
  2.  
    <extension>
  3.  
    <groupId>org.apache.maven.wagon</groupId>
  4.  
    <artifactId>wagon-ssh</artifactId>
  5.  
    <version>2.8</version>
  6.  
    </extension>
  7.  
    </extensions>
 
  1.  
    <plugin>
  2.  
    <groupId>org.codehaus.mojo</groupId>
  3.  
    <artifactId>wagon-maven-plugin</artifactId>
  4.  
    <version>1.0</version>
  5.  
    <configuration>
  6.  
    <fromFile>target/${pack-name}</fromFile>
  7.  
    <url><![CDATA[scp://${remote-username}:${remote-passwd}@${remote-addr}${service-path}]]></url>
  8.  
    <commands>
  9.  
    <!-- Kill Old Process -->
  10.  
    <command>kill -9 `ps -ef |grep ${project.artifactId}.jar|grep -v "grep" |awk "{print $2}"`</command>
  11.  
    <!-- Restart jar package,write result into renren.log -->
  12.  
    <command><![CDATA[nohup java -jar ${service-path}/${pack-name} --spring.profiles.active=test > ${service-path}/renren.log 2>&1 & ]]></command>
  13.  
    <command><![CDATA[netstat -nptl]]></command>
  14.  
    <command><![CDATA[ps -ef | grep java | grep -v grep]]></command>
  15.  
    </commands>
  16.  
    <!-- 运行命令 mvn clean package wagon:upload-single wagon:sshexec-->
  17.  
    <displayCommandOutputs>true</displayCommandOutputs>
  18.  
    </configuration>
  19.  
    </plugin>

3、完了后,可以在maven-project看到docker插件和wagon插件

a22119cb65f7c5e4b1ffa71ce6277ab0a54.jpg

44467a6264c932b6293be01b9d9f15b7caa.jpg

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 

f6a739413380bbb344bed7679474d7d81ce.jpg

重新加载docker配置

 
  1.  
    systemctl daemon-reload // 1,加载docker守护线程
  2.  
    systemctl restart docker // 2,重启docker

5、关闭防火墙

ss -luntp
systemctl status firewalld
 
  1.  
    systemctl stop firewalld
  2.  
    systemctl disable firewalld

9d4e1f2dd9fadc8bec12e29da5268f3886d.jpg

如果开放成功,访问2375端口,会看到如下效果:

6b40e66decfd8d6ea1a9fd37381229bae51.jpg

6、安全认证配置

当我们 push 镜像到 Docker 仓库中时,不管是共有还是私有,经常会需要安全认证,登录完成之后才可以进行操作。当然,我们可以通过命令行

docker login -u user_name -p password docker_registry_host 

登录,但是对于自动化流程来说,就不是很方便了。使用 docker-maven-plugin 插件我们可以很容易实现安全认证。
首先在 Maven 的配置文件 setting.xml 中增加相关 server 配置,主要配置 Docker registry用户认证信息。

路径:

dae9ce3c405e2a5a83c06ceb6ac6de0b9ca.jpg

99743e342d8822e1c4ff82b6d51ff9944a3.jpg

 
  1.  
    <servers>
  2.  
    <server>
  3.  
    <id>my-hub</id>
  4.  
    <username>**</username>
  5.  
    <password>***</password>
  6.  
    <configuration>
  7.  
    <email>***@163.com</email>
  8.  
    </configuration>
  9.  
    </server>

 

7、测试、验证

先配置镜像images版本c-0311

2018d03841dca838ef4706ab308c72a578e.jpg

b2415462a49fc07185c68ac2c5b28b63b74.jpg

执行完第一步,控制台看到日志,正在构建、打包jar

55860893d5e3f6d89e17897ada0c5980529.jpg

接下来,执行第二步,镜像生成完成,且推到了内网了

12b5ca165781c4b02a4662eff4bc0b97786.jpg

接下来,去内网看下c-0311版本的镜像已存在,则测试成功了!

050f599864f95df75dece6c0f2ae38e1b35.jpg

 

8、相关报错,以及解决办法:

问题1:

docker pull 的时候报错 Get https://hub.xxx.com/v1/_ping: dial tcp 192.168.1.8:443: getsockopt: connection refused
 
  1.  
    内网搭建自己的docker 仓库时遇到这个问题,原因是docker 默认不支持http的registry ,
  2.  
    vim /etc/docker/daemon.json 添加 { "insecure-registries":["hub.***.com"] }
  3.  
     
  4.  
    hub.***.com 这是私有docker仓库域名,与前面配置匹配
  5.  
     
  6.  
    重启 docker
  7.  
    systemctl restart docker.service

问题2:

 
  1.  
    #内网连不上harbor线上仓库
  2.  
    [root@localhost ~]# docker login hub.***.com
  3.  
    Username: user1
  4.  
    Password:
  5.  
    Error response from daemon: Get http://hub.***.com/v1/users/: dial tcp: lookup hub.***.com on 222.86.101.63:53: no such host
  6.  
    #甚至连ping都不通时
  7.  
    [root@localhost ~]# ping hub.***.com
  8.  
    ping: hub.***.com: 未知的名称或服务
  9.  
     
  10.  
     
  11.  
    #解决办法,配置hosts
  12.  
    [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文件的解决办法:

c26045c51d8b988ca60aa9069f01e6f45dd.jpg

e05af8c70f665757cecfd84811c93f51318.jpg

 

都OK后,会发现  docker:build 命令,控制台会推送成功,也可到线上仓库去检查

ffb717e86767b8bbf2eb5fa7fbbbf1807c4.jpg

 

线上环境直接  docker pull 拉去该镜像即可