安装自定义 Docker 仓库

2021年04月24日 19:28 · 阅读(207) ·

开发环境

名称 版本
操作系统 Windows 10 X64
VMware® Workstation 12 Pro 12.0.0 build-2985596
CentOS7 CentOS Linux release 7.8.2003 (Core)
Linux 3.10.0-1127.el7.x86_64
Docker 20.10.3

Linux 虚拟机 IP 地址:192.168.114.128

参考

本地jar包上传docker容器

你必须知道的Docker镜像仓库的搭建

基础知识

Docker

安装 Docker 的注册服务器

1.启动 Docker systemctl start docker

2.下载 Registry 镜像并启动 docker pull registry

  1. [root@luoma target]# docker pull registry
  2. Using default tag: latest
  3. latest: Pulling from library/registry
  4. ddad3d7c1e96: Pull complete
  5. 6eda6749503f: Pull complete
  6. 363ab70c2143: Pull complete
  7. 5b94580856e6: Pull complete
  8. 12008541203a: Pull complete
  9. Digest: sha256:bac2d7050dc4826516650267fe7dc6627e9e11ad653daca0641437abdf18df27
  10. Status: Downloaded newer image for registry:latest
  11. docker.io/library/registry:latest

3.运行一个 Registry 镜像仓库的容器实例

  1. docker run -d -v /edc/images/registry:/var/lib/registry -p 5000:5000 --restart=always --name xdp-registry registry

运行结果

  1. [root@luoma target]# docker run -d -v /edc/images/registry:/var/lib/registry -p 5000:5000 --restart=always --name xdp-registry registry
  2. f009a2b2baadbfef59f77683203e101e4b135653a437501b7469be2e9a4fbd93

4.开启 Docker 远程 api(针对 CentOS7)

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

原来文件描述符 fd 方式改为 tcp,指定端口 2375

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

5.让 Docker 支持 http 上传镜像文件(我们本地的 jar 包)

  1. vim /etc/docker/daemon.json

修改为下面内容,其中 registry-mirrors 是阿里云的镜像加速,保持即可。
insecure-registries 中这里的 192.168.114.128 是 Docker 所在服务器的 ip。

  1. {
  2. "registry-mirrors": ["https://y7tc3g05.mirror.aliyuncs.com"],
  3. "insecure-registries":["192.168.114.128:5000"]
  4. }

6.重启 Docker systemctl daemon-reload && systemctl restart docker

7.查看状态 docker ps -a

Docker 测试项目

项目结构

1.Application

  1. package com.jenkins.demo;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. @SpringBootApplication
  5. public class Application {
  6. public static void main(String[] args) throws Exception{
  7. SpringApplication.run(Application.class,args);
  8. }
  9. }

2.HelloController

  1. package com.jenkins.demo.Controller;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.ResponseBody;
  5. @Controller
  6. public class HelloController {
  7. @RequestMapping("/jenkins")
  8. @ResponseBody
  9. public String jenkins() {
  10. return "Hello Jenkins!";
  11. }
  12. }

