返回博客

如何在 Ubuntu 20.04 上使用 GitLab 自托管实例托管 Docker 镜像仓库并构建 Docker 镜像

如何在 Ubuntu 20.04 上使用 GitLab 自托管实例托管 Docker 镜像仓库并构建 Docker 镜像

容器化技术在软件开发技术领域取得了巨大进步,成为在云环境中打包和部署应用程序最被广泛接受的方法。这是由于对持续集成 (CI) 和持续部署 (CD) 的需求所决定的,而这两者正是DevOps的定义性特征。软件开发人员和工程师利用容器来实现软件架构中的 CI/CD。容器本质上是一个完全打包、可移植且自给自足的计算平台。虽然网络上有几种容器平台,但 Docker 恰好是最常见的一种。

Docker 是一个开源容器平台,它使开发变得高效且可预测。Docker 提供了一个公开的 Docker 镜像仓库,位于 Docker Hub。它包含许多针对最常见实现的开源 Docker 镜像,您可以拉取并使用。由于它是一个公共仓库,您也可以自由添加自己的 Docker 镜像与公众分享。然而,如果您有私有/专有代码,您可能需要为私有镜像仓库付费,或者构建自己的镜像仓库服务。这就是 GitLab 发挥作用的地方。

GitLab 是一个基于 Git 仓库,它不仅仅是一个版本控制工具。它提供了用于持续集成和部署、问题跟踪、Docker 镜像注册表等的 DevOps 工具。它提供三个选项:GitLab 社区版 (CE)、GitLab 企业版 (EE) 和 GitLab SaaS。GitLab CE 和 GitLab EE 是自托管解决方案,允许您自己下载、安装和管理 GitLab 实例。GitLab SaaS 由 GitLab 公司托管,您无需担心安装任何东西即可使用它。

在之前的教程中,我们向您展示了如何在 CloudSigma 服务器上设置 GitLab 实例并托管您自己的 Git 仓库。我们还向您展示了如何实现使用 GitLab runner 的持续集成流水线,以便在每次有新提交时自动构建并运行测试。如果您还没有阅读上述教程,请先阅读,因为它们是本教程的基础。

在本教程中,我们将演示如何构建一个简单的 Docker 镜像,并使用 GitLab 自托管实例进行托管(无论您使用的是社区版还是企业版 – 步骤流程都是相同的)。

前提条件

要按照本教程的每个步骤进行操作,请确保您拥有 GitLab CI runner 和一个自托管的 GitLab 服务器,如下所述。

1. 安全的 GitLab 服务器

我们将使用它来存储源代码、运行 CI/CD 任务并托管 Docker 镜像注册表。您应该拥有一台至少配备 2 个 CPU 核心和 4GBRAM,这是 GitLab 推荐用于安装自托管 GitLab 实例的配置。您还需要一个注册的域名指向该服务器,因为我们将使用它从 Let’s Encrypt 获取 SSL 证书 来保护服务器。以下是您可以参考以设置 GitLab 自托管实例的一些链接。

2. GitLab CI runner

运行针对测试用例的自动化任务需要 GitLab CI runner。关于如何在 Ubuntu 20.04 上设置 GitLab 持续集成流水线 的教程为您提供了 GitLab CI 服务器的概述,并向您展示了如何触发任务。如果您还没有设置 GitLab CI runner 服务,请按照教程中的步骤进行设置。该教程包含一个Node.js 演示应用程序 及其测试用例 – 我们将在本教程中使用它。

现在,让我们开始吧!

步骤 1:配置特权 GitLab CI Runner

在关于如何设置 GitLab CI Runner 的教程中,我们使用 sudo gitlab-runner register 命令,该命令允许我们以交互方式添加所需的参数。虽然这适用于我们之前的用例(即在隔离的 Docker 容器中运行构建和测试),但它可能无法处理构建 Docker 镜像。构建 Docker 镜像需要 runner 拥有对 Docker 服务的完全访问权限。您可以通过使用官方的 docker-in-docker 镜像来运行作业。此类配置涉及授予 runner 特权 执行模式。

虽然授予 特权 执行模式对于构建 Docker 镜像来说是必需的,但它会带来安全问题。这是因为它涉及消除容器的安全优势。您可能认为其他 Docker runner 是安全的,但它们恰好也存在同样的问题,正如在官方 Docker 文档中所解释的那样.

