如何使用 GitLab 构建 Docker 映像并托管 Docker 映像库

介绍

集装箱化正在迅速成为云环境中包装和部署应用程序的最受欢迎的方法。它提供的标准化,以及其资源效率(与完整的虚拟机相比)和灵活性,使其成为现代 DevOps 思维的伟大支持者。

虽然公共 Docker 图像存储库如 Docker Hub充满了容器化开源软件图像,你可以docker pull和使用今天,对于私人代码,你需要支付一个服务来构建和存储你的图像,或运行自己的软件来这样做。

GitLab社区版是一个自托软件套件,提供Git存储库托管,项目跟踪,CI/CD服务和Docker图像注册表,以及其他功能,在本教程中,我们将使用GitLab的连续集成服务从一个例子Node.js应用程序构建Docker图像。

前提条件

在我们开始之前,我们需要设置一个安全的GitLab服务器和一个GitLab CI运行器来执行连续的集成任务。

使用SSL保护的GitLab服务器

要存储我们的源代码,运行 CI/CD 任务,并托管 Docker 注册表,我们需要安装在 Ubuntu 16.04 服务器上的 GitLab 实例。

您可以通过以下教程完成这些前提要求:

《GitLab CI Runner》

How To Set Up Continuous Integration Pipelines with GitLab CI on Ubuntu 16.04将为您提供GitLab的CI服务的概述,并向您展示如何设置一个CI运行器来处理工作。

第1步:设置特权的GitLab CI Runner

在 GitLab 连续集成教程中,我们使用sudo gitlab-runner registry和其交互式配置过程设置了 GitLab 运行器,该运行器能够在孤立的 Docker 容器内运行软件的构建和测试。

然而,为了构建 Docker 图像,我们的运行者需要完全访问 Docker 服务本身. 建议的配置方式是使用 Docker 的官方docker-in-docker图像来运行任务。

<$>[注] 注: 授予跑者** 特权 ** 模式基本上取消了使用集装箱的所有安全优势。不幸的是,允许Docker能力跑者的其他方法也具有类似的安全影响。请查看Docker Build上的官方GitLab文档(https://docs.gitlab.com/ce/ci/docker/using_docker_build.html),以了解不同跑者选项的更多信息,以及适合您的情况的最佳选项。

由于使用特权跑者存在安全影响,我们将创建一个特定项目的跑者,该跑者只会在我们的)。

GitLab project settings menu

现在点击 扩展 按钮旁边的** Runner 设置** 部分:

GitLab "Runners settings" expand button

会有一些关于设置一个 特定跑者 的信息,包括一个注册代币。 请注意这个代币. 当我们使用它来注册一个新的跑者时,跑者只会被锁在这个项目中。

GitLab project-specific runners options

当我们在这个页面上时,请点击禁用共享跑者按钮。我们希望确保我们的Docker工作始终在我们的特权跑者上运行。

如果您还没有安装运行器的机器,请返回并完成 安装 GitLab CI Runner 服务 前提教程的部分。

现在,运行以下命令来设置特权项目特定的运行程序:

1sudo gitlab-runner register -n \
2  --url https://gitlab.example.com/ \
3  --registration-token your-token \
4  --executor docker \
5  --description "docker-builder" \
6  --docker-image "docker:latest" \
7  --docker-privileged
1[secondary_label Output]
2Registering runner... succeeded runner=61SR6BwV
3Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!

我们在命令行设置了我们所有的跑者选项,而不是使用交互式提示,因为提示不允许我们指定--docker-privileged模式。

您的跑者现在已设置,注册和运行. 要验证,请返回您的浏览器. 点击主 GitLab 菜单栏中的 wrench 图标,然后在左侧菜单中点击 Runners

GitLab runner listing

现在我们有一个能够构建Docker图像的运行器,让我们设置一个私人Docker注册表,以便它将图像推向。

第2步:设置GitLab的Docker注册表

设置自己的 Docker 注册表允许您将图像从自己的私人服务器上推送和拖放,增加安全性并减少工作流对外部服务的依赖。