3.pom.xml【本地 jar 包的 pom 文件引入 docker 插件】

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>com.jenkins.demo</groupId>
  7. <artifactId>jenkinsdemo</artifactId>
  8. <version>1.0-SNAPSHOT</version>
  9. <packaging>jar</packaging>
  10. <parent>
  11. <groupId>org.springframework.boot</groupId>
  12. <artifactId>spring-boot-starter-parent</artifactId>
  13. <version>1.5.6.RELEASE</version>
  14. </parent>
  15. <dependencies>
  16. <dependency>
  17. <groupId>org.springframework.boot</groupId>
  18. <artifactId>spring-boot-starter-web</artifactId>
  19. </dependency>
  20. </dependencies>
  21. <build>
  22. <plugins>
  23. <plugin>
  24. <groupId>org.springframework.boot</groupId>
  25. <artifactId>spring-boot-maven-plugin</artifactId>
  26. </plugin>
  27. <!--使用docker-maven-plugin插件 -->
  28. <!--https://blog.csdn.net/qq_32201423/article/details/104037573-->
  29. <plugin>
  30. <groupId>com.spotify</groupId>
  31. <artifactId>docker-maven-plugin</artifactId>
  32. <version>1.1.0</version>
  33. <!--将插件绑定在某个phase执行 -->
  34. <executions>
  35. <execution>
  36. <id>build-image</id>
  37. <!--将插件绑定在package这个phase上。也就是说,用户只需执行mvn package ,就会自动执行mvn docker:build -->
  38. <phase>package</phase>
  39. <goals>
  40. <goal>build</goal>
  41. </goals>
  42. </execution>
  43. </executions>
  44. <configuration>
  45. <!--指定生成的 Docker 镜像名,特别注意,启动 Docker 时,需要使用这个名字 -->
  46. <imageName>wlf/${project.artifactId}:${project.version}</imageName>
  47. <!--指定远程 docker api地址,docker 所在服务器的 ip,端口号是2375-->
  48. <dockerHost>http://192.168.114.128:2375</dockerHost>
  49. <!--基础镜像,Java 8-->
  50. <baseImage>java:8</baseImage>
  51. <!--镜像启动的参数,>java -jar -Dspring.profiles.active=prod jenkinsdemo-1.0-SNAPSHOT.jar-->
  52. <entryPoint>["java", "-jar", "-Dspring.profiles.active=prod","/${project.build.finalName}.jar"]
  53. </entryPoint>
  54. <!-- 这里是复制 jar 包到 docker 容器指定目录配置 -->
  55. <resources>
  56. <resource>
  57. <targetPath>/</targetPath>
  58. <!--jar 包所在的路径 此处配置的 即对应 target 目录 -->
  59. <directory>${project.build.directory}</directory>
  60. <!-- 需要包含的 jar包 ,这里对应的是 Dockerfile中添加的文件名 -->
  61. <include>${project.build.finalName}.jar</include>
  62. </resource>
  63. </resources>
  64. </configuration>
  65. </plugin>
  66. </plugins>
  67. </build>
  68. </project>

4.maven 运行 clean,package

