Docker使用宿主代理

20200428102310

在docker中安装软件,下载地址在外国,下载速度奇慢,这个时候可以通过宿主的代理访问。

Docker启动容器,默认使用bridge模式分配网络,会在宿主机安装一个虚拟网卡docker0。我们通过ifconfig命令查看一下

docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:caff:fefe:2f7e  prefixlen 64  scopeid 0x20<link>
        ether 02:42:ca:fe:2f:7e  txqueuelen 0  (Ethernet)
        RX packets 7941959  bytes 525663055 (525.6 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 8654991  bytes 11073643780 (11.0 GB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

对于容器来说,宿主的IP地址为172.17.0.1

运行容器时使用代理


docker run -it  -e "HTTP_PROXY=http://192.168.1.200:7890" -e "HTTPS_PROXY=http://192.168.1.200:7890" ...

在已有的容器中使用代理

我们进入容器进行代理配置

export http_proxy=http:172.17.0.1:1081
export https_proxy=http:172.17.0.1:1081

bulid Dockerfile 使用代理

编辑Dokkerfile添加以下环境

ENV http_proxy "http://172.17.0.1:1081"
ENV https_proxy "http://172.17.0.1:1081"

下载镜像时使用代理

官方的镜像源在国外,我们可以使用国内的镜像,但有时还是需要通过官方的源拉取镜像

sudo mkdir -p /etc/systemd/system/docker.service.d
# 创建proxy文件
vim /etc/systemd/system/docker.service.d/proxy.conf 

# 配置代理地址
[Service]
Environment="HTTPS_PROXY=http://localhost:1081"
Environment="HTTP_PROXY=http://localhost:1081"

# 需要重启Docker
sudo service docker restart

通过nginx搭建代理

增加一下配置

# docker
location /v2/ {
    proxy_pass https://registry-1.docker.io; # Docker Hub 的官方镜像仓库
    proxy_set_header Host registry-1.docker.io;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;

    # 关闭缓存
    proxy_buffering off;

    # 转发认证相关的头部
    proxy_set_header Authorization $http_authorization;
    proxy_pass_header Authorization;

    # 重写 www-authenticate 头为你的反代地址
    proxy_hide_header www-authenticate;
    add_header www-authenticate 'Bearer realm="https://docker.yjll.blog/token",service="registry.docker.io"' always;
    # always 参数确保该头部在返回 401 错误时无论什么情况下都会被添加。

    # 对 upstream 状态码检查,实现 error_page 错误重定向
    proxy_intercept_errors on;
    # error_page 指令默认只检查了第一次后端返回的状态码,开启后可以跟随多次重定向。
    recursive_error_pages on;
    # 根据状态码执行对应操作,以下为301、302、307状态码都会触发
    error_page 301 302 307 = @handle_redirect;
}
# 处理 Docker OAuth2 Token 认证请求
location /token {
    resolver 1.1.1.1 valid=600s;
    proxy_pass https://auth.docker.io; # Docker 认证服务器

    # 设置请求头,确保转发正确
    proxy_set_header Host auth.docker.io;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;

    # 传递 Authorization 头信息,获取 Token
    proxy_set_header Authorization $http_authorization;
    proxy_pass_header Authorization;

    # 禁用缓存
    proxy_buffering off;
}
location @handle_redirect {
    resolver 1.1.1.1;
    set $saved_redirect_location '$upstream_http_location';
    proxy_pass $saved_redirect_location;
}

下载镜像时使用自己的域名作为前缀,官方镜像记得手动拼入library,自定义镜像则不需要。

docker pull docker.xxx.net/library/postgres

好了,可以愉快的乱搞了。


Docker使用宿主代理
https://blog.yjll.blog/post/21f939f5.html
作者
简斋
发布于
2020年4月28日
许可协议