bigywater.tech
Docker · 82

docker context:CLI 是怎么找到守护进程的

同时管几个 Docker 环境时,docker context 怎么用?它存在哪里、和 DOCKER_HOST、-H 谁的优先级高?这篇全程不执行 docker context use,用 --context 和环境变量临时切换,并验证没有改动用户的 CLI 配置。

--context 胜过 DOCKER_HOST
DOCKER_HOST 设成无效 socket 时,加 --context bwlab-c77 仍然成功
conflicting options
同时给 --context 和 -H 的错误
哈希不变
实验前后 ~/.docker/config.json 的 SHA-256 一致

上下文是什么

实测 · 本机执行输出
  default 当前=false 端点=unix:///var/run/docker.sock
  desktop-linux 当前=true 端点=unix://~/.docker/run/docker.sock
  ~/.docker/config.json 里的 currentContext = desktop-linux
  上下文存放在 ~/.docker/contexts/meta/<sha256(名字)>/meta.json:sha256("desktop-linux") 的目录存在吗?True
  meta.json 的键:['Endpoints', 'Metadata', 'Name'];Endpoints.docker.Host = unix://~/.docker/run/docker.sock

一个上下文就是「名字 + 端点」(以及可选的 TLS 设置),存成 ~/.docker/contexts 下的一个 meta.json;当前用哪个由 ~/.docker/config.json 的 currentContext 决定。Docker Desktop 自带 default 和 desktop-linux。

临时使用

实测 · 本机执行输出
  docker context create bwlab-c77 --docker host=unix://~/.docker/run/docker.sock:退出码 0;bwlab-c77
Successfully created context "bwlab-c77"
  新增了目录 ~/.docker/contexts/meta/02b2a8cfa5c3…/:True;meta.json:{"Name": "bwlab-c77", "Metadata": {"Description": "c77 实验"}, "Endpoints": {"docker": {"Host": "unix://~/.docker/run/docker.sock", "SkipTLSVerify": false}}}
  docker --context bwlab-c77 version:退出码 0;服务端版本 29.8.2
  DOCKER_CONTEXT=bwlab-c77 docker version:退出码 0;服务端版本 29.8.2
  docker context ls 里的“当前”标记:bwlab-c77=false default=false desktop-linux=true

docker --context 名字 … 或环境变量 DOCKER_CONTEXT 只影响这一条命令;docker context use 才会改 config.json。我这里没有执行 use,以免改动当前环境。

优先级

实测 · 本机执行输出
  DOCKER_HOST 指向不存在的 socket:退出码 1;failed to connect to the docker API at unix:///nonexistent.sock; check if the path is correct and if the daemo
  DOCKER_HOST 无效,同时 --context bwlab-c77:退出码 0;29.8.2
  DOCKER_HOST 无效,同时 DOCKER_CONTEXT=bwlab-c77:退出码 1;failed to connect to the docker API at unix:///nonexistent.sock; check if the path is correct and if the daemo
  -H 指向正确 socket,同时 DOCKER_HOST 无效:退出码 0;29.8.2
  同时给 --context 和 -H:退出码 1;conflicting options: cannot specify both --host and --context

实测:-H 与 --context 胜过 DOCKER_HOST,DOCKER_HOST 又胜过 DOCKER_CONTEXT;--context 与 -H 不能同时用。所以环境里残留的 DOCKER_HOST 会悄悄压过你设的 DOCKER_CONTEXT。

ssh 上下文

实测 · 本机执行输出
  docker context create … host=ssh://deploy@example.invalid:2222:退出码 0
  Endpoints.docker = {"Host":"ssh://deploy@example.invalid:2222","SkipTLSVerify":false}
  使用这个 ssh 上下文:退出码 1;error during connect: Get "http://docker.example.com/v1.56/version": command [ssh -l deploy -p 2222 -o ConnectTimeout=30 -T -- exa

host=ssh://用户@主机 的上下文让本机 CLI 通过 ssh 连接远端的 docker(报错里能看到它调用了 ssh 命令,具体在远端执行什么,我没有看全)。我只创建了一个指向不存在主机的上下文验证了错误信息,没有连接真实的远端。

清理

实测 · 本机执行输出
  删除后 docker context ls:default desktop-linux
  ~/.docker/config.json 的哈希前后相同吗?True;currentContext 仍是 desktop-linux
  ~/.docker/contexts/meta 下的目录数:1

context rm 删除,config.json 不变。

分步演示

docker context
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / Docker Desktop(Engine 29.8.2,容器跑在 Docker Desktop 自带的 Linux 虚拟机里,内核与宿主机的 macOS 不同);镜像为 linux/arm64;需要看虚拟机内部时用特权容器 + nsenter;计时用 time / date +%s%N,数字每次运行会有小幅抖动。docker CLI 与 Docker Desktop;创建的上下文 bwlab-c77、bwlab-c77-ssh 已删除;从未执行 docker context use;实验前后比较了 ~/.docker/config.json 的 SHA-256;ssh 上下文指向保留域名 example.invalid,没有连接任何真实主机
    • 没有验证:带 TLS 的 tcp 上下文、docker context export / import、Kubernetes 上下文、DOCKER_CONFIG 指向别的配置目录、docker buildx 的构建器与上下文的关系
    京ICP备2026067502号-1京公网安备11010502063487号