Context 本质上是一个命名配置项,存储了 Docker 客户端连接目标 Docker 守护进程所需的所有信息,包括端点地址、安全凭证、TLS 证书等。
你可以根据需求创建多个命名上下文,分别指向不同的 Docker 环境(如本地、远程服务器、Kubernetes 集群、Swarm 集群等),然后通过一条命令在它们之间快速切换。Docker 安装完成后会自动创建一个名为 default 的默认上下文,指向本地的 Docker 守护进程。
在 Docker Context 出现之前,管理多个 Docker 环境(比如本地开发机和远程生产服务器)通常需要手动设置 DOCKER_HOST 等环境变量,操作繁琐且容易出错。每次切换环境都要重新配置连接参数,不仅效率低下,还增加了误操作的风险。
Docker Context 就像一个"遥控器"——将每个环境的连接信息(地址、密钥等)保存为一个独立的"频道"(即 Context),你只需要执行一条命令就能在多个环境间无缝切换。它带来的核心价值包括:
在使用 Docker Context 命令之前,首先需要确保本地安装了 Docker 客户端(CLI)。如果你已经安装了 Docker Desktop 或 Docker Engine,可以跳过此节。
如果不想安装几百兆的 Docker Desktop,以下是几种更轻量的方案。
⚙️ 方案一:只安装 Docker CLI(最轻量,命令行)
这是最纯粹、最轻量的方案——只安装 Docker 的命令行客户端,不包含 Docker 守护进程和图形界面。既然使用 Docker Context 主要是为了连接远程 Docker 环境,那么只需要 docker 命令就够了。
# 解压下载的文件
tar xzvf docker-<版本号>.tgz
# 将解压出的 docker 二进制文件移动到系统的 PATH 路径下 (如 /usr/local/bin)
sudo cp docker/docker /usr/local/bin/
🖥️ 方案二:轻量级 Docker Desktop 替代品(有界面)
如果你还是想要一个图形界面来辅助管理,有一些比 Docker Desktop 更轻量的替代品:
Docker Context 提供了一套完整的命令体系。
| 命令 | 说明 |
|---|---|
| docker context create | 创建一个新的上下文 |
| docker context ls | 列出所有可用的上下文 |
| docker context use | 切换到指定的上下文 |
| docker context show | 显示当前使用的上下文名称 |
| docker context inspect | 查看一个或多个上下文的详细信息 |
| docker context update | 更新已有上下文的配置 |
| docker context rm | 删除一个或多个上下文 |
| docker context export | 将上下文导出为 tar 归档文件 |
| docker context import | 从 tar 或 zip 文件导入上下文 |
docker context ls
NAME DESCRIPTION DOCKER ENDPOINT ERROR
default * unix:///var/run/docker.sock
ssh-docker,通过 SSH 连接远程 Docker 守护进程。docker context create ssh-docker --description "虚拟机远程Docker-SSH" --docker "host=ssh://user@192.168.1.7"
tcp-docker,通过 TCP 连接远程 Docker 守护进程(不带 TLS 认证)。docker context create tcp-docker --description "虚拟机远程Docker-TCP" --docker "host=tcp://192.168.1.7:2375"
tcp-docker-tls,过 TCP 连接远程 Docker 守护进程(TLS 认证)。docker context create tcp-docker-tls --description "虚拟机远程Docker-TCP-TLS" --docker "host=tcp://192.168.1.7:2376,ca=C:/Users/Administrator/.docker/certs/ca.pem,cert=C:/Users/Administrator/.docker/certs/cert.pem,key=C:/Users/Administrator/.docker/certs/key.pem"
基于现有的 production 上下文(Context)的配置,复制并创建一个新的名为 staging 的上下文。
docker context create staging --from=production
这样做最大的好处是 省去重复输入的麻烦。假设你的生产环境配置非常复杂,包含了长长的 TLS 证书路径信息,只是 IP 地址不同,那么你就可以先基于现有的上下文创建一个新的,然后修改IP。
docker-test上下文docker context use docker-test
切换后,后续所有 docker 命令都将自动作用于目标环境。
docker context show
docker-test
docker context inspect default
[
{
"Name": "default",
"Metadata": {},
"Endpoints": {
"docker": {
"Host": "unix:///var/run/docker.sock",
"SkipTLSVerify": false
}
},
"TLSMaterial": {},
"Storage": {
"MetadataPath": "\u003cIN MEMORY\u003e",
"TLSPath": "\u003cIN MEMORY\u003e"
}
}
]
docker-test上下文docker context rm docker-test
docker-test上下文描述信息docker context update docker-test --description "Test context"
docker context import <name> <file>docker-test.dockercontext备份文件中导入上下文docker-testdocker context import docker-test docker-test.dockercontext
docker context export <name> <file>docker-test导出为备份文件docker-test.dockercontextdocker context export docker-test
Written file "docker-test.dockercontext"
Docker Context 支持连接多种类型的端点,以下是具体的端点类型及其适用场景:
| 端点类型 | 说明 | 示例 |
|---|---|---|
| 本地 Unix 套接字 (Local Unix Socket) | 默认上下文使用的连接方式,用于与本地 Docker 守护进程通信,安全级别:高 | unix:///var/run/docker.sock |
| SSH 远程连接 (Remote over SSH) | 最常用的远程连接方式。通过 SSH 隧道与远程 Docker 守护进程通信,安全且配置简单,安全级别:中高 | ssh://user@remote-host |
| TCP 明文远程连接 (Plaintext Remote over TCP) | 直接通过无加密的TCP端口与Docker守护进程通信,无身份校验机制,仅可在完全隔离的可信内网临时使用,绝对禁止暴露到公网,安全级别:低 | tcp://remote-host:2375 |
| TCP SSL 远程连接 (Remote over TCP) | 直接通过 TCP 端口与暴露的 Docker 守护进程通信。生产环境必须配合 TLS 加密,否则存在严重安全风险,安全级别:高 | tcp://remote-host:2376 |
| Kubernetes 集群 (Kubernetes Cluster) | Context 可以包含 Kubernetes 集群的连接信息。允许使用 docker 命令(或 kubectl)管理 K8s 集群,安全级别:高 | 在 docker context create 时通过 --kubernetes 参数指定 |
| Docker Swarm 集群 (Docker Swarm Cluster) | Context 支持连接 Docker Swarm 集群。可以管理和操作 Swarm 集群中的服务与节点,安全级别:高 | 通过 --default-stack-orchestrator=swarm 参数指定 |
建议为上下文采用统一的命名规范,例如:
| 环境 | 推荐命名 |
|---|---|
| 本地开发环境 | dev-local |
| 远程开发环境 | dev-remote |
| 预发布环境 | staging |
| 生产环境 | production |
docker ps --context ssh-docker
Docker 客户端确定目标环境的优先级顺序为:
问题一: docker context 命令不存在。
原因:Docker 客户端版本过低(低于 19.03)。
解决方案:升级 Docker 客户端至 19.03 或更高版本。
问题二: 切换 Context 后连接超时。
原因:远程 Docker 守护进程未启动、网络不通或防火墙拦截。
解决方案:确认远程 Docker 服务状态,检查网络连通性和防火墙规则。
问题三: SSH 连接失败。
原因:SSH 密钥未配置、用户名/密码错误或者SSH端口未开放。
解决方案:确保 SSH 密钥已正确配置,或使用 ssh://user@host:port 格式指定端口。
问题四: TLS 证书验证失败。
原因:证书路径错误或证书已过期。
解决方案:检查证书文件路径是否正确,确认证书是否在有效期内。
Docker Context 是一个看似简单却极为实用的功能。它通过标准化的连接配置管理,让开发者能够轻松地在本地、远程、Kubernetes、Swarm 等多种 Docker 环境之间无缝切换。无论是个人开发还是团队协作,合理使用 Docker Context 都能显著提升工作效率,降低因环境混淆导致的操作风险。