使用Maven來構建Docker鏡像並上傳到私服倉庫
maven是一個強大的項目管理與構建工具,使用maven來構建docker鏡像,並自動上傳到私服倉庫,那麼就大大簡化了工作。
看到網上大部分都是使用的Spotify公司的插件,這裏我也選則此插件進行學習。
一 pom.xml中添加docker的插件
<build>
<plugins>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<configuration>
<forceTags>true</forceTags> <!--覆蓋相同標籤鏡像-->
<imageName>my/eureka:0.0.1</imageName> <!--指定鏡像名稱 倉庫/鏡像名:標籤-->
<baseImage>lwieske/java-8</baseImage> <!--指定基礎鏡像,相當於dockerFile中的FROM<image> -->
<dockerHost>http://192.168.10.72:2375</dockerHost> <!-- 指定倉庫地址 -->
<entryPoint>["java","-jar","/${project.build.finalName}.jar"]</entryPoint> <!-- 容器啓動執行的命令,相當於dockerFile的ENTRYPOINT -->
<resources>
<resource> <!-- 指定資源文件 -->
<targetPath>/</targetPath> <!-- 指定要複製的目錄路徑,這裏是當前目錄 -->
<directory>${project.build.directory}</directory> <!-- 指定要複製的根目錄,這裏是target目錄 -->
<include>${project.build.finalName}.jar</include> <!-- 指定需要拷貝的文件,這裏指最後生成的jar包 -->
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
二 docker開啓遠程api端口
修改 /etc/sysconfig/docker文件
vi /etc/sysconfig/docker
在最下面添加一行
DOCKER_OPTS='-H unix:///var/run/docker.sock -H 0.0.0.0:2375'
再修改 /usr/systemd/system/docker.service
vi /usr/systemd/system/docker.service
在ExecStart後面添加 $DOCKER_OPTS \重新加載配置文件
systemctl daemon-reload
重啓docker
systemctl restart docker
三 開啓防火牆端口
firewall-cmd --zone=public --add-port=2375/tcp --permanent (--permanent永久生效,沒有此參數重啓後失效)
重新載入配置
irewall-cmd --reload
四 執行mvn命令來構建docker鏡像
運行命令
查看服務器上鏡像列表
運行鏡像
查看結果
可以看到我們的項目已經成功啓動了,並且在主機可以直接訪問,這說明docker自動幫我們開啓了防火牆的端口訪問。
如果要使用dockerfile構建鏡像
FROM lwieske/java-8
VOLUME /tmp
ADD discovery-1.0-SNAPSHOT.jar discovery.jar
EXPOSE 8002
CMD ["java","-Djava.security.egd=file:/dev/./urandom","-jar","discovery.jar"]
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<configuration>
<forceTags>true</forceTags> <!--覆蓋相同標籤鏡像-->
<imageName>my/eureka:0.0.2</imageName> <!--指定鏡像名稱 倉庫/鏡像名:標籤-->
<dockerHost>http://192.168.10.73:2375</dockerHost> <!-- 指定倉庫地址 -->
<dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory> <!--dockerfile文件路徑-->
<resources>
<resource> <!-- 指定資源文件 -->
<targetPath>/</targetPath> <!-- 指定要複製的目錄路徑,這裏是當前目錄 -->
<directory>${project.build.directory}</directory> <!-- 指定要複製的根目錄,這裏是target目錄 -->
<include>${project.build.finalName}.jar</include> <!-- 指定需要拷貝的文件,這裏指最後生成的jar包 -->
</resource>
</resources>
</configuration>
</plugin>
測試運行dockerfile構建的鏡像
五 將docker綁定到mvn其它命令執行
比如我們想在項目mvn package的時候同時構建docker上傳到服務器。
<build>
<plugins>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<executions>
<execution>
<id>build-image</id> <!--定義一個執行命令的id-->
<phase>package</phase> <!--綁定mvn的哪個命令-->
<goals>
<goal>build</goal> <!--要執行的命令 -->
</goals>
</execution>
</executions>
<configuration>
<forceTags>true</forceTags> <!--覆蓋相同標籤鏡像-->
<imageName>my/eureka:0.0.1</imageName> <!--指定鏡像名稱 倉庫/鏡像名:標籤-->
<baseImage>lwieske/java-8</baseImage> <!--指定基礎鏡像,相當於dockerFile中的FROM<image> -->
<dockerHost>http://192.168.10.72:2375</dockerHost> <!-- 指定倉庫地址 -->
<entryPoint>["java","-jar","/${project.build.finalName}.jar"]</entryPoint> <!-- 容器啓動執行的命令,相當於dockerFile的ENTRYPOINT -->
<resources>
<resource> <!-- 指定資源文件 -->
<targetPath>/</targetPath> <!-- 指定要複製的目錄路徑,這裏是當前目錄 -->
<directory>${project.build.directory}</directory> <!-- 指定要複製的根目錄,這裏是target目錄 -->
<include>${project.build.finalName}.jar</include> <!-- 指定需要拷貝的文件,這裏指最後生成的jar包 -->
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
可以看到,我們在原來的基礎上只是新增了<executions/>標籤內容,運行測試結果
六 mvn構建docker後並push到私服倉庫
<build>
<plugins>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<executions>
<execution>
<id>build-image</id> <!--定義一個執行命令的id-->
<phase>package</phase> <!--綁定mvn的哪個命令-->
<goals>
<goal>build</goal> <!--要執行的命令 -->
</goals>
</execution>
<execution>
<id>image-tag</id>
<phase>package</phase>
<goals>
<goal>tag</goal> <!--tag命令,相當於docker的tag命令-->
</goals>
<configuration>
<image>my/eureka:0.0.1</image> <!--鏡像名-->
<newName>192.168.10.73:5000/my/eureka:0.0.1</newName> <!--打的標籤名-->
</configuration>
</execution>
<execution>
<id>package-push</id>
<phase>package</phase>
<goals>
<goal>push</goal> <!--相當於docker的push命令-->
</goals>
<configuration>
<imageName>192.168.10.73:5000/my/eureka:0.0.1</imageName> <!--要push的鏡像名-->
</configuration>
</execution>
</executions>
<configuration>
<forceTags>true</forceTags> <!--覆蓋相同標籤鏡像-->
<imageName>my/eureka:0.0.1</imageName> <!--指定鏡像名稱 倉庫/鏡像名:標籤-->
<baseImage>lwieske/java-8</baseImage> <!--指定基礎鏡像,相當於dockerFile中的FROM<image> -->
<dockerHost>http://192.168.10.73:2375</dockerHost> <!-- 指定倉庫地址 -->
<entryPoint>["java","-jar","/${project.build.finalName}.jar"]</entryPoint> <!-- 容器啓動執行的命令,相當於dockerFile的ENTRYPOINT -->
<resources>
<resource> <!-- 指定資源文件 -->
<targetPath>/</targetPath> <!-- 指定要複製的目錄路徑,這裏是當前目錄 -->
<directory>${project.build.directory}</directory> <!-- 指定要複製的根目錄,這裏是target目錄 -->
<include>${project.build.finalName}.jar</include> <!-- 指定需要拷貝的文件,這裏指最後生成的jar包 -->
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
可以看到,又綁定了兩個命令,類似於在docker中先給鏡像打標籤後再push到倉庫
測試運行
將鏡像推送到私有庫,報協議錯誤
error:Get https://192.168.10.73:5000/v1/_ping: http: server gave HTTP response to HTTPS client
在/etc/docker下,創建daemon.json文件,寫入:
{ "insecure-registries":["192.168.10.73:5000"]}
或者
1.修改/etc/sysconfig/docker文件,在最後增加一行DOCKER_OPTS
DOCKER_OPTIONS="--insecure-registry 192.168.10.73:5000"
2.修改/usr/lib/systemd/system/docker.service
在[Service]的ExexStart=下面增加一行$DOCKER_OPTIONS
error:Get https://192.168.10.73:5000/v1/_ping: http: server gave HTTP response to HTTPS client
在/etc/docker下,創建daemon.json文件,寫入:
{ "insecure-registries":["192.168.10.73:5000"]}
或者
1.修改/etc/sysconfig/docker文件,在最後增加一行DOCKER_OPTS
DOCKER_OPTIONS="--insecure-registry 192.168.10.73:5000"
2.修改/usr/lib/systemd/system/docker.service
在[Service]的ExexStart=下面增加一行$DOCKER_OPTIONS
注意:改成自己服務器ip地址
重啓docker後,再次執行
push成功,我們看一下遠程倉庫是否有這個鏡像
七 push鏡像到docker hub 上
在maven的 settings.xml 中添加
<servers>
<server>
<id>docker-hub</id>
<username>DockerHub 的賬號</username>
<password>DockerHub 的密碼</password>
<configuration>
<email>你的eamil</email>
</configuration>
</server>
</servers>
pom.xml中修改如下
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<configuration>
<forceTags>true</forceTags> <!--覆蓋相同標籤鏡像-->
<imageName>my/eureka:0.0.2</imageName> <!--指定鏡像名稱 倉庫/鏡像名:標籤-->
<dockerHost>http://192.168.10.73:2375</dockerHost> <!-- 指定倉庫地址 -->
<dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory> <!--dockerfile文件路徑-->
<resources>
<resource> <!-- 指定資源文件 -->
<targetPath>/</targetPath> <!-- 指定要複製的目錄路徑,這裏是當前目錄 -->
<directory>${project.build.directory}</directory> <!-- 指定要複製的根目錄,這裏是target目錄 -->
<include>${project.build.finalName}.jar</include> <!-- 指定需要拷貝的文件,這裏指最後生成的jar包 -->
</resource>
</resources>
<serverId>docker-hub</serverId> <!--mvn setting.xml配置的那個id-->
</configuration>
</plugin>