我们将创建另一个具有特权执行模式的 runner。由于上述安全影响,这将是一个特定于项目的 runner。它将接受来自 Node Pipeline 项目的作业,该项目是在关于何使用 GitLab 设置持续 CI 流水线.

您应该做的第一件事是检查 共享 Runner 在该项目上已被禁用。在 Node Pipeline 项目的项目页面中,点击左下角菜单中的 设置 并选择子菜单中的 CI/CD

Docker Image 1

找到 展开 按钮,位于 Runner 区域,然后点击它以显示有关可用 runner 的详细信息:

runners

点击开关以为该项目禁用共享 Runner。如果您在上一节中添加了特定于项目的 runner,也请将其禁用。我们将添加一个 特权 特定于项目的 runner 来运行此项目的作业。这可以确保我们不会因为 GitLab 随机将作业分配给未注册特权执行模式的 runner 而导致构建错误。在上面的屏幕截图中,在 特定 Runner 选项卡下,您应该会看到项目的 注册 令牌。请记录下来,因为您将在下面使用它。

注意:特定于项目的 runner 也可以从 管理面板 > Runners 区域分配给其他项目。当您从 runner 列表中选择一个 runner 时,您将进入 runner 配置页面。向下滚动以查看 限制此 runner 的项目:

assigned projects

是时候打开您的终端了。如果您还没有完成关于何在 Ubuntu 20.04 上设置 GitLab 持续集成流水线 教程中的步骤,请先暂停本教程并按照这些步骤操作,以便您拥有一台安装了 GitLab CI runner 服务的服务器。否则,请使用您的 GitLab CI runner 服务器 进行 SSH 连接,并使用 sudo 用户 执行后续步骤。

要设置特权特定于项目的 runner,请在终端上输入以下命令,并将域名和上面复制的注册令牌替换为您自己的:

此输出显示注册成功:

output

要验证您的 GitLab 实例是否已识别该 runner,请返回浏览器并刷新 Settings > CI/CD 页面。展开 Runners 区域,您应该会在 特定 Runner:

Docker Image 2

或者,如果您转到 管理面板(通过点击顶部栏中的 菜单 按钮并选择 管理), 然后在菜单选项中选择 Runners

admin

您应该会到达此页面,其中显示了连接到您的 GitLab 实例 的所有可用 runner,包括共享 runner 和特定于项目的 runner:

GitLab instance

至此,您已成功设置了一个可以构建 Docker 镜像的 runner。

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

一些关键的工作流需要独立于外部服务。这就是 GitLab 自托管的 Docker Registry 派上用场的地方。它不仅安全,而且能确保您可以根据需要灵活地调整作业和流水线。要设置 Docker Registry,您需要修改 GitLab 的配置文件。首先,通过 SSH 登录到 GitLab 实例,然后使用以下命令打开该文件:

向下滚动,直到您看到 Container Registry Settings:

Docker Image 3

取消注释包含 registry_external_url 的行,并将其设置为您的 GitLab 实例域名,在末尾指定端口 8888

接下来,我们需要通过添加以下行来指定镜像仓库在哪里可以找到 Let’s Encrypt 证书。请记得修改为您实际的 GitLab 实例域名:

完成后,保存并关闭文件。在终端中输入以下命令以重新配置 GitLab:

接下来,等待几秒钟让命令执行完毕。如果成功,您应该会看到以下输出:

gitlab reconfigured

接下来,我们需要确保防火墙(ufw)允许流量通过我们使用以下命令分配的镜像仓库端口:

然后,您需要通过使用 Docker Registry 命令从另一台安装了 Docker 的机器登录,以测试 docker login 正在运行。如果您尚未在本地环境中设置 Docker,可以通过 SSH 登录到已安装 Docker 的 GitLab CI runner 服务器。接下来,执行以下命令,当然要指定您的 GitLab 实例域名:

您的输出将显示 Login Succeeded 消息,如下所示:

login succeeded

这意味着镜像仓库已成功配置并正在运行。当您创建镜像时,它们将本地存储在 GitLab 服务器的文件系统中。对于私有公司镜像仓库来说,这没有问题。但是,如果您计划将镜像仓库向公众开放,您可能需要更大的存储空间。幸运的是,GitLab 提供了连接到存储桶的选项。您可以阅读官方的 GitLab container registry docs ,以了解如何为您的 GitLab 实例配置存储桶。

步骤 3:修改 gitlab-ci.yml 文件并构建 Docker 镜像

