介绍
每个 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.sock
的v
旗帜,作为从您的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
来试图读取文件而不是echo
和tee
来创建它:
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)。