使用 `docker context` 切换 AWS、阿里云、本地环境

解读

在国内云原生面试中,“一次构建、随处运行” 的落地场景往往横跨本地开发机、阿里云 ACK/ACR、AWS EKS/ECR 三套异构环境。面试官想确认你是否能用 Docker 官方 CLI 原生机制(而非反复 export 环境变量或写多套 shell 别名)在 10 秒内完成上下文切换,并保证TLS 双向认证、镜像仓库域名、VPC 私网解析等细节全部正确。答不出“context 本质是把一组 docker endpointstls 材料 序列化到 ~/.docker/contexts/” 会被直接判定为只会敲命令不懂原理。

知识点

  1. context 存储结构:~/.docker/contexts/meta/{hash}/meta.json 记录 "Endpoints": {"docker": {"Host":"tcp://...", "SkipTLSVerify": false, "CACert":"...", "Cert":"...", "Key":"..."}}
  2. 国内云厂商的 “专有网络接入”“公网接入” 需要两套 context;阿里云的 “内网域名”(registry-vpc.cn-hangzhou.aliyuncs.com)与 “公网域名”(registry.cn-hangzhou.aliyuncs.com)必须分开配置,否则 push 时走公网产生额外流量费。
  3. AWS 中国(宁夏、北京)区域与海外区域 IAM 凭证隔离;context 里只能放 tls 文件路径,不能放明文 AK/SK,AK/SK 要走 ~/.aws/credentials 让 docker-credential-ecr-login 动态换取 token。
  4. 切换命令 docker context use <name> 本质是改写 ~/.docker/current-context 软链;CI 场景下可用 DOCKER_CONTEXT 环境变量一次性指定,避免修改宿主机文件。
  5. 验证手段:docker info | grep 'Name:' 立即确认当前 API 端点;docker context inspect --format '{{.Endpoints.docker.Host}}' 可脚本化断言。

答案

  1. 本地环境

    docker context create local --docker host=unix:///var/run/docker.sock
    docker context use local
    
  2. 阿里云(杭州 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
    
  3. 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
    
  4. 一键切换脚本(面试现场手写)

    #!/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
    

拓展思考

  1. 多集群灰度:在 GitLab CI 里用 DOCKER_CONTEXT=aliyun-stagingDOCKER_CONTEXT=aliyun-prod 两个 context,实现 staging 自动部署、prod 需手动批准,避免 kubectl 多集群配置泄露。
  2. 零信任加固:把 TLS 材料放进 HashiCorp Vault,通过 docker context create 时指定 vault:// 路径,配合短周期自动轮换证书,满足金融客户 “密钥不落盘” 合规要求。
  3. 混合云网络打通:在阿里云高速通道与 AWS Transit Gateway 建立 BGP 路由后,可将 context 的 host 改为 私网 IP,使镜像流量完全走内网,节省 90% 公网流量成本;此时需在 context 里额外配置 "httpProxy": "" 防止 CLI 误走公司代理。