Docker上下文
预计阅读时间:8分钟
介绍
本指南显示了上下文如何使单个Docker CLI轻松管理多个Swarm集群,多个Kubernetes集群以及多个单个Docker节点。
单个Docker CLI可以具有多个上下文。每个上下文都包含管理不同群集或节点所需的所有端点和安全信息。该docker context
命令使配置这些上下文以及在它们之间切换变得容易。
例如,公司笔记本电脑上的单个Docker客户端可能配置了两个上下文。dev-k8s和prod-swarm。dev-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.sock
Unix套接字与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.sock
(Endpoints.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
在上下文之间快速切换。
以下命令将切换docker
CLI以使用“ 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部分将包含在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"