GitLab 将创建一个私人 Docker 注册表,仅有几次配置更新。 首先,我们将设置注册表所在的 URL。 然后,我们将(可选)配置注册表以使用 S3 兼容的对象存储服务来存储其数据。

SSH 进入您的 GitLab 服务器,然后打开 GitLab 配置文件:

1sudo nano /etc/gitlab/gitlab.rb

我们将删除registry_external_url行,并将其设置为我们的GitLab主机名称,端口号为5555:

1[label /etc/gitlab/gitlab.rb]
2registry_external_url 'https://gitlab.example.com:5555'

接下来,添加以下两行,告诉注册表在哪里找到我们的 Let's Encrypt 证书:

1[label /etc/gitlab/gitlab.rb]
2registry_nginx['ssl_certificate'] = "/etc/letsencrypt/live/gitlab.example.com/fullchain.pem"
3registry_nginx['ssl_certificate_key'] = "/etc/letsencrypt/live/gitlab.example.com/privkey.pem"

保存并关闭文件,然后重新配置 GitLab:

1sudo gitlab-ctl reconfigure
1[secondary_label Output]
2. . .
3gitlab Reconfigured!

更新防火墙以允许流量到注册表端口:

1sudo ufw allow 5555

现在切换到安装了 Docker 的另一台机器,然后登录到私人 Docker 注册表. 如果您在本地开发计算机上没有 Docker,您可以使用任何配置的服务器来运行您的 GitLab CI 工作,因为它已经安装了 Docker:

1[environment local]
2docker login gitlab.example.com:5555

您将被要求提供您的用户名和密码. 使用您的 GitLab 凭证登录。

1[environment local]
2[secondary_label Output]
3Login Succeeded

成功!注册表已设置并运行,目前它将存储文件在GitLab服务器的本地文件系统中。如果您想使用对象存储服务,请继续使用本节。

要为注册表设置对象存储后端,我们需要知道有关我们的对象存储服务的下列信息:

