如何在 Ubuntu 22.04 上使用 Watchtower 自动更新 Docker 容器映像

介绍

每个 Docker 容器都需要一个 Docker 图像作为其基础. Docker图像可能在当地存在,也可能被从Docker寄存器中远程取出. 这些寄存器可以随着时间的推移存储一个多克图像的每一个迭代,只要它们同名并被标记区分. Docker寄存器随后被存储在Docker登记册中,该登记册收藏了寄存器. Docker Hub是最出名的注册机构,由Docker团队托管的官方注册机构.

Base Docker 图像在整个开发过程中都会被更新,但默认这些更新必须手动拉出并应用到每个运行的容器上. [Watchtower] (https://github.com/containrr/watchtower) 自动实现此进程,以检测对您多克容器底像的更新. 具体来说,它为新的多克图像推力监视指定的多克图像存储器. 此寄存器可以是公有的也可以是私有的,托管在多克枢纽注册站或您自己的图像注册站上.

通过将新 Docker 图像推到您的存储库,Watchtower 将自动启动一系列事件,以更新您的运行容器的基本 Docker 图像。当Watchtower 检测到新的推移时,它将拖动新的基本图像,优雅地关闭您的运行容器,并启动备份。

在本教程中,您将使用 Watchtower 使用 Docker 的运行命令和 Docker Compose 自动更新 Docker 图像。在创建运行 Watchtower 的容器时,两种方法在功能上相同,然后将其指向您希望自动更新的容器。

前提条件

要完成本教程,您将需要:

  • Ubuntu 22.04服务器,根据我们[Ubuntu 22.04初始服务器设置指南](https://andsky.com/tech/tutorials/初始服务器-setup- with-ubuntu-22-04)设置,拥有"sudo"权限的非 root** 用户并启用了防火墙.
  • 在您的服务器上安装了多克,遵循 Steps 1和2** [如何在Ubuntu 22.04上安装和使用多克 (https://andsky.com/tech/tutorials/how-to-install-and-use-docker-on-ubuntu-22-04).
  • 如果您计划在 [Docker Hub] (https://hub.docker.com/) 上使用自定义的 Docker 图像进行测试更新, 您需要 Docker Hub 账户 。 熟悉将更改推向多克枢纽存储器,并创建自定义 ). Docker image in your Docker Hub.
  • Docker 编译器安装在您的服务器上,遵循 步骤1** [如何安装和使用Ubuntu 22.04上的Docker 编译 (https://andsky.com/tech/tutorials/how-to-install-and-use-docker-compose-on-ubuntu-22-04).
  • 联合国 如果您计划通过 Gmail 设置仅监视器通知, 您需要启用 2- Step 校验的 Gmail 账户, 那么您就必须为 Gmail 创建一个针对应用程序的 App 密码 。 如果您不熟悉这一过程,请查看如何使用Google的SMTP服务器. .

步骤 1 — 使用 Docker 的运行命令观看外部维护的 Docker 图像

在您开始使用 Watchtower 之前,您需要一个目标容器来观看。这个目标容器可以是您自己的存储库中的自定义图像,也可以是由第三方维护的公开可用图像。

首先,使用(https://hub.docker.com/_/ubuntu)创建一个容器,由Canonical外部维护。Docker容器只存在,只要一个进程在其内部运行,否则它会终止以节省资源。为了绕过这个测试目的,本教程中的示例命令包括睡眠无限,以保持容器活跃并准备接受更新。

通常,一个docker run呼叫将接管您的终端,并防止在容器活跃时进一步输入命令。 为了避免这种情况,请将d标志添加到单独运行容器中。

1docker run -d \
2  --name ubuntu-container \
3  ubuntu \
4  sleep infinity

现在你有一个容器来观看基本图像更新,你可以启动观察塔.观察塔不需要通过apt进行常规安装。

使用docker run命令类似于之前的命令,但具有官方的观察塔图像,名为containrrr/watchtower。所有观察塔呼叫必须包含安装docker.sockv旗帜,作为从您的Docker容器内部连接到正在运行的服务器。

Watchtower 会自动检测它观看的集装箱的基本图像。启动你的观察塔集装箱并将ubuntu-container作为集装箱名称,以查看更新:

1docker run -d \
2  --name watchtower \
3  -v /var/run/docker.sock:/var/run/docker.sock \
4  containrrr/watchtower \
5  ubuntu-container

Docker 會從 Docker Hub 拉出「containrrr/watchtower」圖像,因為它無法在您的伺服器上本地找到它,然後創建並啟動容器,返回類似於此的輸出:

1[secondary_label Output]
2Unable to find image 'containrrr/watchtower:latest' locally
3latest: Pulling from containrrr/watchtower
41045b2f97fda: Pull complete
535a104a262d3: Pull complete
61a0671483169: Pull complete
7Digest: sha256:bbf9794a691b59ed2ed3089fec53844f14ada249ee5e372ff0e595b73f4e9ab3
8Status: Downloaded newer image for containrrr/watchtower:latest
9b6d1b765b2b8480357f246d3bcc3f422ff492b3deabb84cb0ab2909e2d63b9d3

检查您的两个容器是否运行:

1docker ps

您的输出可能略有不同,但此输出将列出两个容器:

1[secondary_label Output]
2CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3b6d1b765b2b8 containrrr/watchtower   "/watchtower custom_…"   2 minutes ago Up 2 minutes 8080/tcp watchtower
456ac4341d662 ubuntu                  "sleep infinity"         6 minutes ago Up 5 minutes ubuntu-container

當 Canonical 團隊將更新推送到官方的「ubuntu」 Docker 影像儲存庫時,您的「watchtower」容器會自動檢測變更,並啟動「ubuntu-container」的優雅關閉。

如果您想实时验证此更新流程,则必须通过在 Docker Hub 上对自己的自定义图像进行测试推送,这将在 Step 4 中展示。

要停止使用Watchtower,请使用Docker的停止命令停止您的Watchtower容器。Watchtower容器与任何其他Docker容器相同,所有标准的Docker命令都适用。

1docker stop watchtower ubuntu-container

使用Docker的rm命令完全移除容器,然后停止它们:

1docker rm watchtower ubuntu-container

有了这个,你现在可以根据你的需要开始,停止和删除观察塔。

步骤 2 — 在 Docker 组件文件中设置守望塔

可以使用 Docker 的运行命令创建 Watchtower 容器,也可以通过 Docker Compose. 将以前的命令翻译成 Docker Compose 文件,可为您的 Watchtower 设置提供可维护的集中位置。

<$>[注] 注: 本教程中写的完整的Docker Compose文件在** Step 5** 中为您的参考提供。

首先,为您的 Watchtower 项目创建一个目录,然后导航:

1mkdir ~/watchtower
2cd ~/watchtower

使用nano或您喜爱的文本编辑器创建名为docker-compose.yml的新 YAML 文件:

1nano docker-compose.yml

服务定义以前的同一ubuntu图像,这次是使用Docker Compose格式。Docker图像、容器名称和给出的命令将与您用运行命令定义的上一步的图像完全相同。

1[label docker-compose.yml]
2version: "3"
3services:
4  ubuntu:
5    image: ubuntu
6    container_name: ubuntu-container
7    command: sleep infinity

接下来,添加第二个服务,将处理创建您的观察塔容器。 再次,这些设置是您在步骤 1中的运行命令中定义的设置的准确翻译。

1[label docker-compose.yml]
2. . .
3
4  watchtower:
5    image: containrrr/watchtower
6    container_name: watchtower
7    volumes:
8      - /var/run/docker.sock:/var/run/docker.sock
9    command: ubuntu-container

保存和退出你的文件 如果你使用了nano,你可以通过按CTRL+O,ENTER,然后CTRL+X来做到这一点。现在你可以使用docker compose up来启动你的容器。

1docker compose up -d

您现在从步骤 1 获得了完全相同的设置,现在已被翻译成 Docker Compose. 接下来是使用 Watchtower 观看多个自定义容器。

步骤 3 – 观看多个容器,包括自定义图像

观察塔服务运行一个名为观察塔的容器,它跟踪一个名为ubuntu-container的单个容器,由ubuntu服务管理。

假设您遵循了 如何在 Ubuntu 22.04 上安装和使用 Docker 的前提条件的第 5 步至第 8 步,您在 Docker Hub 存储库中有一个名为 ubuntu-nodejs 的自定义图像,基于 Docker 的官方 ubuntu 图像,但经过修改以便安装 Node.js。

为了做好准备,创建两个自定义容器,名为测试容器编辑容器,运行相同的ubuntu-nodejs Docker 图像。

1nano docker-compose.yml

添加将这些容器创建的服务,以您的 Docker Hub 用户名取代sammy:

 1[label docker-compose.yml]
 2. . .
 3
 4  custom-test:
 5    image: sammy/ubuntu-nodejs
 6    container_name: test-container
 7    command: sleep infinity
 8
 9  custom-edit:
10    image: sammy/ubuntu-nodejs
11    container_name: edit-container
12    command: sleep infinity
13
14. . .

观察塔可以观看多个容器的两种方式:默认情况下,观察塔会观看所有活跃的容器,如果容器名称没有通过命令传输,但观看所有容器并不总是理想的。

测试容器添加到被观察塔追踪的容器列表中,确保添加一个空间:

1[label docker-compose.yml]
2. . .
3
4  watchtower:
5    image: containrrr/watchtower
6    container_name: watchtower
7    volumes:
8      - /var/run/docker.sock:/var/run/docker.sock
9    command: ubuntu-container test-container

现在观察塔跟踪ubuntu 容器测试容器,但不是编辑容器,因为您明确定义了排除它的一份列表。

此外,默认情况下,Watchtower 会每 86400 秒或 24 小时对您的存储库进行图像更新。

1[label docker-compose.yml]
2. . .
3
4  watchtower:
5    image: containrrr/watchtower
6    container_name: watchtower
7    volumes:
8      - /var/run/docker.sock:/var/run/docker.sock
9    command: --interval 30 ubuntu-container test-container

保存并关闭您的文件. 通过再次拨打docker compose up来应用您的更改. 但是,这一次,请通过--force-recreate旗帜来重建您的容器,并使用您更新后的docker-compose.yml文件:

1docker compose up -d --force-recreate

接下来,您可以推动更新以验证 Watchtower 的实时自动更新。

步骤 4 — 在 Docker Hub 上使用自定义图像进行测试更新

要测试自动更新功能,您将不再直接操纵测试容器。相反,您将对编辑容器自定义容器进行编辑,该容器使用相同的ubuntu-nodejs Docker 基图像。

首先,在容器内部进行更改,以验证观察塔能成功执行更新。任何更改都会发生,但很容易看到的就是创建一个测试文件。下面的命令是通过一个Echo命令导入一个tee命令来创建一个名为test.txt的文件,在用户的家庭目录中。该文件的唯一内容是This was updated的行。为了使这些命令工作,它们必须在容器内运行。

要获得编辑容器内部的访问,请使用Docker的exec命令并与-it旗帜相配。exec需要通过可执行程序而不是原始命令,所以您必须通过sh -c来唤起一个壳,通过它您可以传递您的命令:

1docker exec -it edit-container sh -c "echo 'This was updated' | tee ~/test.txt"

作为测试的控制,在您对 Docker 图像存储库进行更改之前,请检查该文件是否存在于测试容器中。下列命令与之前的命令相似,但它使用cat来试图读取文件而不是echotee来创建它:

1docker exec -it test-container sh -c "cat ~/test.txt"

由于这个文件尚未存在于测试容器中,因此输出:

1[secondary_label Output]
2cat: /root/test.txt: No such file or directory

现在你已经验证了测试容器不包含测试文件,现在是时候将更改交给你的Docker存储库了。

承诺更改,将您的 Docker Hub 用户名替换为sammy:

1docker commit -m "added test file" -a "sammy" edit-container sammy/ubuntu-nodejs

接下来,使用您的 Docker Hub 用户名登录您的 Docker Hub 帐户,然后请您输入您的 Docker Hub 密码:

1docker login -u sammy

完成你的承诺:

1docker push sammy/ubuntu-nodejs

您的ubuntu-nodejs基础Docker 图像既用于测试容器又用于编辑容器现在更新了,因为您只直接编辑了编辑容器,现在是时候验证观察塔是否自动更新了测试容器以相同的更改。

请记住,您的观察塔实例目前设置为 30 秒的投票时间,更新和重新启动本身需要时间,因此,等待大约一分钟才能完成更新。

过了足够的时间后,运行与之前相同的命令,以检查测试容器中的测试文件是否存在:

1docker exec -it test-container sh -c "cat ~/test.txt"

这一次不会有错误:

1[secondary_label Output]
2This was updated

创建试用容器后,您从未手动编辑过其内容,而观察塔则基于您的更新完成了基于ubuntu-nodejs的基本图像的自动更新,该图像通过编辑容器进行编辑。

步骤5 — 启用电子邮件通知的仅监控模式(可选)

有些情况下,完全自动的基本图像更新是不可取的. 每个更新都需要一个容器重新启动,而这本质上是破坏性的。 相反,您可以使用 Watchtower 仅查看更改,而无需自动关闭和应用更新。

打开您的docker-compose.yml文件:

1nano docker-compose.yml

通过添加WATCHTOWER_MONITOR_ONLY设置来设置监控,这是 Watchtower 使用的环境变量:

 1[label docker-compose.yml]
 2. . .
 3
 4  watchtower:
 5    image: containrrr/watchtower
 6    container_name: watchtower
 7    volumes:
 8      - /var/run/docker.sock:/var/run/docker.sock
 9    environment:
10      WATCHTOWER_MONITOR_ONLY: 'true'
11    command: --interval 30 ubuntu-container edit-container

每当),这些通知可以以多种格式提供,包括电子邮件、Slack 和 Microsoft Teams。在这里,您将使用 Gmail 作为 SMTP 服务器设置电子邮件通知。

<美元 > [注] 注: 虽然通过Gmail SMTP服务器发送电子邮件是一个有详细记录的使用案例,但您应当审查如何使用Google的SMTP服务器中概述的过程和安全影响. 建议您为此使用一个新的、单独的Gmail账户。 或者,您可以[将 Postfix 安装并配置为只发送的 SMTP 服务器] (https://andsky.com/tech/tutorials/how-to-install-and-configure-postfix-as-a-send-only-smtp-server-on-ubuntu-20-04 )。 < $ > (美元)

打开您的docker-compose.yml文件:

1nano docker-compose.yml

要启用您的观察塔容器的电子邮件通知功能,您需要添加几个环境变量:

  • WATCHTOWER_NOTIFICATION_EMAIL_FROM:将发送电子邮件的电子邮件地址。

  • `WATCHTOWER_NOTIONation_EMAIL_TO':接收通知电子邮件的电子邮件地址。

  • `WATCHTOWER_NOTIONation_EMAIL_SERVER':SMTP服务器. 在这种情况下,使用Gmail.

  • WATCHTOWER_NOTIONation_EMAIL_SERVER_PORT':用于连接SMTP服务器发送电子邮件的端口. 587'港用于TLS加密。

  • `WATCHTOWER_NOTIONation_EMAIL_SERVER-USER':您的Gmail证书的用户名。

  • `WATCHTOWER_NOTIONation_EMAIL_SERVER-PASWORD':您的Gmail证书的应用密码。 .

 1[label docker-compose.yml]
 2. . .
 3
 4    environment:
 5      WATCHTOWER_MONITOR_ONLY: 'true'
 6      WATCHTOWER_NOTIFICATIONS: email
 7      WATCHTOWER_NOTIFICATION_EMAIL_FROM: your_gmail
 8      WATCHTOWER_NOTIFICATION_EMAIL_TO: recipient_email
 9      WATCHTOWER_NOTIFICATION_EMAIL_SERVER: smtp.gmail.com
10      WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT: 587
11      WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER: your_gmail
12      WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD: gmail_app_password
13
14. . .

保存并关闭您的文件. 您的完成的 docker-compose.yml 文件将包含:

 1[label docker-compose.yml]
 2version: "3"
 3services:
 4  ubuntu:
 5    image: ubuntu
 6    container_name: ubuntu-container
 7    command: sleep infinity
 8
 9  custom-test:
10    image: ubuntu-nodejs
11    container_name: test-container
12    command: sleep infinity
13
14  custom-edit:
15    image: ubuntu-nodejs
16    container_name: edit-container
17    command: sleep infinity
18
19  watchtower:
20    image: containrrr/watchtower
21    container_name: watchtower
22    volumes:
23      - /var/run/docker.sock:/var/run/docker.sock
24    environment:
25      WATCHTOWER_MONITOR_ONLY: 'true'
26      WATCHTOWER_NOTIFICATIONS: email
27      WATCHTOWER_NOTIFICATION_EMAIL_FROM: your_gmail
28      WATCHTOWER_NOTIFICATION_EMAIL_TO: recipient_email
29      WATCHTOWER_NOTIFICATION_EMAIL_SERVER: smtp.gmail.com
30      WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT: 587
31      WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER: your_gmail
32      WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD: gmail_app_password
33    command: --interval 30 ubuntu-container test-container edit-container

接下来,重建您的容器以应用您的更改:

1docker compose up -d --force-recreate

要测试这一点,请重复上一步的命令,而不是进行实际的更改,您可以将当前的图像作为新的:

1docker commit -m "testing notifications" -a "sammy" edit-container sammy/ubuntu-nodejs

将您的更改推到存储库:

1docker push sammy/ubuntu-nodejs

电子邮件通知不会立即发送,可能需要几分钟,这取决于电子邮件服务器的流量情况。

1[label Watchtower updates on a41c05df8cba]
2Watchtower 1.4.0  
3Using notifications: smtp  
4Only checking containers with name "test-container"  
5Scheduling first run: 2022-05-10 12:32:08 +0000 UTC  
6Note that the first check will be performed in 23 hours, 59 minutes, 59 seconds

电子邮件通知会显示更新是可用于您手动应用的。您可以使用您的观察塔容器启动手动更新,使用--rm--run-once旗帜。通常,观察塔作为一个戴蒙运行,观察您分配的容器。

以下是启动观察塔容器的例子,但只运行一次:

1docker run --rm\
2  -v /var/run/docker.sock:/var/run/docker.sock \
3  containrrr/watchtower \
4  --run-once \
5  edit-container

一旦您的观察塔容器完成一次性更新,它将自行删除。

结论

您的容器现在设置为每次将新 Docker 图像推到图像存储库时自动更新,或者当外部维护器更新您正在观看的图像时。

要了解有关如何使用 Docker 容器的更多信息,请参阅本指南(https://andsky.com/tech/tutorials/how-to-share-data-between-docker-containers-on-ubuntu-22-04)。有关如何删除 Docker 容器的更多详细信息,请参阅本指南(https://andsky.com/tech/tutorials/how-to-remove-docker-images-containers-and-volumes)。

Published At
Categories with 技术
comments powered by Disqus