docker使用代理的那些事儿

鉴于国内网络环境,要想愉快的玩耍docker,不用代理几乎是不可能的,即使官方的docker hub有国内源可用,但第三方的hub比如quay.io在国内是无法直连的,网上的解决方案大多都是使用代理下载打包到本地再导入,非常麻烦。

docker使用代理很多地方都只有讲到docker pull时的代理

docker search\pull代理

假如你已经通过某种方式获得了一个可畅通无阻的http/https代理:192.168.1.10:8000
参照官方文档docker设置代理:

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

    1
    sudo mkdir -p /etc/systemd/system/docker.service.d
  2. 创建一个http-proxy.conf文件:

    1
    /etc/systemd/system/docker.service.d/http-proxy.conf

按以下格式添加 HTTP_PROXY 环境变量:

1
2
[Service]
Environment="HTTP_PROXY=http://192.168.1.10:8000/"

如果要设置 HTTPS 代理, 创建一个https-proxy.conf文件:

1
/etc/systemd/system/docker.service.d/https-proxy.conf

按以下格式添加 HTTPS_PROXY环境变量:

1
2
[Service]
Environment="HTTPS_PROXY=https://192.168.1.10:8000"

当然, 也可以设置NO_PROXY环境变量来指定域名或IP不使用代理。

http-proxy.conf配置样例:

1
2
[Service]    
Environment="HTTP_PROXY=http://192.168.1.10:8000/" "NO_PROXY=localhost,,docker-registry.example.com,.corp"

https-proxy.conf配置样例:

1
2
[Service]    
Environment="HTTPS_PROXY=https://192.168.1.10:8000/" "NO_PROXY=localhost,,docker-registry.example.com,.corp"

关于NO_PROXY的更多详细配置可查看文档

  1. 完成以上配置之后, 重新加载systemd的配置:

    1
    sudo systemctl daemon-reload
  2. 重启docker:

    1
    sudo systemctl restart docker
  3. 验证配置是否已经被加载:

验证http proxy:

1
2
$ systemctl show --property=Environment docker
Environment=HTTP_PROXY=http://192.168.1.10:8000/

验证https proxy:

1
2
$ systemctl show --property=Environment docker
Environment=HTTPS_PROXY=https://192.168.1.10:8000/

经过以上设置, docker search和pull就会直接走设置的http/https代理了。

docker build代理

当在本地构建镜像时,除了先pull一个基础镜像,在构建过程中要下载某个资源,update构建容器内的软件仓库,下载软件包也是常用的操作,而docker hub上常见镜像比如alpine, debian, centos里的软件源并没有设置为国内源, 如果要在构建容器内下载安装软件,光是update操作就很费时,要么在Dockerfile里讲软件源替换为国内源,要么就用代理。每个发行版的国内源和更换方式都不一样,有时候要下载github上或者其他的国外资源,所以使用代理就很方便了。

在docker build阶段,是不会使用上面设置的docker代理的

同样,假如你已经通过某种方式获得了一个可畅通无阻的http/https代理:192.168.1.10:8000

docker build可通过build-arg参数来设置代理

1
docker build  --build-arg http_proxy=http://192.168.1.10:8000 --build-arg https_proxy=http://192.168.1.10:8000 -t proxy_test .

通过以上设置,docker pull和docker build都能使用到我们的自己的代理了,让docker不再被国内的网络环境所束缚。但是,首先,你还得有一个http/https代理。