当前位置:   article > 正文

Maven生成和推送Docker镜像到Docker仓库( IDEA 亲测可用)_maven 与 docker

maven 与 docker

目录

1.搭建私有Docker镜像仓库

1.搭建docker registry

2.搭建docker registry web UI:

2.Maven创建并上传Docker镜像:

1.允许docker被远程访问

2.重启docker服务

3.构建和上传Docker镜像(不适用IDEA)

4.构建并上传Docker镜像(适用IDEA)


1.搭建私有Docker镜像仓库

1.搭建docker registry

参考文档:docker-registry私有镜像库搭建并配置密码登录_知难行难1985的博客-CSDN博客

docker registry 2 with tls and basic authentication-布布扣-bubuko.com

官网:Registry - Official Image | Docker Hub 

Deploy a registry server | Docker Documentation

我们设置docker registry登录时需要账号和密码

1. 新建密码目录: 

/docker/registry/auth, 存放用户密码文件
2. 下载htpasswd

因为新版版的docker registry没有htpasswd命令(是指运行的registry的容器里没有htpasswd命令),所以自己下载htpasswd,注意:这个不是在容器里运行,是在vm。
然后用htpasswd生成用户名和密码文件
# yum install httpd-tools -y
3. 生成htpasswd:
# htpasswd -Bbn bruce 12345678 > htpasswd
前一个htpasswd是命令,后面一个htpasswd是生成的用户名密码文件,然后把这个密码文件htpasswd, 放到 /docker/registry/auth
(网上有很多是这样的: docker run --entrypoint htpasswd registry:2 -Bbn testuser password > htpasswd,这个命令行是指运行docker registry容器里的 htpasswd命令。但在报错: "exec: \"htpasswd\": executable file not found in $PATH": unknown,原先的registry版本有这个命令,但是现在没有了。当然了,这个需要提前pull registry的镜像)

4.创建docker registry指令:

docker run -d -p 5000:5000 --name registry-srv --restart=always -v /docker/registry/auth:/auth/ -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd -e REGISTRY_STORAGE_DELETE_ENABLED=true -v /usr/local/dockerregistry:/var/lib/registry/ registry:latest

5.允许http方式访问(重要):

有兴趣的可以搭建https方式去访问的docker镜像仓库,在这里不赘述了

(1).修改文件/etc/docker/daemon.json,增加"insecure-registries"配置

Note:注意了,这里要加上ELB的访问地址

vi /etc/docker/daemon.json

