如何使用 Docker CLI 和 Compose 将容器部署到 Azure ACI
推荐超级课程:
在云中运行容器可能既困难又令人困惑。有太多选项可供选择,而且还需要理解从虚拟网络到安全性的不同云服务的工作方式。更不用说编排器了。至少可以说,这是一个学习曲线。
在本教程中,我们将探讨在 Azure ACI 中运行单个容器和使用 Compose 运行多个容器。我们将指导您设置 Docker 上下文,甚至简化登录 Azure 的过程。在本教程结束时,您将能够使用熟悉的 Docker 命令将应用程序部署到您自己的 Azure ACI 账户中。
先决条件
要完成本教程,您需要:
- 在您的开发机上安装 Docker。您可以下载并安装 Docker Desktop Edge 版本 2.3.3.0 或更高版本,链接如下:
- Docker Hub 账户。在这里获取您的免费账户 。
- Azure 账户。免费注册 。
- 在您的开发机上安装 Git 。
- 用于编辑文件的 IDE 或文本编辑器。我推荐使用 VSCode 。
在 ACI 上运行 Docker 容器
与 Azure ACI 的集成非常类似于使用本地容器。开发团队深入考虑了开发者体验,并试图使 ACI 的用户体验尽可能接近于使用本地容器。
让我们在 Azure ACI 上运行一个简单的 Nginx Web 服务器。
登录 Azure
您不需要在机器上安装 Azure CLI 就可以在 ACI 中运行 Docker 镜像。Docker 会处理一切。
您需要做的第一件事是登录 Azure。
$ docker login azure
这将打开一个浏览器窗口,允许您登录 Azure。
选择您的账户并登录。登录后,您可以关闭浏览器窗口。
Azure ACI 上下文
Docker 有上下文的概念。您可以将其视为一个可以运行 Docker 容器的地方。这比实际情况要复杂一些,但现在这个描述已经足够了。在本教程中,我们使用本地上下文和新的 ACI 上下文。
首先,让我们看看我们的本地开发机上当前有哪些上下文。运行以下命令查看上下文列表。
$ docker context list
NAME TYPE DESCRIPTION DOCKER ENDPOINT KUBERNETES ENDPOINT ORCHESTRATOR
default * moby Current DOCKER_HOST based configuration unix:///var/run/docker.sock https://kubernetes.docker.internal:6443 (default) swarm
(注:由于原文在此处被截断,无法提供完整的翻译。如果需要完整翻译,请提供完整的内容。)```markdown 根据您是否已经创建了另一个上下文,您应该只看到一个上下文。这是指向您本地 Docker 引擎的默认上下文,标记为“moby”。您可以通过活跃上下文名称旁边的“*”来识别将用于 Docker 命令的当前上下文。
现在,让我们创建一个可以运行容器的 ACI 上下文。我们将使用创建 aci 命令来创建我们的上下文。
让我们来看看创建 aci 上下文的帮助信息。
$ docker context create aci --help
创建用于 Azure 容器实例的上下文
用法:
docker context create aci CONTEXT [flags]
标志:
--description string 上下文的描述
-h, --help aci 的帮助信息
--location string 位置(默认 "eastus")
--resource-group string 资源组
--subscription-id string 订阅 ID
全局标志:
--config DIRECTORY 客户端配置文件的位置 DIRECTORY(默认 "/Users/peter/.docker")
-c, --context string 上下文
-D, --debug 在日志中启用调试输出
-H, --host string 要连接的守护进程套接字
在帮助信息的 Flags 部分下,您可以看到我们有设置 location、resource-group 和 subscription-id 的选项。
您可以将这些标志传递给创建命令。如果您不这样做,Docker CLI 将在交互模式下询问您这些问题。让我们现在就这样做。
$ docker context create aci myaci
CLI 首先会询问您希望使用哪个订阅。如果您只有一个订阅,Docker 将使用该订阅。
使用仅可用的订阅 : Azure 订阅 1 (b3c07e4a-774e-4d8a-b071-xxxxxxxxxxxx)
现在我们需要选择要使用的资源组。您可以选择一个之前创建的资源组,或者选择“创建新的资源组”。我将选择创建一个新的资源组。
资源组 "c3eea3e7-69d3-4b54-83cb-xxxxxxxxxxxx" (eastus) 已创建
好了,我们的 ACI 上下文已经设置好了。让我们列出我们的上下文。
$ docker context list
您应该看到您刚刚创建的 ACI 上下文。
在 ACI 上运行容器
现在我们已经设置好了 ACI 上下文,我们可以 在云中运行容器了。有两种方法告诉 Docker 您希望命令应用于哪个上下文。
第一种是传递 –context 标志。另一种是告诉 Docker 我们想要使用哪个上下文来执行所有后续命令,通过切换上下文实现。现在,让我们使用 –context 标志。
$ docker --context myaci run -d --name web -p 80:80 nginx
[+] 运行 2/2
⠿ web 已创建
⠿ single--container--aci 完成
web
在这里,您可以看到 Docker 与 ACI 交互,创建了一个名为“web”的容器实例,并启动了一个单一实例。
打开您的 Azure 门户并导航到容器实例。
我们还可以运行您已经熟悉的 Docker CLI 命令,如 ps 和 logs。
切换上下文
让我们查看正在运行的容器。但在我们这样做之前,让我们将活动上下文切换到上面设置的 ACI 上下文,这样我们就不用在每条命令中都输入 –context 了。
$ docker context use myaci
现在,让我们运行 ps 命令,而不传递 –context 标志。
$ docker ps
CONTAINER ID IMAGE COMMAND STATUS
PORTS
web nginx 运行中 52.224.73.190:80->80/tcp
很好,由于我们告诉 Docker 使用 myaci 上下文,我们看到的是在 Azure 账户中运行的容器列表,而不是本地机器上的。
让我们确保容器正在运行。从上面的 ps 输出中复制容器的 IP 地址,并将其粘贴到浏览器地址栏中。您可以看到我们的 Nginx Web 服务器正在运行!
正如我上文提到的,我们还可以查看容器的日志。
$ docker logs web
要停止并移除容器,请运行以下命令。
$ docker rm web
BOOM!
这很简单,集成也很顺畅。凭借您已经熟悉的几个 Docker 命令和几个新命令,我们能够快速且简单地从开发机器在 ACI 中运行容器。
但我们还没完!
我们还可以使用 Docker Compose 运行多个容器。通过 ACI 集成,我们现在有能力通过 Docker CLI 对 ACI 运行 compose 命令。接下来就让我们这么做。
测试Docker Compose App代码
我使用的是一个简单的 Python Flask 应用程序,它将时间戳记录到 Redis 数据库中。让我们分叉仓库,然后将 git 仓库克隆到您的本地机器。
打开您喜欢的浏览器并导航到:https://github.com/pmckeetx/timestamper
在您的本地机器上打开终端,并运行以下 git 命令以将仓库克隆到您的本地开发机器。
确保您将 «github username» 替换为您的 GitHub 用户名。
git clone git@github.com:<<github username>>/timestamper.git
本地构建和运行
确保您位于 timestamper 项目的根目录,并按照以下步骤构建镜像并使用 Docker Compose 启动应用程序。
首先,我们需要在 docker-compose.yml
文件中的镜像添加您的 Docker ID。打开 docker-compose.yml
文件,在编辑器中用您的 Docker ID 替换 <<username>>
。
接下来,我们需要确保使用的是本地 Docker 上下文。
$ docker context use default
现在,我们可以使用 docker-compose
来构建并启动我们的应用程序。
$ docker-compose up --build
Building frontend
Step 1/7 : FROM python:3.7-alpine
---> 6ca3e0b1ab69
Step 2/7 : WORKDIR /app
...
frontend_1 | * Running on http://0.0.0.0:5000/ (按 CTRL+C 退出)
frontend_1 | * Restarting with stat
frontend_1 | * Debugger is active!
frontend_1 | * Debugger PIN: 622-764-646
Docker 将构建我们的时间戳记录器镜像,然后运行 Redis 数据库和我们的时间戳记录器容器。
导航到 http://localhost:5000
并点击几次 “Timestamp!” 按钮。
在 ACI 上使用 Compose
现在,让我们使用新的 Docker Compose 集成在 ACI 上运行我们的应用程序。
我们首先需要将我们的镜像推送到 Docker Hub,这样 ACI 就可以拉取镜像并运行它。运行以下命令将您的镜像推送到您的 Docker Hub 账户。
$ docker-compose push
Pushing frontend (pmckee/timestamper:latest)...
The push refers to repository [docker.io/pmckee/timestamper]
6e899582609b: Pushed
...
50644c29ef5a: Layer already exists
latest: digest: sha256:3ce2607f101a381b36beeb0ca1597cce9925d17a0f826cac0f7e0365386a3042 size: 2201
现在我们的镜像已经在 Hub 上,我们可以使用 Compose 在 ACI 上运行应用程序。
首先,让我们切换到我们的 ACI 上下文。
$ docker context use myaci
记住,要查看上下文列表和当前使用的上下文,可以运行列出上下文的命令。
$ docker context list
好了,现在我们正在使用 ACI 上下文,让我们在云中启动我们的应用程序。
$ docker compose up
[+] Running 3/3
⠿ timestamper Created
⠿ frontend Done
⠿ backend Done
让我们验证我们的应用程序是否正在运行。为了获取我们前端容器的 IP 地址,让我们列出正在运行的容器。
$ docker ps
CONTAINER ID IMAGE COMMAND STATUS PORTS
timestamper_frontend pmckee/timestamper
Running 40.71.234.128:5000->5000/tcp
timestamper_backend redis:alpine
Running
复制上面列出的 IP 地址和端口,并粘贴到您喜欢的浏览器中。
让我们查看我们的 Redis 容器的日志。
$ docker logs timestamper_backend
1:C 13 Jul 2020 18:21:12.044 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
...
1:M 13 Jul 2020 18:21:12.046 # Server initialized
1:M 13 Jul 2020 18:21:12.047 * Ready to accept connections
之后,可以通过运行 compose down
来停止并删除 Compose 应用程序。
$ docker compose down
结论
我们看到了现在在 Azure 上使用Docker的 ACI 集成来运行单个容器或使用 Compose 运行多个容器是多么简单。