Развертывание контейнеров Docker в Azure

Обзор

Интеграция Docker с Azure позволяет разработчикам использовать собственные команды Docker для запуска приложений в экземплярах контейнеров Azure (ACI) при создании облачных приложений. Новый интерфейс обеспечивает тесную интеграцию между Docker Desktop и Microsoft Azure, позволяя разработчикам быстро запускать приложения с помощью расширения Docker CLI или VS Code, чтобы плавно переключаться с локальной разработки на облачное развертывание.

Кроме того, интеграция между Docker и технологиями разработчиков Microsoft позволяет разработчикам использовать интерфейс командной строки Docker для:

  • Простой вход в Azure

  • Настраивает контекст ACI с помощью одной команды Docker, что позволит вам переключаться с локального контекста на облачный контекст и быстро и легко запускать приложения.

  • Упростите разработку одноконтейнерных и мультиконтейнерных приложений с помощью спецификации Compose, позволяющей разработчику впервые без проблем вызывать полностью совместимые с Docker команды непосредственно в службе облачных контейнеров.

Также см. полный список функций контейнера, поддерживаемых ACI и полный список поддерживаемых функций установки Docker Compose cli на Linux с помощью ACI.

Пререквизиты

Чтобы развернуть контейнеры Docker в Azure, необходимо выполняет следующие требования.

  1. Загружает и устанавливает последнюю версию Docker Desktop.

    В качестве альтернативы устанавливает пакет Docker Compose CLI для Linux.

  2. Убедиться, что у вас есть подписка Azure. Вы можете начать с Бесплатная учетная запись Azure.

Запуск контейнеров Docker в ACI

Docker не только запускает контейнеры локально, но также позволяет разработчикам беспрепятственно развертывать контейнеры Docker в ACI с помощью docker run или развертывать многоконтейнерные приложения, определённые в файле Compose, с помощью команды docker compose up.

Следующие разделы содержат инструкции по развертыванию контейнеров Docker в ACI. Также см. полный список функций контейнера, поддерживаемых ACI.

Войти в Azure

Выполняет следующие команды, чтобы войти в Azure:

$ docker login azure

Откроется ваш веб-браузер и вам будет предложено ввести учетные данные для входа в Azure. Если Docker CLI не может открывает браузер, он вернется к Поток кода устройства Azure и позволит вам подключиться вручную. Обратите внимание, что логин Командная строка Azure отделён от логина Docker CLI Azure.

Кроме того, вы можете войти в систему без взаимодействия (обычно в сценариях или сценариях непрерывной интеграции) с помощью субъекта-службы Azure с кодом docker login azure --client-id xx --client-secret yy --tenant-id zz.

Примечание

При входе через поставщика сервисов Azure вы получаете токен доступа, действительный в течение короткого периода времени (обычно 1 час), но он не позволяет вам автоматически и прозрачно обновлять данный токен. Вы должны вручную повторно войти в систему, когда срок действия маркера доступа истек при входе в систему с поставщиком сервисов.

Вы также можете использовать только параметр --tenant-id, чтобы указывает арендатора, если у вас есть несколько доступных в Azure.

Создаёт контекст ACI

После входа в систему вам необходимо создать контекст Docker, связанный с ACI, для развертывания контейнеров в ACI. Для создания контекста ACI требуется подписка Azure, группа ресурсов и регион. Например, давайте создадим новый контекст с именем myacicontext:

$ docker context create aci myacicontext

Эта команда автоматически использует ваши учетные данные для входа в Azure для идентификации ваших идентификаторов подписки и групп ресурсов. Затем вы можете в интерактивном режиме выбрать подписку и группу, которые хотите использовать. При желании вы можете указывает данные параметры в CLI, используя следующие флаги: --subscription-id, --resource-group и --location.

Если в вашей учетной записи Azure нет существующих групп ресурсов, команда docker context create aci myacicontext создаст её для вас. Никаких дополнительных параметров для этого указывать не нужно.

После того, как вы создали контекст ACI, вы можете просмотреть список своих контекстов Docker, выполнив команду docker context ls:

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

