• 亮色
  • 深色
  • 自动
  • RSS 订阅

    Docker Engine 代理设置

    2024-01-08

    加速访问 Docker 注册表

    使用镜像的方式加速 Docker Hub 访问速度

    如果只是需要更流畅的访问 Docker Hub,可以使用 镜像 的方式。

    下面展示使用上海交通大学 Docker Hub 镜像的例子。

    编辑或新建 /etc/docker/daemon.json 文件,向其中添加 registry-mirrors 项,填入一个列表:

    {
      "registry-mirrors": ["https://docker.mirrors.sjtug.sjtu.edu.cn"]
    }
    

    使用代理的方式加速所有 Docker 注册表

    如果需要访问其他的 Docker 注册表地址,例如我当前正在使用的 devcontainer 会使用到微软的 Docker 注册表,那即使修改了 Docker Hub 镜像地址也没有用。为了能够快速访问,需要给 Docker 守护进程设置代理。

    对于 Docker Engine 23.0 版本以上

    对于 Docker Engine 23.0 版本以上的,可以在 /etc/docker/daemon.json(如果没有的话可以手动创建) 中配置。

    填入下述内容:

    {
      "proxies": {
        "http-proxy": "http://proxy.example.com:3128",
        "https-proxy": "https://proxy.example.com:3129",
        "no-proxy": "*.test.example.com,.example.org,127.0.0.0/8"
      }
    }
    

    对于常规安装方式

    1. docker 服务创建一个放置 systemd 的目录:

      sudo mkdir -p /etc/systemd/system/docker.service.d
      
    2. 创建 /etc/systemd/system/docker.service.d/http-proxy.conf 文件添加 HTTP 代理:

      [Service]
      Environment="HTTP_PROXY=http://proxy.example.com:3128"
      Environment="HTTPS_PROXY=https://proxy.example.com:3129"
      
    3. 如果有需要在不使用代理的情况下访问 Docker 注册表,可以使用 NO_PROXY 环境变量。我个人是不需要添加此项,如果有需要的话建议还是看看文末的官方文档吧,因为一些特殊字符需要转义才能使用。

    4. 刷新更改并重启 Docker:

      sudo systemctl daemon-reload
      sudo systemctl restart docker
      
    5. 验证修改成功应用:

      sudo systemctl show --property=Environmehttps://docs.docker.com/network/proxy/#configure-the-docker-clientnt docker
      

      返回类似下述内容表示修改成功:

      Environment=HTTP_PROXY=http://proxy.example.com:3128 HTTPS_PROXY=https://proxy.example.com:3129 NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,.corp
      

    对于非 root 用户安装方式

    类似常规安装,但是第一步的目录路径修改为 ~/.config/systemd/user/docker.service.d;第四步无需指定 sudo;第五步的命令则是:

    systemctl --user show --property=Environment docker
    

    代理容器内网络请求

    Tip

    如果要使用本机代理,可能需要先在本机代理的客户端上允许局域网链接 然后代理的 HOST 地址为 docker network inspect bridgeGateway 的 IP

    1. 创建并编辑 ~/.docker/config.json 文件,填入下述内容:

      {
        "proxies": {
          "default": {
            "httpProxy": "http://proxy.example.com:3128",
            "httpsProxy": "https://proxy.example.com:3129",
            "noProxy": "*.test.example.com,.example.org,127.0.0.0/8"
          }
        }
      }
      

      保存文件后会立刻生效,不需要重启 Docker。但是,这个配置不会作用于已有的容器,只会作用于新容器和构建。

      如果要代理 ftp 请求,需要指定 ftpProxy 项;此外,还可以使用 allProxy 代理所有请求。

    2. 验证配置:

      2.1. 方式一:

      docker run --rm alpine sh -c 'env | grep -i  _PROXY'
      

      返回如下:

      https_proxy=http://proxy.example.com:3129
      HTTPS_PROXY=http://proxy.example.com:3129
      http_proxy=http://proxy.example.com:3128
      HTTP_PROXY=http://proxy.example.com:3128
      no_proxy=*.test.example.com,.example.org,127.0.0.0/8
      NO_PROXY=*.test.example.com,.example.org,127.0.0.0/8
      

      2.2. 方式二(如果在国内使用境外代理):

      docker run -it --rm curlimages/curl google.com
      

    为 Docker CLI 设置代理

    可以在调用 docker builddocker run 时在命令行上设置代理。

    例如在使用 docker build 时,添加 --build-arg 参数:

    docker build --build-arg HTTP_PROXY="http://proxy.example.com:3128" .
    

    在使用 docker run 时,指定 --env 参数:

    docker run --env HTTP_PROXY="http://proxy.example.com:3128" redis
    

    参考