Контекст Docker

Введение

В этом руководстве показано, как контексты позволяют одному интерфейсу командной строки Docker легко управлять несколькими кластерами Swarm, несколькими кластерами Kubernetes и несколькими отдельными узлами Docker.

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

Например, один клиент Docker на ноутбуке вашей компании может быть настроен с двумя контекстами; dev-k8s и prod-swarm. dev-k8s содержит данные конечной точки и учетные данные безопасности для настройки и управления кластером Kubernetes в среде разработки. prod-swarm содержит все необходимое для управления кластером Swarm в рабочей среде. После настройки данных контекстов вы можете использовать docker context use <context-name> верхнего уровня, чтобы легко переключаться между ними.

Сведения об использовании Docker Context для развертывания приложений в облаке см. в статьях Развертывание контейнеров Docker в Azure и Развертывание контейнеров Docker на ECS.

Предпосылки

Чтобы следовать примерам в этом руководстве, вам потребуется:

  • Клиент Docker, поддерживающий команду верхнего уровня context

Выполните docker context, чтобы убедиться, что ваш клиент Docker поддерживает контексты.

Вам также понадобится одно из следующего:

  • Кластер Docker Swarm

  • Узел Docker с одним движком

  • Кластер Kubernetes

Анатомия контекста

Контекст представляет собой комбинацию нескольких свойств. К ним относятся:

  • Имя

  • Конфигурация конечной точки

  • Информация о ТЛС

  • Оркестратор

Самый простой способ увидеть, как выглядит контекст, — просмотреть контекст по умолчанию.

$ docker context ls
NAME          DESCRIPTION     DOCKER ENDPOINT                KUBERNETES ENDPOINT      ORCHESTRATOR
default *     Current...      unix:///var/run/docker.sock                             swarm

Это показывает один контекст, называемый «по умолчанию». Он настроен для связи с кластером Swarm через локальный сокет /var/run/docker.sock Unix. Для него не настроена конечная точка Kubernetes.

Звездочка в столбце NAME указывает, что это активный контекст. Это означает, что все команды docker будут выполняться в контексте «по умолчанию», если только они не будут переопределены переменными среды, такими как DOCKER_HOST и DOCKER_CONTEXT, или в командной строке с флагами --context и --host.

Копните немного глубже с docker context inspect. В этом примере мы проверяем контекст с именем default.

$ docker context inspect default
[
    {
        "Name": "default",
        "Metadata": {
            "StackOrchestrator": "swarm"
        },
        "Endpoints": {
            "docker": {
                "Host": "unix:///var/run/docker.sock",
                "SkipTLSVerify": false
            }
        },
        "TLSMaterial": {},
        "Storage": {
            "MetadataPath": "\u003cIN MEMORY\u003e",
            "TLSPath": "\u003cIN MEMORY\u003e"
        }
    }
]

Данный контекст использует «swarm» в качестве оркестратора (metadata.stackOrchestrator). Он настроен для связи с конечной точкой, представленной в локальном сокете Unix по адресу /var/run/docker.sock (Endpoints.docker.Host), и требует проверки TLS (Endpoints.docker.SkipTLSVerify).

Создаёт новый контекст

Вы можете создавать новые контексты с помощью команды docker context create.

В следующем примере создаётся новый контекст с именем «docker-test» и указывается следующее:

  • Оркестратор по умолчанию = Swarm

  • Входит команды в локальный сокет Unix /var/run/docker.sock

$ docker context create docker-test \
  --default-stack-orchestrator=swarm \
  --docker host=unix:///var/run/docker.sock

Successfully created context "docker-test"

Новый контекст хранится в файле meta.json далее ~/.docker/contexts/. Каждый новый контекст, который вы создаёте, получает свой собственный meta.json, хранящийся в выделенном подкаталоге ~/.docker/contexts/.

Примечание

Контекст по умолчанию ведёт себя иначе, чем контексты, созданные вручную. У него нет файла конфигурации meta.json, и он динамически обновляется на основе текущей конфигурации. Например, если вы переключите текущую конфигурацию Kubernetes с помощью kubectl config use-context, контекст Docker по умолчанию будет динамически обновляться до новой конечной точки Kubernetes.

Вы можете просмотреть новый контекст с docker context ls и docker context inspect <context-name>.

Следующее можно использовать для создания конфигурации с Kubernetes в качестве оркестратора по умолчанию, используя существующую конфигурацию kube, хранящуюся в /home/ubuntu/.kube/config. Чтобы это работало, вам понадобится действительный файл kubeconfig в /home/ubuntu/.kube/config. Если ваш kubeconfig имеет более одного контекста, будет использоваться текущий контекст (kubectl config current-context).

$ docker context create k8s-test \
  --default-stack-orchestrator=kubernetes \
  --kubernetes config-file=/home/ubuntu/.kube/config \
  --docker host=unix:///var/run/docker.sock

Successfully created context "k8s-test"

Вы можете просмотреть все контексты в системе с docker context ls.

$ docker context ls
NAME           DESCRIPTION   DOCKER ENDPOINT               KUBERNETES ENDPOINT               ORCHESTRATOR
default *      Current       unix:///var/run/docker.sock   https://35.226.99.100 (default)   swarm
k8s-test                     unix:///var/run/docker.sock   https://35.226.99.100 (default)   kubernetes
docker-test                  unix:///var/run/docker.sock                                     swarm

Текущий контекст отмечен звездочкой (»*»).