Запускает контейнер

Теперь, когда вы вошли в систему и создали контекст ACI, вы можете начать использовать команды Docker для развертывания контейнеров в ACI.

Есть два способа использовать ваш новый контекст ACI. Вы можете использовать флаг --context с командой Docker, чтобы указывает, что вы хотите запускает команду, используя только что созданный контекст 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 ps для вывода списка ваших контейнеров, работающих в ACI.

В случае демонстрационного контейнера Nginx, запущенного выше, результат выполнения команды ps отобразит в столбце «PORTS» IP-адрес и порт, на котором работает контейнер. Например, он может отображать 52.154.202.35:80->80/tcp, и вы можете просмотреть страницу приветствия Nginx, просмотрев http://52.154.202.35.

Чтобы просмотреть журналы из вашего контейнера, запускает:

$ docker logs <CONTAINER_ID>

Чтобы выполняет команду в работающем контейнере, запускает:

$ docker exec -t <CONTAINER_ID> COMMAND

Чтобы останавливает и удаляет контейнер из ACI, запускает:

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

Вы можете удаляет контейнеры, используя docker rm. Чтобы удаляет работающий контейнер, необходимо использовать флаг --force или останавливает контейнер с помощью docker stop перед его удалением.

Примечание

Семантика перезапуска контейнера в ACI отличается от семантики при использовании локального контекста Docker для локальной разработки. В ACI контейнер будет сброшен в исходное состояние и запущен на новом узле. Это включает в себя файловую систему контейнера, поэтому все состояние, не сохраненное в томе, будет потеряно при перезапуске.

Запуск приложений Compose

Вы также можете развертывать многоконтейнерные приложения, определённые в файлах Compose, и управлять ими в ACI с помощью команды docker compose. Все контейнеры в одном приложении Compose запускаются в одной группе контейнеров. Обнаружение службы между контейнерами работает с использованием имени службы, указанного в файле Compose. Разрешение имён между контейнерами достигается путём записи имён служб в файл /etc/hosts, который автоматически совместно используется всеми контейнерами в группе контейнеров.

Также см. полный список функций создания, поддерживаемых ACI.

  1. Убедиться, что вы используете контекст ACI. Вы можете сделать это либо указав флаг --context myacicontext, либо установив контекст по умолчанию с помощью команды docker context use myacicontext.

  2. Запускает docker compose up и docker compose down, чтобы запускает, а затем останавливает полное приложение Compose.

По умолчанию docker compose up использует файл docker-compose.yaml в текущей папке. Вы можете указывает рабочий каталог с помощью флага –workdir или указывает файл Compose напрямую с помощью docker compose --file mycomposefile.yaml up.

Вы также можете указывает имя для приложения Compose, используя флаг --project-name во время развертывания. Если имя не указано, имя будет получено из рабочего каталога.

Контейнеры, запущенные как часть приложений Compose, будут отображаться вместе с отдельными контейнерами при использовании docker ps. Их идентификатор контейнера будет иметь формат: <COMPOSE-PROJECT>_<SERVICE>. Данные контейнеры нельзя останавливает, запускает или удаляет независимо друг от друга, поскольку все они являются частью одной группы контейнеров ACI. Вы можете просматривать журналы каждого контейнера с docker logs. Вы можете перечислить развернутые приложения Compose с docker compose ls. В нем будут перечислены только приложения для создания, а не отдельные контейнеры, начинающиеся с docker run. Вы можете удаляет приложение Compose с помощью docker compose down.

Примечание

Текущая интеграция Docker Azure не позволяет получать объединенный поток журналов из всех контейнеров, составляющих приложение Compose.

Обновление приложений

Из развернутого приложения Compose вы можете обновить приложение, повторно развернув его с тем же именем проекта: docker compose --project-name PROJECT up.

Обновление приложения означает, что узел ACI будет использоваться повторно, а приложение сохранит тот же IP-адрес, который ранее был выделен для предоставления портов, если таковые имеются. ACI имеет некоторые ограничения на то, что может быть обновлено в существующем приложении (например, вы не сможете изменяет резервирование ЦП/памяти), в данных случаях вам необходимо развернуть новое приложение с нуля.

