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