docker-set-proxy
Linux使用代理
socks5适用于本地能解析目标主机但速度慢的情况,而socks5h则用于本地无法解析目标主机时,由代理服务器进行解析。
-
~/.bashrc
# set proxy function setproxy() { export http_proxy=socks5://127.0.0.1:1080 export https_proxy=socks5://127.0.0.1:1080 export ftp_proxy=socks5://127.0.0.1:1080 export no_proxy=127.0.0.1,localhost,.local,10.10.0.0/8,172.16.0.0/12,192.168.0.0/16 env|grep proxy } # unset proxy function unsetproxy() { unset http_proxy https_proxy ftp_proxy no_proxy env|grep proxy }
# curl使用代理 curl -x socks5h://127.0.0.1:1080 www.baidu.com
docker proxy设置
- 如何优雅的给 Docker 配置网络代理: https://www.cnblogs.com/Chary/p/18096678
- 如何配置docker通过代理服务器拉取镜像: https://www.cnblogs.com/abc1069/p/17496240.html
docker search因index.docker.io无法访问,需要配置代理才能使用。
docker search centos Error response from daemon: Get "https://index.docker.io/v1/search?q=centos&n=25": dial tcp 108.160.166.9:443: connect: connection timed out
Just put this content (change IP and port if needed) into ~/.docker/config.json (notice that the protocol is socks5h) { "proxies": { "default": { "httpProxy": "socks5h://172.17.0.1:3128", // or "httpProxy": "socks5h://localhost:3128", with --network=host "httpsProxy": "socks5h://172.17.0.1:3128", "noProxy": "" } } }
dockerd/docker pull代理
docker pull时,是由守护进程dockerd来执行,需要配置到dockerd中,在systemd或daemon.json中配置。
- 需要systemctl daemon-reload、systemctl restart docker生效
-
方式一:/lib/systemd/system/docker.service
- systemd也会从/etc/systemd/system/docker.service.d和/lib/systemd/system/docker.service.d文件夹下读取配置
- /etc/systemd/system/docker.service.d/http-proxy.conf
-
无根rootness模式下运行docker配置位置有所不同。
[Service] #Environment="HTTP_PROXY=http://<user>:<password>@<domain>:<port>" #Environment="HTTPS_PROXY=http://<user>:<password>@<domain>:<port>" Environment="HTTP_PROXY=http://proxy.example.com:80" Environment="HTTPS_PROXY=https://proxy.example.com:443" # 多个 NO_PROXY 变量的值用逗号分隔,而且可以使用通配符(*),极端情况下,如果 NO_PROXY=*,那么所有请求都将不通过代理服务器。 # 如果使用了国内镜像源可以配置镜像服务器不使用代理 # Environmeng="NO_PROXY=<registry.domain>" Environment="NO_PROXY=your-registry.com,10.10.10.10,*.example.com"
-
方式二:通过/etc/docker/daemon.json配置代理(优先级高于systemd)。需要Docker Engine 23.0 及更高版本
{ "registry-mirrors": ["..."], "proxies": { "http-proxy": "http://<user>:<password>@<domain>:<port>", "https-proxy": "http://<user>:<password>@<domain>:<port>", "no-proxy": "<registry.domain>" } }
{ "registry-mirrors": [ "https://docker.13140521.xyz" ], "proxies": { "http-proxy": "socks5h://192.168.31.103:2222", "https-proxy": "socks5h://192.168.31.103:2222", "no-proxy": "*.13140521.xyz,127.0.0.1,localhost,.local,10.10.0.0/8,172.16.0.0/12,192.168.0.0/16" } }
-
检查参数生效:
sudo systemctl show --property=Environment docker docker info | grep -i proxy
container代理
在容器运行阶段,如果需要代理上网,需要配置~/.docker/config.json或运行时通过-e注入http_proxy环境变量,需要docker 17.07以上版本。
-
方式一:通过命令行参数配置代理
docker run --env HTTP_PROXY="http://<user>:<password>@<domain>:<port>" <some-image> docker run \ --env HTTP_PROXY="http://<user>:<password>@<domain>:<port>" \ --rm alpine sh -c 'env | grep -i _PROXY' # 输出 HTTP_PROXY=http://<user>:<password>@<domain>:<port>
-
方式二:通过~/.docker/config.json配置
{ "auths": { "..." }, "proxies": { # 通用配置,会对当前客户端连接的所有Docker服务生效 "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服务时配置代理,则需要通过 docker-host: proxy-settings的方式在下面配置 "tcp://docker-daemon1.example.com": { "noProxy": "*.internal.example.net" } } }
docker run --rm alpine sh -c 'env | grep -i _PROXY' # 输出 HTTPS_PROXY=https://proxy.example.com:3129 no_proxy=*.test.example.com,.example.org,127.0.0.0/8 NO_PROXY=*.test.example.com,.example.org,127.0.0.0/8 https_proxy=https://proxy.example.com:3129 http_proxy=http://proxy.example.com:3128 HTTP_PROXY=http://proxy.example.com:3128
docker build代理
用--build-arg参数注入http_proxy。
-
通过命令行配置代理
docker build --build-arg HTTP_PROXY="http://proxy.example.com:3128" docker build --build-arg HTTP_PROXY="http://another-proxy.example.com:3128" \ --no-cache \ --progress=plain \ - <<EOF FROM alpine RUN env | grep -i _PROXY EOF # 输出 # ... #5 [2/2] RUN env | grep -i _PROXY #5 0.393 HTTPS_PROXY=https://proxy.example.com:3129 #5 0.393 no_proxy=*.test.example.com,.example.org,127.0.0.0/8 #5 0.393 NO_PROXY=*.test.example.com,.example.org,127.0.0.0/8 #5 0.393 https_proxy=https://proxy.example.com:3129 #5 0.393 http_proxy=http://another-proxy.example.com:3128 #5 0.393 HTTP_PROXY=http://another-proxy.example.com:3128 #5 DONE 0.6s # ...
-
通过~/.docker/config.json的方式配置代理在构建过程中依然有效。
docker build \ --no-cache \ --progress=plain \ - <<EOF FROM alpine RUN env | grep -i _PROXY EOF # 输出 # ... #5 [2/2] RUN env | grep -i _PROXY #5 0.382 HTTPS_PROXY=https://proxy.example.com:3129 #5 0.382 no_proxy=*.test.example.com,.example.org,127.0.0.0/8 #5 0.382 NO_PROXY=*.test.example.com,.example.org,127.0.0.0/8 #5 0.382 https_proxy=https://proxy.example.com:3129 #5 0.382 http_proxy=http://proxy.example.com:3128 #5 0.382 HTTP_PROXY=http://proxy.example.com:3128 #5 DONE 0.6s # ...
不要在Dockerfile中使用ENV指令配置构建过程中使用到的代理配置,镜像创建的容器可能访问不到代理、产生难以理解的网络错误,或者引起代理敏感信息泄漏。