Обновление — это поведение по умолчанию, если вы вызываете docker compose up для уже развернутого файла Compose, поскольку имя проекта Compose происходит от каталога, в котором файл Compose находится по умолчанию. Вам необходимо явно выполняет docker compose down перед повторным запуском docker compose up, чтобы полностью сбросить приложение Compose.

Освобождение ресурсов

Отдельные контейнеры и приложения Compose можно удаляет из ACI с помощью команды docker prune. Команда docker prune удаляет развертывания, которые в данный момент не выполняются. Для удаления запущенных отложений можно указывает --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

Открытие портов

Отдельные контейнеры и приложения Compose могут дополнительно открывать порты. Для отдельных контейнеров это делается с помощью флага --publish (-p) команды docker run: docker run -p 80:80 nginx.

Для приложений Compose необходимо указывает открытые порты в определении файловой службы Compose:

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

Примечание

ACI не позволяет отображать порты (т. е. изменять номер порта при раскрытии порта). Поэтому исходный и целевой порты должны быть одинаковыми при развертывании в ACI.

Все контейнеры в одном приложении Compose развернуты в одной группе контейнеров ACI. Различные контейнеры в одном и том же приложении Compose не могут предоставлять один и тот же порт при развертывании в ACI.

По умолчанию при предоставлении портов для вашего приложения случайный общедоступный IP-адрес связан с группой контейнеров, поддерживающей развернутое приложение (один контейнер или приложение Compose). Данный IP-адрес можно получает при перечислении контейнеров с docker ps или с использованием docker inspect.

Имя метки DNS

Помимо предоставления портов на случайный IP-адрес, вы можете указывает имя метки DNS, чтобы предоставить вашему приложению полное доменное имя в форме: <NAME>.region.azurecontainer.io.

Это имя можно установить с помощью флага --domainname при выполнении docker run или с помощью поля domainname в файле Compose при выполнении docker compose up:

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

Примечание

Домен приложения Compose можно задать только один раз, если указывает domainname для нескольких сервисов, значение должно быть одинаковым.

Полное доменное имя <DOMAINNAME>.region.azurecontainer.io должно быть доступно.

Использование общего файлового ресурса Azure в качестве томов в контейнерах ACI

Вы можете развернуть контейнеры или приложения Compose, использующие постоянные данные, хранящиеся в томах. Файловый ресурс Azure можно использовать для поддержки томов для контейнеров ACI.

Используя существующую общую папку Azure с именем учетной записи хранения mystorageaccount и именем общей папки myfileshare, вы можете указывает том в команде развертывания run следующим образом:

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

Контейнер среды выполнения увидит содержимое файлового ресурса в /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

Примечание

Краткий синтаксис тома в файлах Compose нельзя использовать, поскольку он предназначен для определения тома для локального монтирования привязки. Использование драйвера тома и синтаксиса опций драйвера в файлах Compose делает определение тома более понятным.

В развертываниях с одним или несколькими контейнерами интерфейс командной строки Docker будет использовать ваш вход в Azure для получения ключа к учетной записи хранения и предоставления этому ключу сведений о развертывании контейнера, чтобы контейнер мог получает доступ к тому. Тома можно использовать из любой общей папки в любой учетной записи хранения, к которой у вас есть доступ с помощью входа в Azure. Вы можете указывает rw (чтение/запись) или ro (только чтение) при монтировании тома (по умолчанию rw).

Управление томами Azure

Чтобы создать том, который можно использовать в контейнерах или приложениях Compose при использовании контекста ACI Docker, можно использовать команду 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 или общую папку с помощью портала Azure или az командная строка.

Вы также можете перечислить тома, доступные для использования в контейнерах или приложениях 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 не удаляет учетную запись хранения, даже если в ней не осталось общих файловых ресурсов.

Переменные среды