[root@dev-68499-04i2g registry-web]# cat /etc/docker/daemon.json
{
    "storage-driver": "devicemapper",
    "storage-opts": [
        "dm.thinpooldev=/dev/mapper/vgpaas-thinpool",
        "dm.use_deferred_removal=true",
        "dm.fs=ext4",
        "dm.use_deferred_deletion=true",
        "dm.basesize=10G"
    ],
    "insecure-registries":["10.***.***.208:5000","119.***.***.184:31000",]

(2).重启docker服务

#systemctl daemon-reload  (加载配置)

#systemctl restart docker 

6.登录Docker镜像仓库:

docker login 119.***.***.184:31000

至此,docker镜像仓库搭建完毕。

2.搭建docker registry web UI:

参考文档:docker-registry私有镜像库搭建并配置密码登录_知难行难1985的博客-CSDN博客

官网:konradkleine/docker-registry-frontend - Docker Image | Docker Hub

1.启动镜像:

创建konradkleine/docker-registry-frontend:v2指令:
docker run -d -e ENV_DOCKER_REGISTRY_HOST=119.3.248.184 -e ENV_DOCKER_REGISTRY_PORT=31000 -p 31200:80 konradkleine/docker-registry-frontend:v2

2.浏览器登录:

账号密码就用上面给docker registry创建的账号密码。

2.Maven创建并上传Docker镜像:

对于maven工程来说,需要使用docker-maven-plugin插件来完成Docker镜像的生成和上传。

docker-maven-plugin 官网地址(重要):

GitHub - spotify/docker-maven-plugin: INACTIVE: A maven plugin for Docker

1.允许docker被远程访问

我们不在windows本地安装Docker服务,而是使用华为云服务器CCE(K8s集群)中已有的docker服务去创建docker镜像,所以需要配置华为云docker服务允许远程访问

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

添加-H tcp://0.0.0.0:30100 -H unix:///var/run/docker.sock \,监听端口可以自己随意定,但是要确保华为云安全组已经放行。

2.重启docker服务

#systemctl daemon-reload  (加载配置)

#systemctl restart docker  

直接curl看是否生效
curl http://127.0.0.1:30100/info

3.构建和上传Docker镜像(不适用IDEA)

1.添加Docker镜像仓库的用户名密码配置

修改maven的settings.xml文件,增加<server>配置

  1. <servers>
  2. <server>
  3. <id>docker-registry</id>
  4. <username>crm</username>
  5. <password>******(直接填密码就行)</password>
  6. <configuration>
  7. <email>wdquan1985@163.com</email>
  8. </configuration>
  9. </server>
  10. </servers>

 2.创建Dockerfile内容如下:

使用Dockerfile去创建镜像,将其放到我们工程的src/main/docker目录下

  1. FROM openjdk:8u212-jdk-stretch
  2. COPY demo-0.0.1-SNAPSHOT.jar /tmp/demo-0.0.1-SNAPSHOT.jar
  3. #这个配置“-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=32001”可以不要,本来打算配置远程调试的,但是华为云网络配置太复杂,没搞成。
  4. CMD java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=32001 -jar /tmp/demo-0.0.1-SNAPSHOT.ja

3.pom.xml文件修改:

然后修改maven工程的pom.xml文件(在docker-maven-plugin官网GitHub - spotify/docker-maven-plugin: INACTIVE: A maven plugin for Docker有)

  1. <plugin>
  2. <plugin>
  3. <groupId>com.spotify</groupId>
  4. <artifactId>docker-maven-plugin</artifactId>
  5. <version>VERSION GOES HERE</version>
  6. <configuration>
  7. [...]
  8. <!-- 引用settings.xml文件中的Docker registry 账号密码配置 -->
  9. <serverId>docker-registry</serverId>
  10. <!-- 指定Docker registry访问地址 -->
  11. <registryUrl>http://1**.***.***.184:31000/v2/</registryUrl>
  12. </configuration>
  13. </plugin>
  14. </plugins>

具体修改:

pom.xml文件应该怎样修改,细节很多,具体请看官网,在这里给出我整体修改的结果,并且给出注释

  1. <properties>
  2. <docker.imageName>119.3.248.184:31000/brucetest</docker.imageName>
  3. <docker.tag>3.0</docker.tag>
  4. </properties>
  5. .................................................................................
  6. .................................................................................
  7. <build>
  8. <plugins>
  9. <plugin>
  10. <groupId>org.springframework.boot</groupId>
  11. <artifactId>spring-boot-maven-plugin</artifactId>
  12. </plugin>
  13. <!--加上docker插件,插件源码地址:https://github.com/spotify/docker-maven-plugin-->
  14. <plugin>
  15. <groupId>com.spotify</groupId>
  16. <artifactId>docker-maven-plugin</artifactId>
  17. <version>1.2.2</version>
  18. <executions>
  19. <execution>
  20. <id>build-image</id>
  21. <phase>package</phase>
  22. <goals>
  23. <goal>build</goal>
  24. </goals>
  25. </execution>
  26. <execution>
  27. <id>tag-image</id>
  28. <phase>package</phase>
  29. <goals>
  30. <goal>tag</goal>
  31. </goals>
  32. <configuration>
  33. <image>${docker.imageName}:latest</image>
  34. <newName>${docker.imageName}:${docker.tag}</newName>
  35. </configuration>
  36. </execution>
  37. <execution>
  38. <id>push-image</id>
  39. <phase>deploy</phase>
  40. <goals>
  41. <goal>push</goal>
  42. </goals>
  43. <configuration>
  44. <imageName>${docker.imageName}:${docker.tag}</imageName>
  45. </configuration>
  46. </execution>
  47. </executions>
  48. <configuration>
  49. <!--在maven的settings.xml文件中定义了docker registry的账号密码,下面的属性表示使用账号密码 -->
  50. <serverId>docker-registry</serverId>
  51. <!--指定docker registry 地址 -->
  52. <registryUrl>http://119.***.***.184:31000/v2/</registryUrl>
  53. <!--指定镜像名, 带着docker registry信息,如果不带,则不会被推送到docker registry-->
  54. <imageName>${docker.imageName}</imageName>
  55. <!--指定标签-->
  56. <imageTags>
  57. <imageTag>${docker.tag}</imageTag>
  58. </imageTags>
  59. <!-- build 完成后 push 镜像 -->
  60. <!--<pushImage>true</pushImage>-->
  61. <pushImageTag>true</pushImageTag>
  62. <!--指定远程 docker api地址 -->
  63. <dockerHost>http://119.***.***.184:30100</dockerHost>
  64. <!-- 使用Dockfile,指定 Dockerfile 路径-->
  65. <dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
  66. <resources>
  67. <resource>
  68. <targetPath>/</targetPath>
  69. <directory>${project.build.directory}</directory>
  70. <include>${project.build.finalName}.jar</include>
  71. </resource>
  72. </resources>
  73. </configuration>
  74. </plugin>
  75. </plugins>
  76. </build>

4.创建并上传docker镜像:

具体使用什么命令去执行,先看官网描述:

 刚开始的时候,使用指令:

mvn clean package docker:build -DpushImage -Dmaven.test.skip=true

总是报错:

错误信息里发现,每次都要向docker hub(docker.io/library/)和我的docker私有镜像仓库同时上传镜像,但是我只想上传到我的docker私有镜像仓库啊,怎么同时会上传到docker hub???

于是我使用了另外一条指令:

mvn clean package docker:build -DpushImageTag -Dmaven.test.skip=true 

发现成功了,不会向docker hub上传镜像,只会向我的docker私有仓库上传

但这是为什么呢?看官网的描述:

我给我的镜像配置了<imageTag>标签,然后命令中的参数“-DpushImageTag”表示只上传添加了imageTag的镜像,也就是“119.***.***.***:31000/brucetest:3.0”,这个镜像配置了Docke私有镜像仓库的host和port,所以其只上传到docker私有镜像仓库。

  1. <!--指定镜像名, 带着docker registry信息,如果不带,则不会被推送到docker registry-->
  2. <imageName>119.***.***.***:31000/brucetest</imageName>
  3. <!--指定标签-->
  4. <imageTags>
  5. <imageTag>3.0</imageTag>
  6. </imageTags>

4.构建并上传Docker镜像(适用IDEA)

在上面配置的基础上,只需要修改pom.xml文件中的一处地方,增加<pushImageTag>配置(当然了,与其对应的是<pushImage>,同时向docker hub和我的Docker私有镜像仓库push镜像)

  1. <build>
  2. <plugins>
  3. <!--加上插件,插件源码地址:https://github.com/spotify/docker-maven-plugin-->
  4. <plugin>
  5. <groupId>com.spotify</groupId>
  6. <artifactId>docker-maven-plugin</artifactId>
  7. <version>1.2.2</version>
  8. <executions>
  9. ...............................................
  10. </executions>
  11. <configuration>
  12. ............................................
  13. <!-- build 完成后 push 镜像 -->
  14. <!--<pushImage>true</pushImage>-->
  15. <pushImageTag>true</pushImageTag>
  16. ........................................................
  17. </configuration>
  18. </plugin>
  19. </plugins>
  20. </build>

然后点击右侧 Lifecycle 的package或者install,就能够创建并上传Docker镜像到我的Docker私有镜像仓库 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/866601
推荐阅读
相关标签
  

闽ICP备14008679号