docker各种代理设置(3)
docker pull的代理设置(docker daemon proxy)
docker pull拉取国外的镜像时可能会很慢或者会直接失败,这时需要为docker pull
操作设置代理,或者修改镜像源为国内可访问的镜像源。
但是要注意,docker pull
命令只是向docker daemon服务发送pull操作请求的,实际执行pull操作的是docker daemon进程(dockerd)。因此想要加速docker pull拉取过程,应当配置docker daemon的代理。
有两种配置方式:
- 配置dockerd服务启动时的环境变量
- 配置daemon.json配置文件
daemon.json
docker的daemon.json配置文件默认路径位于:
- /etc/docker/daemon.json
- ~/.config/docker/daemon.json
当然,也可使用dockerd --config-file
明确指定daemon.json的路径。
在daemon.json文件中添加如下代理内容:
{
"proxies": {
"http-proxy": "http://192.168.200.1:8118",
"https-proxy": "http://192.168.200.1:8118",
"no-proxy": "192.168.0.0/16,127.0.0.0/8"
}
}
然后重启docker:
systemctl restart docker
配置dockerd的环境变量
假如使用的是systemd管理dockerd的服务,那么修改服务配置文件/usr/lib/systemd/system/docker.service
,在[Service]
段落添加几个Environment
字段即可。
下面是默认的docker.service添加Environment字段后的内容:
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target docker.socket firewalld.service containerd.service time-set.target
Wants=network-online.target containerd.service
Requires=docker.socket
[Service]
Environment="HTTP_PROXY=http://192.168.200.1:8118"
Environment="HTTPS_PROXY=http://192.168.200.1:8118"
Environment="NO_PROXY=localhost,127.0.0.1"
Type=notify
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutStartSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
OOMScoreAdjust=-500
[Install]
WantedBy=multi-user.target
修改docker.service之后,需要重载,然后重启:
systemctl daemon-reload
systemctl restart docker
docker build的代理设置
有时候在构建Dockerfile时,Dockerfile中的某些指令需要使用代理。
例如,当在Dockerfile中指定RUN npm install
指令时,那么在docker build
构建过程中,运行到npm install
命令时可能会卡住,这时就需要为npm设置代理才能比较快地安装npm包。
要为docker build
设置代理,有两种方式:
-
在
~/.docker/config.json
文件中设置代理。参考如下config.json文件内容:{ "proxies": { "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 build命令中使用
--build-arg
选项来设置HTTP_PROXY HTTPS_PROXY
代理环境变量。例如:docker build . -f Dockerfile -t hexo:v0.1 \ --build-arg HTTP_PROXY='http://192.168.200.1:8118' \ --build-arg HTTPS_PROXY='http://192.168.200.1:8118'
需要注意的是,docker build的过程是在容器中执行操作的,因此如果网络代理的地址是127.0.0.1,将会使用容器内部网络栈的环回地址127.0.0.1,而不是宿主机中的127.0.0.1。因此无论是将代理写入配置文件config.json还是使用--build-arg
指定代理,docker build
命令行中都应该添加--network host
。
# 如果config.json中的代理地址是127.0.0.1,则加上 --network host
docker build . --network host -f Dockerfile -t hexo:v0.1
# 如果通过 --build-arg 指定代理,也加上 --network host
docker build . --network host -f Dockerfile -t hexo:v0.1 \
--build-arg HTTP_PROXY='http://127.0.0.1:8118' \
--build-arg HTTPS_PROXY='http://127.0.0.1:8118'
但无论何时使用docker命令,只要存在网络问题,都建议在当前shell环境下设置好http_proxy https_proxy
环境变量:
export http_proxy=http://127.0.0.1:8118 https_proxy=http://127.0.0.1:8118
比如,docker build有时候一直卡在加载元素据过程,随后就报错,这时只有在shell环境下设置环境变量才有效:
ERROR: failed to solve: node: failed to authorize: failed to fetch oauth token: Post "https://auth.docker.io/token": dial tcp 104.244.46.71:443: connect: connection refused
docker容器运行时的代理设置
容器运行时,可能需要为容器进程设置一个代理。
也有两种设置方式:
要为docker build
设置代理,有两种方式:
-
在
~/.docker/config.json
文件中设置代理。参考如下config.json文件内容:{ "proxies": { "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 run命令中使用
--env
选项来设置HTTP_PROXY HTTPS_PROXY
代理环境变量。例如:docker build . -f Dockerfile -t hexo:v0.1 \ --env HTTP_PROXY='http://192.168.200.1:8118' \ --env HTTPS_PROXY='http://192.168.200.1:8118'
但无论何时使用docker命令,只要存在网络问题,都建议在当前shell环境下设置好http_proxy https_proxy
环境变量:
export http_proxy=http://127.0.0.1:8118 https_proxy=http://127.0.0.1:8118