访问密钥 秘密密密钥 ** 区域* (us-east-1) 例如,如果使用 Amazon S3,或 ** 区域终端** 如果使用 S3 兼容的服务 (https://nyc.digitaloceanspaces.com) ** 桶名*

如果您正在使用 DigitalOcean Spaces,您可以了解如何设置一个新的空间,并通过阅读 How To Create a DigitalOcean Space and API Key获取上述信息。

当您有对象存储信息时,请打开 GitLab 配置文件:

1sudo nano /etc/gitlab/gitlab.rb

再一次,滚到容器注册表部分,寻找注册表块,删除评论,并更新到以下,再次确保在适当的情况下更换自己的信息:

 1[label /etc/gitlab/gitlab.rb]
 2registry['storage'] = {
 3  's3' => {
 4    'accesskey' => 'your-key',
 5    'secretkey' => 'your-secret',
 6    'bucket' => 'your-bucket-name',
 7    'region' => 'nyc3',
 8    'regionendpoint' => 'https://nyc3.digitaloceanspaces.com'
 9  }
10}

如果您使用的是 Amazon S3,您只需要区域,而不是区域终端。如果您使用的是S3兼容的服务,如Spaces,则需要区域终端

保存并关闭文件。

<$>[注] 注: 目前存在一个错误,如果您的对象存储桶是空的,注册表将在三十秒后关闭。

如果您正在使用 DigitalOcean Spaces,您可以拖放并下载使用控制面板接口上传文件。

重新配置 GitLab 再一次:

1sudo gitlab-ctl reconfigure

在您的其他 Docker 机器上,再次登录注册表,以确保一切顺利:

1[environment local]
2docker login gitlab.example.com:5555

您应该收到一个登录成功消息。

现在我们已经设置了 Docker 注册表,让我们更新我们的应用程序的 CI 配置来构建和测试我们的应用程序,并将 Docker 图像推到我们的私人注册表。

第3步:更新gitlab-ci.yaml 并构建 Docker 图像

请注意,如果您没有完成 GitLab CI 上的前提文章 您需要将示例存储库复制到您的 GitLab 服务器。 请遵循 复制 GitHub 中的示例存储库 部分来做到这一点。

要在Docker中获取我们的应用程序构建,我们需要更新.gitlab-ci.yml 文件. 你可以通过从主要项目页面点击它来编辑这个文件,然后点击 Edit 按钮。

1[environment local]
2git clone [email protected]:sammy/hello_hapi.git
3cd hello_hapi
4# edit the file w/ your favorite editor
5git commit -am "updating ci configuration"
6git push

首先,删除文件中的所有内容,然后粘贴到以下配置:

 1[label .gitlab-ci.yml]
 2image: docker:latest
 3services:
 4- docker:dind
 5
 6stages:
 7- build
 8- test
 9- release
10
11variables:
12  TEST_IMAGE: gitlab.example.com:5555/sammy/hello_hapi:$CI_COMMIT_REF_NAME
13  RELEASE_IMAGE: gitlab.example.com:5555/sammy/hello_hapi:latest
14
15before_script:
16  - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN gitlab.example.com:5555
17
18build:
19  stage: build
20  script:
21    - docker build --pull -t $TEST_IMAGE .
22    - docker push $TEST_IMAGE
23
24test:
25  stage: test
26  script:
27    - docker pull $TEST_IMAGE
28    - docker run $TEST_IMAGE npm test
29
30release:
31  stage: release
32  script:
33    - docker pull $TEST_IMAGE
34    - docker tag $TEST_IMAGE $RELEASE_IMAGE
35    - docker push $RELEASE_IMAGE
36  only:
37    - master

请务必用自己的信息更新所突出的 URL 和用户名,然后用 GitLab 中的 Commit changes 按钮保存。

这个新配置文件告诉了GitLab使用最新的多克图像("image: docker:latest"),并将其链接到多克内多克服务(docker:dind). 然后界定了建设'、试验'和释放'阶段。 " 建设 " 阶段使用Repo提供的 " Dockerfile " 来构建Docker图像,然后上传到我们的Docker图像登记册。 如果成功,测试 ' 阶段将下载我们刚刚制作的图像,并在其中执行npm测试 ' 命令。 如果试验阶段成功,释放'阶段将拉出图像,标记为`hello_hapi:latest'并推回登记册.

根据工作流程,您还可以添加额外的测试阶段,甚至可以添加部署阶段,将应用程序推向舞台或生产环境。

更新配置文件应该引发一个新的构建,返回GitLab中的hello_hapi项目,然后点击 commit 的CI状态指标:

GitLab commit notification with pipeline status icon

在结果页面上,您可以点击任何一个阶段,以查看他们的进展:

GitLab pipeline detail

GitLab pipeline stage progress

最终,所有步骤都应该通过显示绿色标记图标来表示他们成功,我们可以通过点击左侧菜单中的 注册 项来找到刚刚构建的Docker图像:

GitLab container registry image list

如果你点击图像名称旁边的小文档图标,它会将相应的docker pull...命令复制到你的剪辑板上。

1[environment local]
2docker pull gitlab.example.com:5555/sammy/hello_hapi:latest
3docker run -it --rm -p 3000:3000 gitlab.example.com:5555/sammy/hello_hapi:latest
1[environment local]
2[secondary_label Output]
3> [email protected] start /usr/src/app
4> node app.js
5
6Server running at: http://56fd5df5ddd3:3000

该图像已从注册表中下载,并在容器中启动。切换到您的浏览器并连接到port 3000上的应用程序来测试。在这种情况下,我们正在在本地机器上运行容器,所以我们可以通过 localhost 在以下URL访问它:

1http://localhost:3000/hello/test
1[secondary_label Output]
2Hello, test!

从现在开始,每次我们将新代码推到我们的存储库的分支,我们将自动构建和测试一个新的hello_hapi:latest图像。

结论

在本教程中,我们设置了一个新的GitLab运行程序来构建Docker图像,创建了一个私人Docker注册表来存储它们,并更新了一个Node.js应用程序,用于Docker容器内部构建和测试。

要了解有关本设置中使用的各种组件的更多信息,您可以阅读GitLab CE的官方文档(https://docs.gitlab.com/ce/README.html),GitLab 集装箱注册表(https://docs.gitlab.com/ee/administration/container_registry.html),以及 Docker

Published At
Categories with 技术
comments powered by Disqus