Deploying Docker containers on Azure

预计阅读时间:19分钟

Overview

Docker Azure 集成使开发人员能够在构建云原生应用程序时使用原生 Docker 命令在 Azure 容器实例 (ACI) 中运行应用程序. 新体验提供了 Docker Desktop 和 Microsoft Azure 之间的紧密集成,允许开发人员使用 Docker CLI 或 VS Code 扩展快速运行应用程序,从本地开发无缝切换到云部署.

此外,Docker 和 Microsoft 开发人员技术之间的集成允许开发人员使用 Docker CLI 来:

  • 轻松登录 Azure
  • 在一个 Docker 命令中设置 ACI 上下文,允许您从本地上下文切换到云上下文并快速轻松地运行应用程序
  • 使用 Compose 规范简化单容器和多容器应用程序开发,允许开发人员首次在云容器服务中本地无缝调用完全兼容 Docker 的命令

另请参阅ACI 支持的容器功能的完整列表和 ACI支持的撰写功能的完整列表.

Prerequisites

要在 Azure 上部署 Docker 容器,您必须满足以下要求:

  1. 下载并安装最新版本的 Docker Desktop.

    或者,安装适用于 Linux 的 Docker Compose CLI .

  2. 确保您拥有 Azure 订阅. 您可以开始使用Azure 免费帐户.

Run Docker containers on ACI

Docker 不仅在本地运行容器,还使开发人员能够使用docker run在 ACI 上无缝部署 Docker 容器,或者使用docker compose up命令部署在 Compose 文件中定义的多容器应用程序.

以下部分包含有关如何在 ACI 上部署 Docker 容器的说明. 另请参阅ACI 支持的容器功能的完整列表.

Log into Azure

运行以下命令登录 Azure:

$ docker login azure

这将打开您的 Web 浏览器并提示您输入您的 Azure 登录凭据. 如果 Docker CLI 无法打开浏览器,它将回退到Azure 设备代码流并允许您手动连接. 请注意, Azure 命令行登录与 Docker CLI Azure 登录是分开的.

或者,您可以使用 Azure 服务主体,使用docker login azure --client-id xx --client-secret yy --tenant-id zz无需交互(通常在脚本或持续集成方案中)登录

Note

通过 Azure 服务提供者登录会获得一个短期有效的访问令牌(通常为 1 小时),但它不允许您自动透明地刷新此令牌. 使用服务提供商登录时,如果访问令牌过期,您必须手动重新登录.

如果 Azure 中有多个可用的租户,也可以单独使用--tenant-id选项来指定租户.

Create an ACI context

登录后,您需要创建与 ACI 关联的 Docker 上下文以在 ACI 中部署容器. 创建 ACI 上下文需要 Azure 订阅、 资源组和区域. 例如,让我们创建一个名为myacicontext的新上下文:

$ docker context create aci myacicontext

此命令自动使用您的 Azure 登录凭据来识别您的订阅 ID 和资源组. 然后,您可以交互地选择要使用的订阅和组. 如果您愿意,可以使用以下标志在 CLI 中指定这些选项: --subscription-id--resource-group--location .

如果您的 Azure 帐户中没有任何现有资源组,则docker context create aci myacicontext命令会为您创建一个. 您不必指定任何其他选项来执行此操作.

创建 ACI 上下文后,您可以通过运行docker context ls命令列出您的 Docker 上下文:

NAME                TYPE                DESCRIPTION                               DOCKER ENDPOINT                KUBERNETES ENDPOINT   ORCHESTRATOR
myacicontext        aci                 myResourceGroupGTA@eastus
default *           moby              Current DOCKER_HOST based configuration   unix:///var/run/docker.sock                          swarm

Run a container

现在您已经登录并创建了 ACI 上下文,您可以开始使用 Docker 命令在 ACI 上部署容器.

有两种方法可以使用新的 ACI 上下文. 您可以在 Docker 命令中使用--context标志来指定您希望使用新创建的 ACI 上下文运行该命令.

$ docker --context myacicontext run -p 80:80 nginx

或者,您可以使用docker context use更改上下文,以选择 ACI 上下文作为运行 Docker 命令的焦点. 例如,我们可以使用docker context use命令来部署 Nginx 容器:

$ docker context use myacicontext
$ docker run -p 80:80 nginx

切换到myacicontext上下文后,您可以使用 docker docker ps列出在 ACI 上运行的容器.