要继续此步骤,您应该在 GitLab 实例上拥有 Node Pipeline 项目。以下是该项目在 GitLab 上的视图:

Node Pipeline

我们讨论过 gitlab-ci.yml 是 GitLab CI runner 在被触发时读取的文件,以了解如何构建您的应用程序并执行自动化测试。我们需要修改此文件以添加构建 Docker 镜像的指令。您可以选择直接在 GitLab 界面中编辑此文件。您也可以将其克隆到本地计算机上,使用您最喜欢的编辑器进行编辑,然后进行提交并 git push 回 GitLab。为简便起见,我们将使用 GitLab 实例。

点击文件将其打开,然后点击 编辑 按钮:

Edit

这将打开文件以供编辑。删除文件中的所有内容并添加以下代码:

在添加上述代码片段时,请记得用您的实际详细信息更新突出显示的部分。完成后,通过按下 提交更改 按钮保存更改。如果您一直在 GitLab 之外进行操作,请提交并推送您的更改。

让我们来了解一下我们添加到 .gitlab-ci.yml 文件中的代码在做什么。第一行告诉 GitLab 使用官方的 Docker-in-Docker 镜像 并将其附加到 docker-in-docker 服务(docker:dind)。然后我们为 build, test、以及 release 定义阶段。build 阶段使用 Dockerfile 中的指令构建镜像,然后将其上传到 Docker 镜像仓库(我们在上一步中设置的)。

build 阶段成功后,test 阶段会下载该镜像,将其作为容器运行,并执行 npm test 命令以在其中执行自动化测试。如果 test 阶段成功,则 release 阶段接管。在 release 阶段,镜像会被下载并标记为 node_pipeline:latest。然后它会被推送回镜像仓库。

这只是演示项目的基本配置。对于您的实际项目,您可能会有其他阶段,例如 staging, production 等。编辑后保存文件时,会触发流水线。然后它开始运行作业。返回到 Node Pipeline 页面。您应该会看到该作业当前正在运行:

staging

点击 CI 指示器图标以查看作业的不同阶段:

Docker Image 7

如上面的屏幕截图所示,根据绿色勾选图标,所有阶段都已成功。您可以点击每个阶段来查看作业输出:

Docker Image 6

在左侧菜单中,点击 软件包 & 镜像库 并选择 容器镜像库:

Docker Image 5

这将打开一个页面,列出所选项目可用的 Docker 镜像。我们构建并发布的镜像应该会出现在列表中,并带有标签 已分配:

container registry点击以显示镜像的各种标签:

Docker Image 4

如果您的本地环境中安装了 Docker,您可以拉取该镜像并测试其是否按预期运行。点击 复制 图标(位于镜像标签名称旁)。它会将完整的镜像名称复制到您的剪贴板,您可以将其与 docker pull 命令一起使用:

上述命令将拉取镜像并在容器内运行它:

pull the image and run

该应用现在正运行在端口 8090. 如果您打开浏览器并访问 your-IP-address:8090 您应该会看到显示的页面:

hello, world

如果您能在浏览器中看到这样的页面,那么您已成功构建了 Docker 镜像并将其共享到了私有 Docker Registry。未来,如果您对 master 分支进行任何更改,在 .gitlab-ci.yml 文件中定义的阶段将会运行,如果它们成功,一个带有标签 latest 的新 Docker 镜像将被重新构建并推送到镜像仓库。

结论

在这个项目中,您学习了如何将 privileged GitLab runner 添加到您的 GitLab 自托管实例中,以便您可以构建 Docker 镜像。您还配置了一个私有 Docker 镜像仓库来托管您的镜像。使用 Node pipeline 项目,您能够测试该设置的每个组件,并确保它们按预期连接和通信。一旦您的镜像在镜像仓库中可用,您就能够拉取它并确认它在容器内运行。

这是一个入门教程,为您提供了在此基础上进行构建的基础知识。请遵循官方的 GitLab 文档以了解有关 GitLab 的更多信息。此链接可以提供有关 GitLab Container Registry.

有关利用 Docker 的更多资源,您可能需要查看更多教程,在 我们的博客:

祝您计算愉快!

author

Hark Labs

作者 · CloudSigma

Preslav Dobrev 是 CloudSigma 的创意设计师,专注于通过传统和创新营销渠道打造一致的企业形象。他擅长将艺术愿景与战略营销相融合,创造具有影响力的品牌叙事。

评论

暂无评论。发表第一条评论吧。