Используйте другой контекст

Вы можете использовать docker context use для быстрого переключения между контекстами.

Следующая команда переключит интерфейс командной строки docker на использование контекста «k8s-test».

$ docker context use k8s-test

k8s-test
Current context is now "k8s-test"

Проверяет операцию, перечислив все контексты и убедившись, что звездочка (»*») соответствует контексту «k8s-test».

$ docker context ls
NAME            DESCRIPTION                               DOCKER ENDPOINT               KUBERNETES ENDPOINT               ORCHESTRATOR
default         Current DOCKER_HOST based configuration   unix:///var/run/docker.sock   https://35.226.99.100 (default)   swarm
docker-test                                               unix:///var/run/docker.sock                                     swarm
k8s-test *                                                unix:///var/run/docker.sock   https://35.226.99.100 (default)   kubernetes

Команды docker теперь будут нацелены на конечные точки, определённые в контексте «k8s-test».

Вы также можете установить текущий контекст, используя переменную среды DOCKER_CONTEXT. Это переопределяет контекст, установленный с помощью docker context use.

Используйте соответствующую команду далее, чтобы установить контекст на docker-test с помощью переменной среды.

Windows PowerShell:

> $Env:DOCKER_CONTEXT=docker-test

Линукс:

$ export DOCKER_CONTEXT=docker-test

Выполните docker context ls, чтобы убедиться, что контекст «docker-test» теперь является активным контекстом.

Вы также можете использовать глобальный флаг --context, чтобы переопределить контекст, указанный в переменной среды DOCKER_CONTEXT. Например, следующее отправит команду в контекст под названием «производство».

$ docker --context production container ls

Экспорт и импорт контекстов Docker

Команда docker context позволяет легко экспортировать и импортирует контексты на разных компьютерах с установленным клиентом Docker.

Вы можете использовать команду docker context export, чтобы экспортировать существующий контекст в файл. Позже данный файл можно будет импортирует на другой компьютер, на котором установлен клиент docker.

По умолчанию контексты будут экспортированы как собственные контексты Docker. Вы можете экспортировать и импортирует их с помощью команды docker context. Если экспортируемый контекст включает конечную точку Kubernetes, часть контекста Kubernetes будет включена в операции export и import.

Существует также возможность экспортировать только часть контекста Kubernetes. Это создаст собственный файл kubeconfig, который можно вручную объединить с существующим файлом ~/.kube/config на другом хосте, на котором установлен kubectl. Вы не можете экспортировать только часть контекста Kubernetes, а затем импортирует её с docker context import. Единственный способ импортирует экспортированную конфигурацию Kubernetes — вручную объединить её с существующим файлом kubeconfig.

Давайте рассмотрим экспорт и импорт собственного контекста Docker.

Экспорт и импорт собственного контекста Docker

В следующем примере экспортируется существующий контекст с именем «docker-test». Он будет записан в файл с именем docker-test.dockercontext.

$ docker context export docker-test
Written file "docker-test.dockercontext"

Проверяет содержимое файла экспорта.

$ cat docker-test.dockercontext
meta.json0000644000000000000000000000022300000000000011023 0ustar0000000000000000{"Name":"docker-test","Metadata":{"StackOrchestrator":"swarm"},"Endpoints":{"docker":{"Host":"unix:///var/run/docker.sock","SkipTLSVerify":false}}}tls0000700000000000000000000000000000000000000007716 5ustar0000000000000000

Данный файл можно импортирует на другой хост, используя docker context import. На целевом хосте должен быть установлен клиент Docker.

$ docker context import docker-test docker-test.dockercontext
docker-test
Successfully imported context "docker-test"

Вы можете убедиться, что контекст был импортирован с docker context ls.

Формат команды импорта — docker context import <context-name> <context-file>.

Теперь давайте посмотрим на экспорт только частей контекста Kubernetes.

Экспорт контекста Kubernetes

Вы можете экспортировать контекст Kubernetes, только если для экспортируемого контекста настроена конечная точка Kubernetes. Вы не можете импортирует контекст Kubernetes, используя docker context import.

Данные шаги будут использовать флаг --kubeconfig для экспорта только элементов Kubernetes существующего контекста k8s-test в файл с именем «k8s-test.kubeconfig». Затем команда cat покажет, что она экспортирована как допустимый файл kubeconfig.

$ docker context export k8s-test --kubeconfig
Written file "k8s-test.kubeconfig"

Убедиться, что экспортированный файл содержит допустимую конфигурацию kubectl.

$ cat k8s-test.kubeconfig
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data:
    <Snip>
    server: https://35.226.99.100
  name: cluster
contexts:
- context:
    cluster: cluster
    namespace: default
    user: authInfo
  name: context
current-context: context
kind: Config
preferences: {}
users:
- name: authInfo
  user:
    auth-provider:
      config:
        cmd-args: config config-helper --format=json
        cmd-path: /snap/google-cloud-sdk/77/bin/gcloud
        expiry-key: '{.credential.token_expiry}'
        token-key: '{.credential.access_token}'
      name: gcp

Вы можете объединить его с существующим файлом ~/.kube/config на другом компьютере.

Обновление контекста

Вы можете использовать docker context update для обновления полей в существующем контексте.

В следующем примере обновляется поле «Описание» в существующем контексте k8s-test.

$ docker context update k8s-test --description "Test Kubernetes cluster"
k8s-test
Successfully updated context "k8s-test"