DockerRegistry使用与Jenkins流水线中的验收测试指南
立即解锁
发布时间: 2025-08-13 01:02:42 阅读量: 7 订阅数: 13 


使用Docker和Jenkins实现持续交付的关键实践
### Docker Registry使用与Jenkins流水线中的验收测试指南
#### 1. Docker Registry的使用
当完成Docker Registry的配置后,我们可以分三个阶段来展示如何使用它:
- 构建镜像
- 将镜像推送到Registry
- 从Registry拉取镜像
##### 1.1 构建镜像
我们以安装了Ubuntu和Python解释器的镜像为例。在新目录中创建一个Dockerfile,内容如下:
```Dockerfile
FROM ubuntu:20.04
RUN apt-get update && \
apt-get install -y python
```
使用以下命令构建镜像:
```bash
$ docker build -t ubuntu_with_python .
```
镜像构建完成后,就可以将其推送到Docker Registry。
##### 1.2 将镜像推送到Registry
要推送创建的镜像,需要根据命名约定对其进行标记:
```
<registry_address>/<image_name>:<tag>
```
`registry_address`可以是以下两种情况之一:
- Docker Hub的用户名
- 私有Registry的域名或IP地址及端口(例如,localhost:5000)
通常,`<tag>`是镜像或应用程序的版本形式。
以使用Docker Hub为例,标记镜像:
```bash
$ docker tag ubuntu_with_python leszko/ubuntu_with_python:1
```
请将`leszko`替换为你自己的Docker Hub用户名。
也可以在构建命令中直接标记镜像:
```bash
docker build -t leszko/ubuntu_with_python:1 .
```
如果仓库配置了访问限制,需要先进行授权:
```bash
$ docker login --username <username> --password <password>
```
如果使用的不是Docker Hub的Registry,还需要在登录命令中添加URL,例如:
```bash
docker login quay.io
```
使用以下命令将镜像存储到Registry:
```bash
$ docker push leszko/ubuntu_with_python:1
```
无需指定Registry地址,因为Docker会根据命名约定解析。可以通过[Docker Hub](https://hub.docker.com)的Web界面检查镜像是否已存储。
##### 1.3 从Registry拉取镜像
为了演示Registry的工作原理,我们可以先删除本地镜像,然后从Registry中取回:
```bash
$ docker rmi ubuntu_with_python leszko/ubuntu_with_python:1
```
使用`docker images`命令可以查看镜像已被删除。然后,执行以下代码从Registry取回镜像:
```bash
$ docker pull leszko/ubuntu_with_python:1
```
如果使用的是免费的Docker Hub账户,在拉取之前可能需要将`ubuntu_with_python`仓库设置为公开。使用`docker images`命令可以确认镜像已取回。
#### 2. Jenkins流水线中的验收测试
在配置好Registry并了解其工作原理后,我们可以将其应用到CD流水线中,并构建验收测试阶段。
##### 2.1 Jenkins流水线中的流程
整个过程如下:
1. 开发者将代码更改推送到GitHub。
2. Jenkins检测到更改,触发构建并检出当前代码。
3. Jenkins执行提交阶段并构建Docker镜像。
4. Jenkins将镜像推送到Docker Registry。
5. Jenkins在暂存环境中运行Docker容器。
6. 暂存环境中的Docker主机需要从Docker Registry拉取镜像。
7. Jenkins针对在暂存环境中运行的应用程序运行验收测试套件。
为了简化,我们将在本地运行Docker容器。如果要远程运行,需要使用`-H`选项或配置`DOCKER_HOST`环境变量。
在之前的流水线基础上,我们再添加三个阶段:
- Docker构建
- Docker推送
- 验收测试
需要确保Jenkins执行器(代理或主节点)上安装了Docker工具,以便构建Docker镜像。如果使用动态配置的Docker代理,建议使用Docker-in-Docker(DinD)解决方案,例如`leszko/jenkins-docker-slave`镜像,并在Docker代理配置中标记特权选项。
##### 2.2 Docker构建阶段
我们希望将计算器项目作为Docker容器运行,因此需要创建一个Dockerfile,并将Docker构建阶段添加到Jenkinsfile中。
###### 2.2.1 添加Dockerfile
在计算器项目的根目录中创建一个Dockerfile,内容如下:
```Dockerfile
FROM openjdk:11-jre
COPY build/libs/calculator-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
```
Gradle的默认构建目录是`build/libs/`,`calculator-0.0.1-SNAPSHOT.jar`是打包成一个JAR文件的完整应用程序。Gradle会自动使用`0.0.1-SNAPSHOT`的Maven风格版本对应用程序进行版本控制。
使用以下命令检查应用程序是否可以构建和运行:
```bash
$ ./gradlew build
$ docker build -t calculator .
$ docker run -p 8080:8080 --name calculator calculator
```
一段时间后,在浏览器中打开`http://localhost:8080/sum?a=1&b=2`,应该能看到结果为3。
停止容器并将Dockerfile推送到GitHub仓库:
```bash
$ git add Dockerfile
$ git commit -m "Add Dockerfile"
$ git push
```
###### 2.2.2 将Docker构建添加到流水线
最后一步是将Docker构建阶段添加到Jenkinsfile中。通常,JAR打包也会作为一个单独的`Package`阶段声明,如下所示:
```groovy
stage("Package") {
steps {
sh "./gradlew build"
}
}
stage("Docker build") {
steps {
sh "docker build -t leszko/calculator ."
}
}
```
虽然我们没有显式地对镜像进行版本控制,但每个镜像都有一个唯一的哈希ID。在镜像标签中使用了Docker Registry名称,无需将镜像标记为`calculator`和`leszko/calculator`两次。
提交并推送Jenkinsfile后,流水线构建应该会自动启动,所有阶段应该显示为绿色,这意味着Docker镜像已成功构建。
如果在Docker构建阶段出现失败,很可能是Jenkins执行器无法访问Docker守护进程。如果使用Jenkins主节点作为执行器,确保`jenkins`用户已添加到`docker`用户组;如果使用Jenkins代理,确保它们可以访问Docker守护进程。
#### 2.3 Docker推送阶段
镜像准备好后,将其存储到Registry。Dock
0
0
复制全文
相关推荐