在上面启动的演示 Nginx 容器的情况下,ps 命令的结果将在"PORTS"列中显示容器正在运行的 IP 地址和端口. 比如它可能会显示52.154.202.35:80->80/tcp ,你可以通过浏览http://52.154.202.35来查看 Nginx 欢迎页面.

To view logs from your container, run:

$ docker logs <CONTAINER_ID>

要在正在运行的容器中执行命令,请运行:

$ docker exec -t <CONTAINER_ID> COMMAND

要停止并从 ACI 中删除容器,请运行:

$ docker stop <CONTAINER_ID>
$ docker rm <CONTAINER_ID>

您可以使用docker rm删除容器. 要删除正在运行的容器,您必须使用--force标志,或在删除之前使用docker stop停止容器.

Note

在 ACI 上重启容器的语义与使用本地 Docker 上下文进行本地开发时的语义不同. 在 ACI 上,容器将重置为其初始状态并在新节点上启动. 这包括容器的文件系统,因此所有未存储在卷中的状态将在重新启动时丢失.

Running Compose applications

您还可以使用docker compose命令将 Compose 文件中定义的多容器应用程序部署和管理到 ACI. 同一个 Compose 应用程序中的所有容器都在同一个容器组中启动. 容器之间的服务发现使用 Compose 文件中指定的服务名称工作. 容器之间的名称解析是通过在/etc/hosts文件中写入服务名称来实现的,该文件由容器组中的所有容器自动共享.

另请参阅ACI 支持的撰写功能的完整列表.

  1. 确保您使用的是 ACI 上下文. 您可以通过指定--context myacicontext标志或使用命令docker context use myacicontext设置默认上下文来执行此操作.

  2. 运行docker compose updocker compose down以启动然后停止完整的 Compose 应用程序.

默认情况下,docker docker compose up使用当前文件夹中docker-compose.yaml文件. 您可以使用 --workdir 标志指定工作目录,也可以直接使用docker compose --file mycomposefile.yaml up指定 Compose 文件.

您还可以在部署期间使用--project-name标志为 Compose 应用程序指定名称. 如果未指定名称,则名称将从工作目录派生.

使用docker ps时,作为 Compose 应用程序的一部分启动的容器将与单个容器一起显示. 他们的容器 ID 将采用以下格式: <COMPOSE-PROJECT>_<SERVICE> . 这些容器不能单独停止、启动或删除,因为它们都是同一个 ACI 容器组的一部分. 您可以使用docker logs查看每个容器的日志. 您可以使用docker compose ls列出已部署的 Compose 应用程序. 这将仅列出组合应用程序,而不是使用docker run启动的单个容器. 您可以使用docker compose down删除 Compose 应用程序.

Note

当前的 Docker Azure 集成不允许从构成 Compose 应用程序的所有容器中获取组合日志流.

Updating applications

从已部署的 Compose 应用程序中,您可以通过使用相同的项目名称重新部署它来更新应用程序: docker compose --project-name PROJECT up .

更新应用程序意味着 ACI 节点将被重用,并且应用程序将保留先前分配用于公开端口的相同 IP 地址(如果有). ACI 对现有应用程序中可以更新的内容有一些限制(例如,您将无法更改 CPU/内存预留),在这些情况下,您需要从头开始部署新应用程序.

如果您在已部署的 Compose 文件上调用docker compose up ,则更新是默认行为,因为 Compose 项目名称源自默认情况下 Compose 文件所在的目录. 您需要在再次运行docker compose up之前显式执行docker compose down以完全重置 Compose 应用程序.

Releasing resources

可以使用docker prune命令从 ACI 中删除单个容器和 Compose 应用程序. docker prune命令删除当前未运行的部署. 要删除正在运行的 depoyments,您可以指定--force . --dry-run选项列出了计划删除的部署,但实际上并没有删除它们.

$ ./bin/docker --context acicontext prune --dry-run --force
Resources that would be deleted:
my-application
Total CPUs reclaimed: 2.01, total memory reclaimed: 2.30 GB

Exposing ports

单个容器和 Compose 应用程序可以选择公开端口. 对于单个容器,这是使用 docker docker run命令的--publish ( -p ) 标志完成的: docker run -p 80:80 nginx .

对于 Compose 应用程序,您必须在 Compose 文件服务定义中指定公开的端口:

services:
  nginx:
    image: nginx
    ports:
      - "80:80"

Note

ACI 不允许端口映射(即在公开端口时更改端口号). 因此,在部署到 ACI 时,源端口和目标端口必须相同.

