idea使用docker-maven-plugin插件將項目編譯爲docker鏡像到遠程linux服務器

       在使用idea開發時,直接docker-maven-plugin插件,把項目編譯成docker鏡像,而後經過docker:push推送到linux服務器,很是簡單,快捷,也避免了手動打包,而後拷貝war包到tomcat的麻煩了。如下是流程:java

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

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

綁定docker命令到maven各階段spring

這裏須要服務器開啓2375端口,後面詳細描述docker

具體代碼:apache

<!--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>

二、配置docker-wagon-plugin插件(非本次方式必須,能夠安裝,是另一種部署方式,直接經過wagon命令,直接把jar包推到服務器,而後替換)

具體代碼:json

<!--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>

三、完了後,能夠在maven-project看到docker插件和wagon插件

四、須要在上面配置的Linux服務器,經過docker開啓2375端口,提供外部訪問docker

編輯docker文件:/usr/lib/systemd/system/docker.servicevim

vim /usr/lib/systemd/system/docker.service

修改ExecStart行爲下面內容windows

ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock \

從新加載docker配置tomcat

systemctl daemon-reload // 1,加載docker守護線程
systemctl restart docker // 2,重啓docker

五、關閉防火牆

ss -luntp
systemctl status firewalld
systemctl  stop firewalld
systemctl  disable  firewalld

若是開放成功,訪問2375端口,會看到以下效果:安全

六、安全認證配置

當咱們 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>

 

七、測試、驗證

先配置鏡像images版本c-0311

執行完第一步,控制檯看到日誌,正在構建、打包jar

接下來,執行第二步,鏡像生成完成,且推到了內網了

接下來,去內網看下c-0311版本的鏡像已存在,則測試成功了!

 

八、相關報錯,以及解決辦法:

問題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

 

九、搭建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 拉去該鏡像便可

相關文章
相關標籤/搜索