开发环境
名称 | 版本 |
---|---|
操作系统 | 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 registry
Using default tag: latest
latest: Pulling from library/registry
ddad3d7c1e96: Pull complete
6eda6749503f: Pull complete
363ab70c2143: Pull complete
5b94580856e6: Pull complete
12008541203a: Pull complete
Digest: sha256:bac2d7050dc4826516650267fe7dc6627e9e11ad653daca0641437abdf18df27
Status: Downloaded newer image for registry:latest
docker.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 registry
f009a2b2baadbfef59f77683203e101e4b135653a437501b7469be2e9a4fbd93
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;
@SpringBootApplication
public 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;
@Controller
public class HelloController {
@RequestMapping("/jenkins")
@ResponseBody
public 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-SNAPSHOT
Step 1/3 : FROM java:8
---> d23bdf5b1b1b
Step 2/3 : ADD /jenkinsdemo-1.0-SNAPSHOT.jar //
---> 37db987997b1
Step 3/3 : ENTRYPOINT ["java","jar","-Dspring.profiles.active=dev","/jenkinsdemo-1.0-SNAPSHOT.jar"]
---> Running in 757226f54588
Removing intermediate container 757226f54588
---> 1f0bf961c9b5
ProgressMessage{id=null, status=null, stream=null, error=null, progress=null, progressDetail=null}
Successfully built 1f0bf961c9b5
Successfully 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-SNAPSHOT
docker run -di --name=${app_name} -p 7070:8080 wlf/${app_name}:1.0-SNAPSHOT
echo '----start container----'
2.给 .sh 脚本添加可执行权限
chmod +x ./jenkins.sh
3.运行
/usr/local/jenkins/jenkins.sh
运行结果
[root@luoma target]# /usr/local/jenkins/jenkins.sh
jenkinsdemo
----stop container----
jenkinsdemo
----rm container----
b9009ed6e206650608532bc6289834371d21ee67ee217a89022691edcce4fdeb
----start container----
4.测试
查看启动结果 docker ps -a
浏览器访问 http://192.168.114.128:7070/jenkins