Docker上下文

预计阅读时间:8分钟

介绍

本指南显示了上下文如何使单个Docker CLI轻松管理多个Swarm集群,多个Kubernetes集群以及多个单个Docker节点。

单个Docker CLI可以具有多个上下文。每个上下文都包含管理不同群集或节点所需的所有端点和安全信息。该docker context命令使配置这些上下文以及在它们之间切换变得容易。

例如,公司笔记本电脑上的单个Docker客户端可能配置了两个上下文。dev-k8sprod-swarmdev-k8s包含用于在开发环境中配置和管理Kubernetes集群的端点数据和安全凭证。prod-swarm包含在生产环境中管理Swarm集群所需的一切。一旦配置了这些上下文,就可以使用顶级docker context use <context-name>在它们之间轻松切换。

有关使用泊坞窗语境来部署应用程序到云的信息,请参阅在Azure上部署Docker容器对ECS部署Docker容器

先决条件

要遵循本指南中的示例,您需要:

  • 支持顶层context命令的Docker客户端

运行docker context以确认您的Docker客户端支持上下文。

您还将需要以下之一:

  • Docker Swarm集群
  • 单引擎Docker节点
  • Kubernetes集群

上下文剖析

上下文是多个属性的组合。这些包括:

  • 名称
  • 端点配置
  • TLS信息
  • 编曲家

查看上下文外观的最简单方法是查看默认上下文。

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

这显示了一个称为“默认”的上下文。它被配置为通过本地/var/run/docker.sockUnix套接字与Swarm集群通信。它没有配置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)。它被配置为与/var/run/docker.sockEndpoints.docker.Host)上暴露在本地Unix套接字上的终结点进行对话,并且需要TLS验证(Endpoints.docker.SkipTLSVerify)。

创建一个新的上下文

您可以使用docker context create命令创建新的上下文。

以下示例创建一个名为“ docker-test”的新上下文,并指定以下内容:

  • 默认协调器=群
  • 向本地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>

以下内容可用于使用存储在中的现有kubeconfig将Kubernetes作为默认协调器来创建配置/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在上下文之间快速切换。

以下命令将切换dockerCLI以使用“ 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

Linux:

$ 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部分将包含在exportimport操作中。

还有一个选项可以仅导出上下文的Kubernetes部分。这将生成一个本地kubeconfig文件,可以将其与~/.kube/configkubectl安装的另一台主机上的现有文件手动合并。您不能仅导出上下文的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"
引擎上下文clikubernetes