Docker 代理脫坑指南
Docker 代理配置
由於公司 Lab 伺服器無法正常訪問公網,想要下載一些外部依賴包需要配置公司的內部代理。Docker 也是同理,想要訪問公網需要配置一定的代理。
Docker 代理分為兩種,一種是為執行的 Container 配置代理,用於下載一些依賴包以及訪問公網。另一種是為 Docker Daemon 配置代理,用於支援 docker 相關的命令。
為容器配置代理
配置容器代理一般分為兩種,一種是全域性配置,另一種是僅為某個容器配置。
全域性配置
首先說明,此修改方法僅支援 17.07 或者更高版本。
修改或建立 ~/.docker/config.json
# 如果有的話,先備份一下 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:
[root@localhost ~]# curl cip.cc
IP : 64.104.xxx.xx
地址 : 中國 香港 cisco.com
資料二 : 香港 | 特別行政區
資料三 : 中國香港
URL : http://www.cip.cc/64.104.xxx.xx
基於之前使用 Docker file 打包映象的文章,直接使用打包好帶有 systemd 功能的映象。
# 建立 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 命令新增引數
# 建立 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-pr