При использовании docker run вы можете передавать переменные среды в контейнеры ACI, используя флаг --env. Для приложений Compose можно указывает переменные среды в файле Compose с помощью служебного поля environment или env-file или с флагом командной строки --environment.

Проверки здоровья

Вы можете указывает проверки работоспособности контейнера, используя либо флаги с префиксом --healthcheck- с docker run, либо в файле Compose с разделом службы healthcheck.

Проверки работоспособности преобразуются в ACI LivenessProbes. ACI периодически запускает команду проверки работоспособности, и в случае её неудачи работа контейнера будет завершена.

Проверки работоспособности должны использоваться в дополнение к политикам перезапуска, чтобы гарантировать перезапуск контейнера при завершении работы. Политика перезапуска по умолчанию для docker runno, которая не перезапускает контейнер. Политика перезапуска по умолчанию для 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

Частные образы Docker Hub и использование Реестра контейнеров Azure

Вы можете развернуть частные образы в ACI, размещенные в любом реестре контейнеров. Вам необходимо войти в соответствующий реестр, используя docker login, прежде чем запускать docker run или docker compose up. Интерфейс командной строки Docker извлечет ваш логин реестра для развернутых образов и отправит учетные данные вместе с информацией о развертывании образа в ACI. В случае Реестра контейнеров Azure командная строка попытается автоматически войти в ACR из вашего имени входа в Azure. Вам не нужно сначала вручную входить в реестр ACR, если у вашего входа в Azure есть доступ к ACR.

Использование групп ресурсов ACI в качестве пространств имён

Вы можете создать несколько контекстов Docker, связанных с ACI. Каждый контекст должен быть связан с уникальной группой ресурсов Azure. Это позволяет использовать контексты Docker в качестве пространств имён. Вы можете переключаться между пространствами имён, используя docker context use <CONTEXT>.

Когда вы запускаете команду docker ps, она перечисляет только контейнеры в вашем текущем контексте Docker. Не будет никаких конфликтов в именах контейнеров или имён приложений Compose между двумя контекстами Docker.

Устанавливает интерфейс командной строки Docker Compose в Linux.

Docker Compose CLI добавляет поддержку запуска и управления контейнерами в Azure Container Instances (ACI).

Устанавливает необходимые компоненты

Установить скрипт

Вы можете установить новый CLI с помощью скрипта установки:

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

Ручная установка

Вы можете загружает интерфейс командной строки Docker ACI Integration со страницы последний релиз.

Затем вам нужно будет сделать его исполняемым:

$ chmod +x docker-aci

Чтобы включить использование локального Docker Engine и использовать существующие контексты Docker, у вас должен быть существующий Docker CLI как com.docker.cli где-то в PATH. Вы можете сделать это, создав символическую ссылку из существующего интерфейса командной строки Docker:

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

Примечание

Переменная среды PATH представляет собой список каталогов, разделенных двоеточием, с приоритетом слева направо. Вы можете просмотреть его, используя echo $PATH. Вы можете найти путь к существующему интерфейсу командной строки Docker, используя which docker. Вам могут понадобиться root-права, чтобы сделать эту ссылку.

При новой установке Ubuntu 20.04 с Docker Engine уже установлено:

$ 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

Вы можете убедиться, что это работает, проверив, что новый интерфейс командной строки работает с контекстом по умолчанию:

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

Чтобы сделать данный CLI с интеграцией ACI вашим CLI Docker по умолчанию, вы должны переместить его в каталог в PATH с более высоким приоритетом, чем существующий CLI Docker.

Опять же, на свежей 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
...

Поддерживаемые команды

После установки интерфейса командной строки Docker ACI Integration запускает --help, чтобы просмотреть текущий список команд.

Удаляет

Чтобы удаляет Docker Azure Integration CLI, вам необходимо удаляет загруженный двоичный файл и com.docker.cli из вашего PATH. Если вы устанавливали с помощью скрипта, это можно сделать следующим образом:

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

Обратная связь

Спасибо, что попробовали интеграцию с Docker Azure. Ваше мнение очень важно для нас. Сообщить нам свой отзыв, создав задачу в репозитории compose-cli GitHub.