同一个 Compose 应用程序中的所有容器都部署在同一个 ACI 容器组中. 同一 Compose 应用程序中的不同容器在部署到 ACI 时不能公开相同的端口.

默认情况下,在为您的应用程序公开端口时,随机公共 IP 地址与支持已部署应用程序(单个容器或 Compose 应用程序)的容器组相关联. 该 IP 地址可以在使用docker ps或使用docker inspect列出容器时获得.

DNS label name

除了在随机 IP 地址上公开端口外,您还可以指定 DNS 标签名称以在以下形式的 FQDN 上公开您的应用程序: <NAME>.region.azurecontainer.io .

您可以在执行docker run时使用--domainname标志设置此名称,或者在执行docker compose up时使用 Compose 文件中的domainname字段:

services:
  nginx:
    image: nginx
    domainname: "myapp"
    ports:
      - "80:80"

Note

Compose 应用的域名只能设置一次,如果为多个服务指定domainname ,则该值必须相同.

FQDN <DOMAINNAME>.region.azurecontainer.io必须可用.

Using Azure file share as volumes in ACI containers

您可以部署使用存储在卷中的持久数据的容器或 Compose 应用程序. Azure 文件共享可用于支持 ACI 容器的卷.

使用具有存储帐户名称mystorageaccount和文件共享名称myfileshare的现有 Azure 文件共享,可以在部署run命令中指定卷,如下所示:

$ docker run -v mystorageaccount/myfileshare:/target/path myimage

The runtime container will see the file share content in /target/path.

在 Compose 应用程序中,卷规范必须在 Compose 文件中使用以下语法:

myservice:
  image: nginx
  volumes:
    - mydata:/mount/testvolumes

volumes:
  mydata:
    driver: azure_file
    driver_opts:
      share_name: myfileshare
      storage_account_name: mystorageaccount

Note

Compose 文件中的卷短语法不能用于本地绑定挂载的卷定义. 在 Compose 文件中使用卷驱动程序和驱动程序选项语法可以使卷定义更加清晰.

在单容器或多容器部署中,Docker CLI 将使用您的 Azure 登录来获取存储帐户的密钥,并为该密钥提供容器部署信息,以便容器可以访问卷. 可以通过 Azure 登录名访问的任何存储帐户中的任何文件共享中使用卷. 您可以在挂载卷时指定rw (读/写)或ro (只读)(默认为rw ).

Managing Azure volumes

要在使用 ACI Docker 上下文时创建可在容器或 Compose 应用程序中使用的卷,可以使用docker volume create命令,并指定 Azure 存储帐户名称和文件共享名称:

$ docker --context aci volume create test-volume --storage-account mystorageaccount
[+] Running 2/2
 ⠿ mystorageaccount  Created                         26.2s
 ⠿ test-volume       Created                          0.9s
mystorageaccount/test-volume

默认情况下,如果存储帐户尚不存在,此命令将使用标准 LRS 作为默认 SKU 以及与 Docker ACI 上下文关联的资源组和位置创建一个新的存储帐户.

如果您指定现有存储帐户,该命令会在现有帐户中创建新文件共享:

$ docker --context aci volume create test-volume2 --storage-account mystorageaccount
[+] Running 2/2
 ⠿ mystorageaccount   Use existing                    0.7s
 ⠿ test-volume2       Created                         0.7s
mystorageaccount/test-volume2

或者,您可以使用 Azure 门户或az 命令行创建 Azure 存储帐户或文件共享.

您还可以列出可用于容器或 Compose 应用程序的卷:

$ docker --context aci volume ls
ID                                 DESCRIPTION
mystorageaccount/test-volume       Fileshare test-volume in mystorageaccount storage account
mystorageaccount/test-volume2      Fileshare test-volume2 in mystorageaccount storage account

要删除卷和相应的 Azure 文件共享,请使用volume rm命令:

$ docker --context aci volume rm mystorageaccount/test-volume
mystorageaccount/test-volume

这将永久删除 Azure 文件共享及其所有数据.

在 Azure 中删除卷时,该命令会检查指定的文件共享是否是存储帐户中唯一可用的文件共享. 如果存储帐户是使用docker volume create命令创建的,则docker volume rm在没有任何文件共享时也会删除存储帐户. 如果您使用的是未使用docker volume create命令(例如通过 Azure 门户或使用az命令行)创建的存储帐户,则docker volume rm不会删除该存储帐户,即使它的剩余文件共享为零.

Environment variables

