Docker使用宿主代理
在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