目录
- Docker Client - 代理访问远程的 Docker Daemon
- Docker Daemon - 代理拉取或推送国外镜像
- Container - 容器内部代理访问国外资源
通过代理访问网络是一个比较头疼的事情,例如:想访问远程的 Docker Daemon
需要代理,想拉取或推送国外的镜像需要代理,想容器内部访问国外的资源又需要代理。
上面的场景是不是让你很头大,但是请想开点,这篇文章将让你通往*的国度。保护你的头发,让你留出更多的时间去做该做的事情。
上面说的是三个场景就是针对于不同的网络代理需要,根据需要处理即可。
Docker Client - 代理访问远程的 Docker Daemon
参考 Docker
官方文档:Use the Docker command line
Docker
的 Client
和 Daemon
端是可以不在同一个机器上的,可以通过 docker -h
连接其他的 Docker Daemon
。
在 Client
端设置代理其实就是设置 Linux
系统的代理,从而让系统的命令行可以通过代理连接到外部的网络。一般只需要配置 HTTP_PROXY
与 HTTPS_PROXY
这两个即可。
- 临时生效: 在命令行中执行下面的命令,根据自己实际代理
IP
与代理端口设置(需要允许局域网连接):
export https_proxy=http://127.0.0.1:7890 http_proxy=http://127.0.0.1:7890
- 永久生效,在系统变量中配置。系统变量配置有多个地方,例如在
/etc/profile
文件的底部添加下面的内容:
export https_proxy=http://127.0.0.1:7890
export http_proxy=http://127.0.0.1:7890
让配置文件生效:
source /etc/profile
恭喜,Docker Client
代理配置完成!
Docker Daemon - 代理拉取或推送国外镜像
参考 Docker
官方文档:Control Docker with systemd
有的时候我们会用到一些国外的镜像,比如搭建 k8s
时会用到 提供的镜像,但是无法正常
pull
;或者你想将某些镜像上传到国外的镜像仓库中,都需要使用代理进行操作。
注:Docker 守护程序(
dockerd
)是在其启动环境中
使用HTTP_PROXY
、HTTPS_PROXY
和NO_PROXY
环境变量来配置HTTP
或HTTPS
代理行为,需要在Docker systemd
服务文件中添加此配置。 在文件或者是在
系统环境变量文件
中配置它们都不会使其生效。
要实现 Daemon
代理会比较复杂一些,并且下面的操作将覆盖默认的 文件,这样当
Docker
启动的时候就会读取到下面的代理配置信息:
-
在
/etc/systemd/system
目录下创建目录
sudo mkdir -p /etc/systemd/system/
-
在该目录下创建
文件
sudo touch /etc/systemd/system//
-
选用你最喜欢的编辑器,编辑该文件并添加下面的内容,这里使用
vi/vim
进行编辑。vim /etc/systemd/system//
根据自身需要添加下面的内容并替换为实际的配置,一般只需要添加
HTTP_PROXY
和HTTPS_PROXY
:[Service] Environment="HTTP_PROXY=:8080/" Environment="HTTPS_PROXY=:8080/" Environment="NO_PROXY=localhost,127.0.0.1,."
【注】
HTTP_PROXY
用于代理访问http
请求,HTTPS_PROXY
用于代理访问https
请求,如果想某个IP
或域名
不走代理则配置到NO_PROXY
中。添加完成后,保存即可。
-
刷新更改并重新启动
Docker
sudo systemctl daemon-reload sudo systemctl restart docker
恭喜,Docker Daemon
代理配置完成!
Container - 容器内部代理访问国外资源
参考 Docker 官方文档: Configure Docker to use a proxy server
该代理只针对于后续 build 或 run 的容器有效,已经创建好的不受影响。
主要是用于容器内部的网络访问。
本身容器就可以当做一个简化版的 Linux 系统,如果想实现容器内部的代理,则必须在容器内设置适当的环境变量。
-
直接在容器内部进行修改,虽然也可以这样做,
但是不是很推荐
,如果不是测试使用,最好还是保证容器的完整性。如果是想要将该容器导出并移植到其他机器上去的话,那肯定是在容器内部修改环境变量导出。
-
在
Docker 17.06 及更早版本中
,可以在构建映像(这会降低映像的可移植性)或创建或运行容器时通过指定参数
来执行此操作。 -
在
Docker 17.07 及更高版本中
,Docker
提供了一个全局的配置,可以通过配置Docker
客户端以自动将代理信息传递给容器,从而让所有的容器内部都支持代理访问。
通过参数配置在这里就不多说了,无非就是命令的使用。这里主要说一下 Docker 17.07
及更高版本中的全局配置:
-
在
Docker
客户端上,在启动容器的用户的主目录中创建或编辑文件~/.docker/
。 如果没有该目录或文件则使用相应的用户来创建。# 创建目录 mkdir ~/.docker # 创建配置文件 touch ~/.docker/ # 编辑配置文件 vim ~/.docker/
根据自身需要添加下面的内容并替换为实际的配置,一般只需要添加
HTTP_PROXY
和HTTPS_PROXY
即可:{ "proxies": { "default": { "httpProxy": "http://127.0.0.1:7890", "httpsProxy": "http://127.0.0.1:7890", "noProxy": "*.,.,127.0.0.0/8" } } }
【注】
HTTP_PROXY
用于代理访问http
请求,HTTPS_PROXY
用于代理访问https
请求,如果想某个IP
或域名
不走代理则配置到NO_PROXY
中。添加完成后,保存即可。
-
重新启动
Docker
sudo systemctl restart docker
恭喜,Container
代理配置完成!
Roc’s Blog:详解 Docker 的三种网络代理配置