在docker的使用过程中,有些时候需要给docker加上代理,可能是需要通过内部网关,也可能是需要给镜像下载加速,那么怎么给docker加代理呢?

方案

Docker守护程序在其启动环境中使用HTTP_PROXY、HTTPS_PROXY和NO_PROXY环境变量来配置HTTP或HTTPS代理行为。您不能使用daemon.json文件配置这些环境变量。

此示例覆盖默认的docker.service文件。

如果使用 root 账户运行 docker

  1. 为docker服务创建systemd目录:

    sudo mkdir -p /etc/systemd/system/docker.service.d

  2. 创建名为/etc/systemd/system/docker.service.d/http-proxy.conf的文件,该文件添加HTTP_PROXY环境变量:

    [Service] Environment=“HTTP_PROXY=http://proxy.example.com:80”

    如果你使用的是 HTTPS 代理服务器,请设置 HTTPS proxy 环境变量:

    [Service] Environment=“HTTPS_PROXY=https://proxy.example.com:443”

    可以设置多个环境变量;同时设置非HTTPS和HTTPS代理;

    [Service] Environment=“HTTP_PROXY=http://proxy.example.com:80” Environment=“HTTPS_PROXY=https://proxy.example.com:443”

  3. 如果您有内部Docker注册中心,您需要在没有代理的情况下联系它们,您可以通过NO_PROXY环境变量指定它们。

    NO_PROXY变量指定一个字符串,该字符串包含应从代理中排除的主机的逗号分隔值。以下是您可以指定以排除主机的选项:

    • IP地址(1.2.3.4)
    • 域名或特殊DNS标签(*)
    • 域名与该名称和所有子域匹配。以“.”为前导的域名。仅匹配子域。例如,给定域foo.example.com和example.com:
      • example.com 可以匹配到 example.comfoo.example.com匹配
      • .example.com 则只能匹配到 foo.example.com
    • 单个星号(*)表示不应执行代理
    • IP地址前缀(1.2.3.4:80)和域名(foo.example.com:80)可以指定端口号

    例子:

    [Service] Environment=“HTTP_PROXY=http://proxy.example.com:80” Environment=“HTTPS_PROXY=https://proxy.example.com:443” Environment=“NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,.corp”

  4. 刷新更改并重新启动Docker

    sudo systemctl daemon-reload sudo systemctl restart docker

  5. 验证配置是否已加载并与您所做的更改相匹配

    sudo systemctl show –property=Environment docker

如果使用普通用户运行 docker

在普通用户模式下运行Docker时,systemd配置文件的位置不同。在普通用户模式下运行时,Docker作为用户模式的systemd服务启动,并使用~/.config/systemd/user/docker.service.d/中每个用户主目录中存储的文件。此外,必须在不使用sudo的情况下使用–user标志执行systemctl。如果您在普通用户模式下运行Docker,请使用一下的方式。

  1. 创建文件的目录

    mkdir -p ~/.config/systemd/user/docker.service.d

  2. 重启命令

    systemctl –user daemon-reload systemctl –user restart docker

  3. 验证命令

    systemctl –user show –property=Environment docker

配置好以后,拉取镜像等操作,就会通过代理服务器了。