开发环境
| 名称 | 版本 |
|---|---|
| 操作系统 | 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
参考
基础知识
安装 Docker 的注册服务器
1.启动 Docker systemctl start docker
2.下载 Registry 镜像并启动 docker pull registry
[root@luoma target]# docker pull registryUsing default tag: latestlatest: Pulling from library/registryddad3d7c1e96: Pull complete6eda6749503f: Pull complete363ab70c2143: Pull complete5b94580856e6: Pull complete12008541203a: Pull completeDigest: sha256:bac2d7050dc4826516650267fe7dc6627e9e11ad653daca0641437abdf18df27Status: Downloaded newer image for registry:latestdocker.io/library/registry:latest
3.运行一个 Registry 镜像仓库的容器实例
docker run -d -v /edc/images/registry:/var/lib/registry -p 5000:5000 --restart=always --name xdp-registry registry
运行结果
[root@luoma target]# docker run -d -v /edc/images/registry:/var/lib/registry -p 5000:5000 --restart=always --name xdp-registry registryf009a2b2baadbfef59f77683203e101e4b135653a437501b7469be2e9a4fbd93
4.开启 Docker 远程 api(针对 CentOS7)
vi /usr/lib/systemd/system/docker.service
原来文件描述符 fd 方式改为 tcp,指定端口 2375
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
5.让 Docker 支持 http 上传镜像文件(我们本地的 jar 包)
vim /etc/docker/daemon.json
修改为下面内容,其中 registry-mirrors 是阿里云的镜像加速,保持即可。insecure-registries 中这里的 192.168.114.128 是 Docker 所在服务器的 ip。
{"registry-mirrors": ["https://y7tc3g05.mirror.aliyuncs.com"],"insecure-registries":["192.168.114.128:5000"]}
6.重启 Docker systemctl daemon-reload && systemctl restart docker
7.查看状态 docker ps -a
Docker 测试项目
项目结构
1.Application
package com.jenkins.demo;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class Application {public static void main(String[] args) throws Exception{SpringApplication.run(Application.class,args);}}
2.HelloController
package com.jenkins.demo.Controller;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;@Controllerpublic class HelloController {@RequestMapping("/jenkins")@ResponseBodypublic String jenkins() {return "Hello Jenkins!";}}
3.pom.xml【本地 jar 包的 pom 文件引入 docker 插件】
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.jenkins.demo</groupId><artifactId>jenkinsdemo</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.6.RELEASE</version></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><!--使用docker-maven-plugin插件 --><!--https://blog.csdn.net/qq_32201423/article/details/104037573--><plugin><groupId>com.spotify</groupId><artifactId>docker-maven-plugin</artifactId><version>1.1.0</version><!--将插件绑定在某个phase执行 --><executions><execution><id>build-image</id><!--将插件绑定在package这个phase上。也就是说,用户只需执行mvn package ,就会自动执行mvn docker:build --><phase>package</phase><goals><goal>build</goal></goals></execution></executions><configuration><!--指定生成的 Docker 镜像名,特别注意,启动 Docker 时,需要使用这个名字 --><imageName>wlf/${project.artifactId}:${project.version}</imageName><!--指定远程 docker api地址,docker 所在服务器的 ip,端口号是2375--><dockerHost>http://192.168.114.128:2375</dockerHost><!--基础镜像,Java 8--><baseImage>java:8</baseImage><!--镜像启动的参数,>java -jar -Dspring.profiles.active=prod jenkinsdemo-1.0-SNAPSHOT.jar--><entryPoint>["java", "-jar", "-Dspring.profiles.active=prod","/${project.build.finalName}.jar"]</entryPoint><!-- 这里是复制 jar 包到 docker 容器指定目录配置 --><resources><resource><targetPath>/</targetPath><!--jar 包所在的路径 此处配置的 即对应 target 目录 --><directory>${project.build.directory}</directory><!-- 需要包含的 jar包 ,这里对应的是 Dockerfile中添加的文件名 --><include>${project.build.finalName}.jar</include></resource></resources></configuration></plugin></plugins></build></project>
4.maven 运行 clean,package
运行结果
"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[INFO] Scanning for projects...[INFO][INFO] --------------------< com.jenkins.demo:jenkinsdemo >--------------------[INFO] Building jenkinsdemo 1.0-SNAPSHOT[INFO] --------------------------------[ jar ]---------------------------------[INFO][INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ jenkinsdemo ---[INFO] Using 'UTF-8' encoding to copy filtered resources.[INFO] Copying 0 resource[INFO] Copying 0 resource[INFO][INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ jenkinsdemo ---[INFO] Changes detected - recompiling the module![INFO] Compiling 2 source files to D:\Java\2021\jenkins-demo\target\classes[INFO][INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ jenkinsdemo ---[INFO] Using 'UTF-8' encoding to copy filtered resources.[INFO] skip non existing resourceDirectory D:\Java\2021\jenkins-demo\src\test\resources[INFO][INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ jenkinsdemo ---[INFO] Nothing to compile - all classes are up to date[INFO][INFO] --- maven-surefire-plugin:2.18.1:test (default-test) @ jenkinsdemo ---[INFO] No tests to run.[INFO][INFO] --- maven-jar-plugin:2.6:jar (default-jar) @ jenkinsdemo ---[INFO] Building jar: D:\Java\2021\jenkins-demo\target\jenkinsdemo-1.0-SNAPSHOT.jar[INFO][INFO] --- spring-boot-maven-plugin:1.5.6.RELEASE:repackage (default) @ jenkinsdemo ---[INFO][INFO] --- docker-maven-plugin:1.1.0:build (build-image) @ jenkinsdemo ---[INFO] Using authentication suppliers: [ConfigFileRegistryAuthSupplier][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[INFO] Building image 192.168.114.128:5000/jenkinsdemo:1.0-SNAPSHOTStep 1/3 : FROM java:8---> d23bdf5b1b1bStep 2/3 : ADD /jenkinsdemo-1.0-SNAPSHOT.jar //---> 37db987997b1Step 3/3 : ENTRYPOINT ["java","jar","-Dspring.profiles.active=dev","/jenkinsdemo-1.0-SNAPSHOT.jar"]---> Running in 757226f54588Removing intermediate container 757226f54588---> 1f0bf961c9b5ProgressMessage{id=null, status=null, stream=null, error=null, progress=null, progressDetail=null}Successfully built 1f0bf961c9b5Successfully tagged 192.168.114.128:5000/jenkinsdemo:1.0-SNAPSHOT[INFO] Built 192.168.114.128:5000/jenkinsdemo:1.0-SNAPSHOT[INFO] ------------------------------------------------------------------------[INFO] BUILD SUCCESS[INFO] ------------------------------------------------------------------------[INFO] Total time: 8.594 s[INFO] Finished at: 2021-04-24T13:48:21+08:00[INFO] ------------------------------------------------------------------------进程已结束,退出代码 0
创建运行脚本
1.创建运行脚本
vi /usr/local/jenkins/jenkins.sh
内容如下
app_name='jenkinsdemo'docker stop ${app_name}echo '----stop container----'docker rm ${app_name}echo '----rm container----'#-d 后台运行容器,并返回容器 ID,也即启动守护式容器#-i 以交互模式运行容器,通常与 -t 同时使用#--name=”容器新名字” 为容器指定一个名称#-p 指定端口映射,有以下四种格式 hostPort:containerPort#镜像名称 wlf/${app_name}:1.0-SNAPSHOTdocker run -di --name=${app_name} -p 7070:8080 wlf/${app_name}:1.0-SNAPSHOTecho '----start container----'
2.给 .sh 脚本添加可执行权限
chmod +x ./jenkins.sh
3.运行
/usr/local/jenkins/jenkins.sh
运行结果
[root@luoma target]# /usr/local/jenkins/jenkins.shjenkinsdemo----stop container----jenkinsdemo----rm container----b9009ed6e206650608532bc6289834371d21ee67ee217a89022691edcce4fdeb----start container----
4.测试
查看启动结果 docker ps -a
浏览器访问 http://192.168.114.128:7070/jenkins