Docker 代理脫坑指南

Docker 代理配置

因爲公司 Lab 服務器沒法正常訪問公網,想要下載一些外部依賴包須要配置公司的內部代理。Docker 也是同理,想要訪問公網須要配置必定的代理。linux

Docker 代理分爲兩種,一種是爲運行的 Container 配置代理,用於下載一些依賴包以及訪問公網。另外一種是爲 Docker Daemon 配置代理,用於支持 docker 相關的命令。docker

爲容器配置代理

配置容器代理通常分爲兩種,一種是全局配置,另外一種是僅爲某個容器配置。shell

全局配置

首先說明,此修改方法僅支持 17.07 或者更高版本。json

修改或建立 ~/.docker/config.jsonbash

# 若是有的話,先備份一下
cp ~/.docker/config.json ~/.docker/config.json.bk

# 修改內容以下
cat ~/.docker/config.json
{
        "auths": {},
        "HttpHeaders": {
                "User-Agent": "Docker-Client/19.03.2 (linux)"
        },

        "proxies":
        {
            "default":
            {
                "httpProxy": "http://173.39.112.117:80",
                "httpsProxy": "http://173.39.112.117:80"
            }
        }
}

爲了確保生效,重啓下 docker :systemctl restart docker服務器

此時宿主機並沒配置代理,查詢下 IP:curl

[root@localhost ~]# curl cip.cc
IP      : 64.104.xxx.xx
地址    : 中國  香港  cisco.com

數據二  : 香港 | 特別行政區

數據三  : 中國香港

URL     : http://www.cip.cc/64.104.xxx.xx

基於以前使用 Docker file 打包鏡像的文章,直接使用打包好帶有 systemd 功能的鏡像。url

# 建立 container
[root@localhost home] docker run --privileged=true -ti \
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
-p 80:80 -d local/c7-systemd

# 進入 container
[root@localhost home] docker exec -it 3eaa1cc71706 /bin/bash

# 查詢 IP
[root@3eaa1cc71706 /]# curl cip.cc
IP      : 173.39.112.xxx
地址    : 新加坡  新加坡

數據二  : 新加坡

數據三  : 新加坡

URL     : http://www.cip.cc/173.39.112.xxx

能夠看到容器內已經成功配置了代理,能夠正常下載依賴了。代理

局部修改

方法1-在 docker run 命令添加參數rest

# 建立 container
docker run --privileged=true -ti \
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
--env HTTP_PROXY="http://173.39.112.117:80 \
--env HTTPS_PROXY="http://173.39.112.117:80 \
--env http_proxy="http://173.39.112.117:80 \
--env https_proxy="http://173.39.112.117:80 \
-p 80:80 -d local/c7-systemd

# 進入 container
[root@localhost home]# docker exec -it 3607976e8f2d /bin/bash

# 查詢 IP
[root@3607976e8f2d /]# curl cip.cc
IP      : 173.39.112.xxx
地址    : 新加坡  新加坡

數據二  : 新加坡

數據三  : 新加坡

URL     : http://www.cip.cc/173.39.112.xxx

方法2-在 Docker-file 添加

這裏以打包一個 httpd 的 docker file 爲例子:

FROM local/c7-systemd

ENV MY_PROXY_URL="http://173.39.112.117:80"
ENV HTTP_PROXY=$MY_PROXY_URL \
    HTTPS_PROXY=$MY_PROXY_URL \
    FTP_PROXY=$MY_PROXY_URL \
    http_proxy=$MY_PROXY_URL \
    https_proxy=$MY_PROXY_URL \
    ftp_proxy=$MY_PROXY_URL


RUN yum -y install httpd; yum clean all; systemctl enable httpd.service

EXPOSE 80

CMD ["/usr/sbin/init"]

結果是相同的,這裏就不演示了。有時添加代理是域名的話,就須要額外的操做。

添加代理是域名的處理

若是添加的代理是域名的話,如 proxy.esl.cisco.com:80, 須要再作一步額外的處理。

方法1-經過 docker run 參數添加

# 建立 container
[root@localhost home]#docker run --privileged=true -ti \
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
--env HTTP_PROXY="http://proxy.esl.cisco.com:80 \
--env HTTPS_PROXY="http://proxy.esl.cisco.com:80 \
--env http_proxy="http://proxy.esl.cisco.com:80 \
--env https_proxy="http://proxy.esl.cisco.com:80 \
--dns=64.104.123.245 \
-p 80:80 -d local/c7-systemd

# 進入 container
[root@localhost home]# docker exec -it 992dc27de1cc /bin/bash

# 查看 IP
[root@992dc27de1cc /]# curl cip.cc
IP      : 173.39.xxx.xxx
地址    : 新加坡  新加坡

數據二  : 新加坡

數據三  : 新加坡

URL     : http://www.cip.cc/173.39.xxx.xxx

方法2-經過修改 docker daemon 配置添加

在每一個 container 運行前,會繼承 Docker daemon 的配置,在 /etc/docker/daemon.json 文件下.

# 爲 docker daemon 添加 dns,在運行時會爲每一個 container 添加上
cat /etc/docker/daemon.json
{
  "dns" : [
    "8.8.4.4",
    "8.8.8.8",
    "Your_DNS_SERVER"
  ],

  "registry-mirrors":["https://docker.mirrors.ustc.edu.cn"]
}

效果同樣這裏就不演示了。

爲 Docker Daemon 添加代理

和 container 的狀況同樣,若是不爲 Docker Daemon 配置代理的話,是沒法使用 search, pull, push 等命令的。

配置以下:

# STEP1-建立文件夾
[root@localhost home]# sudo mkdir -p /etc/systemd/system/docker.service.d

# STEP2-建立代理文件 http 和 https
[root@localhost home]# cat /etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://proxy.esl.cisco.com:80/"

[root@localhost home]# cat /etc/systemd/system/docker.service.d/https-proxy.conf
[Service]
Environment="HTTPS_PROXY=http://proxy.esl.cisco.com:80/"

# 若是但願訪問某些 Docker registries 不是用代理,能夠在上面的配置文件後追加
[Service]    
Environment="HTTP_PROXY=http://proxy.example.com:80/" "NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,.corp"

# STEP3-刷新變動
[root@localhost home]# sudo systemctl daemon-reload

# STEP4-重啓 Docker
[root@localhost home]# sudo systemctl restart docker

# STEP5-驗證代理是否生效
[root@localhost home]# systemctl show --property=Environment docker
Environment=HTTP_PROXY=http://proxy.esl.cisco.com/ HTTPS_PROXY=http://proxy.esl.cisco.com:80/

參考

docker-container-proxy

docker-dns

docker-daemon-proxy

相關文章
相關標籤/搜索