使用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>