Поиск по сайту:

Как контексты Docker позволяют работать с несколькими хостами


Контексты в интерфейсе командной строки Docker предоставляют упрощенный механизм взаимодействия с несколькими конечными точками Docker. Вы можете настроить контексты для каждого из ваших хостов и переключаться между ними на лету.

Когда контекст активен, Docker направит все ваши команды на этот хост. Если вы в основном используете локальную установку Docker, но иногда вам нужно запускать контейнеры в рабочей среде, контексты Docker — это один из доступных вам вариантов.

Любую допустимую конечную точку Docker можно превратить в контекст. Вы можете подключить обычные установки Docker Engine, кластеры Docker Swarm и кластеры Kubernetes в облаке. Каждый сохраненный контекст содержит всю информацию о соединении для указанного хоста.

Создание контекста

Контексты управляются с помощью команды docker context. Вы создаете новые контексты, используя docker context create. Вы должны указать имя для своего контекста, а также его конфигурацию конечной точки.

Вот как создать контекст, который подключается к сокету Docker, доступному через TCP на удаленном хосте:

docker context create remote-host --docker host=tcp:///my-remote-host:2735

Контексты используют Docker Swarm в качестве оркестратора контейнеров по умолчанию. Вы можете явно установить это с помощью флага:

docker context create remote-host 
    --default-stack-orchestrator=swarm 
    --docker host=tcp:///my-remote-host:2735

Чтобы создать подключение к Kubernetes, измените тип оркестратора. Вы также должны добавить флаг --kubernetes и указать путь к файлу конфигурации Kubernetes:

docker context create kubernetes-host 
    --default-stack-orchestrator=kubernetes 
    --kubernetes config-file=/home/username/.kube/config 
    --docker host=unix:///var/run/docker.sock

Выбор контекстов

Активный контекст переключается с помощью docker context use. Передайте имя контекста, который вы хотите активировать.

docker context use remote-host

Все последующие команды CLI будут выполняться с использованием конечной точки, заданной новым контекстом. Активный контекст будет автоматически сохраняться до тех пор, пока вы его не измените. Чтобы переключиться на другой контекст, снова запустите docker context use. Вы можете вернуться к контексту по умолчанию с вашим локальным сокетом Docker, передав default в качестве имени контекста.

Вы всегда можете переопределить выбранный контекст, добавив флаг --context к любой команде Docker:

docker run ubuntu:latest --context remote-host

Переменная среды DOCKER_CONTEXT также работает как альтернатива флагу --context. Любой механизм облегчает временное переключение на другой контекст, не заставляя вас запускать и отменять команду docker context use.

Использование переменной среды DOCKER_HOST также переопределит активный контекст. Эта переменная заставляет Docker использовать конкретную конечную точку демона вместо той, которая предоставляется контекстом.

Вы можете проверить активный контекст, запустив docker context ls. Эта команда выводит список всех контекстов, доступных в вашей конфигурации CLI. Активный контекст выделен звездочкой. Чтобы удалить контекст, запустите docker context rm, указав имя контекста. Невозможно удалить контекст default.

Синхронизация контекстов между машинами

Файлы контекста хранятся в каталоге конфигурации вашего Docker CLI. Обычно это $HOME/.docker в Linux. Вы найдете свои контексты в подкаталоге contexts. Каждый контекст получает свою собственную папку с уникальным хешем. Внутри вы найдете файл meta.json, описывающий контекст. Только созданные контексты имеют файлы, хранящиеся на диске. Контекст default наследует настройки из конфигурации вашего демона Docker.

Если вы хотите синхронизировать конфигурацию контекста, вы можете создать резервную копию папки contexts, чтобы переместить ее на другой компьютер. Вы можете использовать передачу Rsync или репозиторий Git, чтобы упростить регулярные обновления. Симлинкирование папки с сетевым ресурсом также может быть вариантом в зависимости от ваших требований.

Docker также позволяет экспортировать и импортировать контексты через интерфейс командной строки:

docker context export my-context

Это создаст файл my-context.dockercontext в вашем рабочем каталоге. Файл включает содержимое meta.json, а также некоторую дополнительную информацию, например имя контекста. Перенесите этот файл на другой компьютер и запустите docker context import my-context.dockercontext, чтобы загрузить конфигурацию контекста.

Кроме того, вы можете экспортировать автономный файл конфигурации Kubernetes для контекстов Kubernetes:

docker context export kubernetes-context --kubeconfig

Это создаст обычный файл «kubeconfig», совместимый с инструментами экосистемы Kubernetes, такими как kubectl. Возможность получить файл kubeconfig из контекста Docker улучшает совместимость цепочки инструментов. Ничто в файле не будет относиться к Docker CLI.

Если вам нужно изменить контекст, используйте команду docker context update. Это принимает те же флаги, что и docker context create. Если вы делаете массовые обновления, вы можете отредактировать файлы meta.json, чтобы напрямую управлять вашими контекстами. Вы можете проверить файл meta.json контекста из CLI с помощью docker context inspect my-context.

Заключение

Контексты Docker полезны, когда вам нужно развернуть контейнеры в нескольких независимых средах. Вы можете настроить контексты для своего локального сокета Docker, общего промежуточного сервера команды и рабочего сервера Kubernetes.

Docker имеет встроенную поддержку облаков контейнеров Microsoft Azure и Amazon ECS, которые также можно добавлять в качестве контекстов. Количество контекстов, которые вы можете создать, не ограничено, поэтому у вас есть хорошая гибкость при перемещении между вашими хостами.

Возможно, самая большая функциональная проблема с контекстами — это возможность случайного запуска команды в неправильном контексте. Если вы забыли, что находитесь в своем производственном контексте, запуск docker rm database-container может иметь разрушительные последствия. Если вы сомневаетесь, сначала запустите docker context ls, чтобы проверить, что вы выбрали.