使用 `docker context` 切换 AWS、阿里云、本地环境
解读
在国内云原生面试中,“一次构建、随处运行” 的落地场景往往横跨本地开发机、阿里云 ACK/ACR、AWS EKS/ECR 三套异构环境。面试官想确认你是否能用 Docker 官方 CLI 原生机制(而非反复 export 环境变量或写多套 shell 别名)在 10 秒内完成上下文切换,并保证TLS 双向认证、镜像仓库域名、VPC 私网解析等细节全部正确。答不出“context 本质是把一组 docker endpoints 与 tls 材料 序列化到 ~/.docker/contexts/” 会被直接判定为只会敲命令不懂原理。
知识点
- context 存储结构:~/.docker/contexts/meta/{hash}/meta.json 记录 "Endpoints": {"docker": {"Host":"tcp://...", "SkipTLSVerify": false, "CACert":"...", "Cert":"...", "Key":"..."}}
- 国内云厂商的 “专有网络接入” 与 “公网接入” 需要两套 context;阿里云的 “内网域名”(registry-vpc.cn-hangzhou.aliyuncs.com)与 “公网域名”(registry.cn-hangzhou.aliyuncs.com)必须分开配置,否则 push 时走公网产生额外流量费。
- AWS 中国(宁夏、北京)区域与海外区域 IAM 凭证隔离;context 里只能放 tls 文件路径,不能放明文 AK/SK,AK/SK 要走
~/.aws/credentials让 docker-credential-ecr-login 动态换取 token。 - 切换命令
docker context use <name>本质是改写 ~/.docker/current-context 软链;CI 场景下可用DOCKER_CONTEXT环境变量一次性指定,避免修改宿主机文件。 - 验证手段:
docker info | grep 'Name:'立即确认当前 API 端点;docker context inspect --format '{{.Endpoints.docker.Host}}'可脚本化断言。
答案
-
本地环境
docker context create local --docker host=unix:///var/run/docker.sock docker context use local -
阿里云(杭州 VPC 内网)
# 提前把 ACR 提供的 ca.crt、client.crt、client.key 放到 ~/alibabacloud/ docker context create aliyun-hz-vpc \ --docker host=tcp://cri-hz-vpc.aliyuncs.com:6443 \ --docker ca=~/alibabacloud/ca.crt \ --docker cert=~/alibabacloud/client.crt \ --docker key=~/alibabacloud/client.key docker context use aliyun-hz-vpc # 验证 docker pull registry-vpc.cn-hangzhou.aliyuncs.com/abc/app:1.0 -
AWS 中国(宁夏区域,ECR 私网端点)
# 安装 docker-credential-ecr-login # 在 ~/.docker/config.json 里配置 "credsStore": "ecr-login" docker context create aws-cn-nx \ --docker host=tcp://api.ecr.cn-northwest-1.amazonaws.com.cn:443 \ --docker ca=~/aws-cn/nx-ca.pem \ --docker cert=~/aws-cn/nx-cert.pem \ --docker key=~/aws-cn/nx-key.pem export AWS_PROFILE=nx-admin docker context use aws-cn-nx # 验证 docker pull 123456789012.dkr.ecr.cn-northwest-1.amazonaws.com.cn/app:1.0 -
一键切换脚本(面试现场手写)
#!/usr/bin/env bash case "$1" in local|aliyun|aws) docker context use "$1" && docker info | grep 'Name:' ;; *) echo "Usage: $0 {local|aliyun|aws}" exit 1 esac
拓展思考
- 多集群灰度:在 GitLab CI 里用
DOCKER_CONTEXT=aliyun-staging与DOCKER_CONTEXT=aliyun-prod两个 context,实现 staging 自动部署、prod 需手动批准,避免 kubectl 多集群配置泄露。 - 零信任加固:把 TLS 材料放进 HashiCorp Vault,通过
docker context create时指定 vault:// 路径,配合短周期自动轮换证书,满足金融客户 “密钥不落盘” 合规要求。 - 混合云网络打通:在阿里云高速通道与 AWS Transit Gateway 建立 BGP 路由后,可将 context 的 host 改为 私网 IP,使镜像流量完全走内网,节省 90% 公网流量成本;此时需在 context 里额外配置 "httpProxy": "" 防止 CLI 误走公司代理。