使用docker run时,您可以使用--env标志将环境变量传递给 ACI 容器. 对于 Compose 应用程序,您可以使用environmentenv-file service 字段或--environment命令行标志在 Compose 文件中指定环境变量.

Health checks

您可以使用带有--healthcheck-前缀的标志和 docker docker run指定容器健康检查,或者在 Compose 文件中使用服务的healthcheck部分.

运行状况检查转换为 ACI LivenessProbe . ACI 定期运行健康检查命令,如果失败,容器将被终止.

除了重新启动策略之外,还必须使用运行状况检查以确保容器在终止时重新启动. docker run的默认重启策略是no ,它不会重启容器. Compose 的默认重启策略是any总是尝试重启服务容器的策略.

使用docker run示例:

$ docker --context acicontext run -p 80:80 --restart always --health-cmd "curl http://localhost:80" --health-interval 3s  nginx

使用 Compose 文件的示例:

services:
  web:
    image: nginx
    deploy:
      restart_policy:
        condition: on-failure
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:80"]
      interval: 10s

Private Docker Hub images and using the Azure Container Registry

您可以将私有映像部署到由任何容器注册表托管的 ACI. 在运行docker rundocker compose up之前,您需要使用docker login登录到相关注册表. Docker CLI 将获取已部署映像的注册表登录名,并将凭据与映像部署信息一起发送到 ACI. 对于 Azure 容器注册表,命令行将尝试从您的 Azure 登录自动登录到 ACR. 如果您的 Azure 登录名有权访问 ACR,则无需先手动登录 ACR 注册表.

Using ACI resource groups as namespaces

您可以创建多个与 ACI 关联的 Docker 上下文. 每个上下文都必须与唯一的 Azure 资源组相关联. 这允许您使用 Docker 上下文作为命名空间. 您可以使用docker context use <CONTEXT>在命名空间之间切换.

当您运行docker ps命令时,它只会列出当前 Docker 上下文中的容器. 两个 Docker 上下文之间的容器名称或 Compose 应用程序名称不会有任何争用.

Install the Docker Compose CLI on Linux

Docker Compose CLI 添加了对在 Azure 容器实例 (ACI) 上运行和管理容器的支持.

Install Prerequisites

Install script

您可以使用安装脚本安装新的 CLI:

$ curl -L https://raw.githubusercontent.com/docker/compose-cli/main/scripts/install/install_linux.sh | sh

Manual install

您可以从最新发布页面下载 Docker ACI 集成 CLI.

然后,您需要使其可执行:

$ chmod +x docker-aci

要启用使用本地 Docker 引擎并使用现有的 Docker 上下文,您必须在PATH的某处将现有的 Docker CLI 作为com.docker.cli . 您可以通过从现有 Docker CLI 创建符号链接来完成此操作:

$ ln -s /path/to/existing/docker /directory/in/PATH/com.docker.cli

Note

PATH环境变量是一个以冒号分隔的目录列表,优先级从左到右. 您可以使用echo $PATH查看它. 您可以使用which docker找到现有 Docker CLI 的路径. 您可能需要 root 权限才能建立此链接.

已安装Docker 引擎的全新 Ubuntu 20.04 安装上:

$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
$ which docker
/usr/bin/docker
$ sudo ln -s /usr/bin/docker /usr/local/bin/com.docker.cli

您可以通过检查新 CLI 是否使用默认上下文来验证这是否有效:

$ ./docker-aci --context default ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
$ echo $?
0

要使此 CLI 与 ACI 集成成为您的默认 Docker CLI,您必须将其移动到PATH中优先级高于现有 Docker CLI 的目录.

同样,在新的 Ubuntu 20.04 上:

$ which docker
/usr/bin/docker
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
$ sudo mv docker-aci /usr/local/bin/docker
$ which docker
/usr/local/bin/docker
$ docker version
...
 Azure integration  0.1.4
...

Supported commands

安装 Docker ACI 集成 CLI 后,运行--help以查看当前命令列表.

Uninstall

要删除 Docker Azure 集成 CLI,您需要从PATH中删除下载的二进制文件和com.docker.cli . 如果您使用脚本安装,则可以按如下方式完成:

$ sudo rm /usr/local/bin/docker /usr/local/bin/com.docker.cli

Feedback

感谢您试用 Docker Azure 集成. 您的反馈对我们来说很重要. 通过在compose-cli GitHub 存储库中创建问题,让我们知道您的反馈.

Docker, Azure, Integration, ACI, context, Compose, cli, deploy, containers, cloud

by  icopy.site