运行结果

  1. "D:\Program Files\Java\jdk1.8.0_151\bin\java.exe" -Dmaven.multiModuleProjectDirectory=D:\Java\2021\jenkins-demo "-Dmaven.home=D:\Program Files\apache-maven-3.6.0" "-Dclassworlds.conf=D:\Program Files\apache-maven-3.6.0\bin\m2.conf" "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2018.3\lib\idea_rt.jar=5775:D:\Program Files\JetBrains\IntelliJ IDEA 2018.3\bin" -Dfile.encoding=UTF-8 -classpath "D:\Program Files\apache-maven-3.6.0\boot\plexus-classworlds-2.5.2.jar" org.codehaus.classworlds.Launcher -Didea.version=2018.3 -s "D:\Program Files\apache-maven-3.6.0\conf\settings.xml" "-Dmaven.repo.local=D:\Program Files\Maven\Repository" package
  2. [INFO] Scanning for projects...
  3. [INFO]
  4. [INFO] --------------------< com.jenkins.demo:jenkinsdemo >--------------------
  5. [INFO] Building jenkinsdemo 1.0-SNAPSHOT
  6. [INFO] --------------------------------[ jar ]---------------------------------
  7. [INFO]
  8. [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ jenkinsdemo ---
  9. [INFO] Using 'UTF-8' encoding to copy filtered resources.
  10. [INFO] Copying 0 resource
  11. [INFO] Copying 0 resource
  12. [INFO]
  13. [INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ jenkinsdemo ---
  14. [INFO] Changes detected - recompiling the module!
  15. [INFO] Compiling 2 source files to D:\Java\2021\jenkins-demo\target\classes
  16. [INFO]
  17. [INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ jenkinsdemo ---
  18. [INFO] Using 'UTF-8' encoding to copy filtered resources.
  19. [INFO] skip non existing resourceDirectory D:\Java\2021\jenkins-demo\src\test\resources
  20. [INFO]
  21. [INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ jenkinsdemo ---
  22. [INFO] Nothing to compile - all classes are up to date
  23. [INFO]
  24. [INFO] --- maven-surefire-plugin:2.18.1:test (default-test) @ jenkinsdemo ---
  25. [INFO] No tests to run.
  26. [INFO]
  27. [INFO] --- maven-jar-plugin:2.6:jar (default-jar) @ jenkinsdemo ---
  28. [INFO] Building jar: D:\Java\2021\jenkins-demo\target\jenkinsdemo-1.0-SNAPSHOT.jar
  29. [INFO]
  30. [INFO] --- spring-boot-maven-plugin:1.5.6.RELEASE:repackage (default) @ jenkinsdemo ---
  31. [INFO]
  32. [INFO] --- docker-maven-plugin:1.1.0:build (build-image) @ jenkinsdemo ---
  33. [INFO] Using authentication suppliers: [ConfigFileRegistryAuthSupplier]
  34. [INFO] Copying D:\Java\2021\jenkins-demo\target\jenkinsdemo-1.0-SNAPSHOT.jar -> D:\Java\2021\jenkins-demo\target\docker\jenkinsdemo-1.0-SNAPSHOT.jar
  35. [INFO] Building image 192.168.114.128:5000/jenkinsdemo:1.0-SNAPSHOT
  36. Step 1/3 : FROM java:8
  37. ---> d23bdf5b1b1b
  38. Step 2/3 : ADD /jenkinsdemo-1.0-SNAPSHOT.jar //
  39. ---> 37db987997b1
  40. Step 3/3 : ENTRYPOINT ["java","jar","-Dspring.profiles.active=dev","/jenkinsdemo-1.0-SNAPSHOT.jar"]
  41. ---> Running in 757226f54588
  42. Removing intermediate container 757226f54588
  43. ---> 1f0bf961c9b5
  44. ProgressMessage{id=null, status=null, stream=null, error=null, progress=null, progressDetail=null}
  45. Successfully built 1f0bf961c9b5
  46. Successfully tagged 192.168.114.128:5000/jenkinsdemo:1.0-SNAPSHOT
  47. [INFO] Built 192.168.114.128:5000/jenkinsdemo:1.0-SNAPSHOT
  48. [INFO] ------------------------------------------------------------------------
  49. [INFO] BUILD SUCCESS
  50. [INFO] ------------------------------------------------------------------------
  51. [INFO] Total time: 8.594 s
  52. [INFO] Finished at: 2021-04-24T13:48:21+08:00
  53. [INFO] ------------------------------------------------------------------------
  54. 进程已结束,退出代码 0

创建运行脚本

1.创建运行脚本

  1. vi /usr/local/jenkins/jenkins.sh

内容如下

  1. app_name='jenkinsdemo'
  2. docker stop ${app_name}
  3. echo '----stop container----'
  4. docker rm ${app_name}
  5. echo '----rm container----'
  6. #-d 后台运行容器,并返回容器 ID,也即启动守护式容器
  7. #-i 以交互模式运行容器,通常与 -t 同时使用
  8. #--name=”容器新名字” 为容器指定一个名称
  9. #-p 指定端口映射,有以下四种格式 hostPort:containerPort
  10. #镜像名称 wlf/${app_name}:1.0-SNAPSHOT
  11. docker run -di --name=${app_name} -p 7070:8080 wlf/${app_name}:1.0-SNAPSHOT
  12. echo '----start container----'

2.给 .sh 脚本添加可执行权限

  1. chmod +x ./jenkins.sh

3.运行

  1. /usr/local/jenkins/jenkins.sh

运行结果

  1. [root@luoma target]# /usr/local/jenkins/jenkins.sh
  2. jenkinsdemo
  3. ----stop container----
  4. jenkinsdemo
  5. ----rm container----
  6. b9009ed6e206650608532bc6289834371d21ee67ee217a89022691edcce4fdeb
  7. ----start container----

4.测试

查看启动结果 docker ps -a

浏览器访问 http://192.168.114.128:7070/jenkins