使用Squid3搭建Docker镜像下载代理


这篇文章来聊一聊怎么搭建用于Docker下载镜像的代理服务。

Squid3是啥

先说点废话,什么是代理服务器,以及为什么要使用代理服务器。

在国内下载DockerHub的镜像老慢了有木有,时不时还超时出错有木有,gcr.io仓库访问不了有木有,换用国内仓库又要修改镜像名字,各种麻烦有木有。

(注:gcr.io是由Google CloudPlatform提供的Docker镜像仓库)

现在都云时代了,在搞一个在海外的云主机多容易的事,阿里云首都在线早都有国外机房了。可是总不能把所有主机都往国外搬,毕竟业务还在国内,远水不解近渴。

代理服务器就可以让处在国内的服务器在需要的时候通过一条通往外界的管道,间接的下载到国内无法下载或者下载不稳定的镜像。

proxy.png


代理服务器依据使用的方式可以分成正向代理、反向代理、透明代理等许多种,依据代理的协议又可以分为HTTP、HTTPS、FTP、SOCK5等众多类型。Docker能够使用的是HTTP和HTTPS的代理服务,而Squid是目前功能最完善且支持HTTPS正向代理的开源服务软件。

Squid目前的版本已经更新到3.x版本,因此称为Squid3,以示与前两版本的区别。

光速搭建Squid服务

怎样搭建Squid服务器最快呢?当然是使用Docker啦。我们可以直接使用『sameersbn/squid』这个镜像,这个镜像是DockerHub上Squid镜像中依然在持续更新的、文档比较全面的、下载次数比较多的,在我写这篇文章时候,这个镜像的最新版本是『3.3.8-14』。

这个镜像的最简单使用方法是:

docker run -d -p 3128:3128 sameersbn/squid:3.3.8-14

这样一个内网使用的HTTP的代理就搭建完成了。Squid默认使用3128作为代理端口,可以将内网主机的代理服务设置为这个代理服务器的IP地址加上3128端口,试一试能否访问因特网的资源。如果遇到问题,可以进入容器内查看一下/var/log/squid3/cache.log这个文件看看是不是有什么错误。

配置Squid代理服务

默认的sameersbn/squid镜像只允许来自内网IP段的主机使用代理,并且包含了许多用于其他协议的配置内容。

然而使用Docker的服务器可能也有非内网IP段的地址,因此需要对Squid3配置进行适当的删改。以下为一个最简单的配置内容:

acl all src 0.0.0.0/0.0.0.0
acl SSL_ports port 443
acl Safe_ports port 80 # http
acl Safe_ports port 443 # https
acl CONNECT method CONNECT
http_access allow all
http_port 3128
visible_hostname proxy


将这个文件保存为『squid.conf』,保存到主机的/etc/squid3目录,然后让我们使用这个配置文件来启动Squid的容器。

由于Squid服务本身具备代理和缓存两个功能(缓存的功能这里不做详细介绍,可以问度娘自行搜索),建议为这个容器设置一下CPU、内存和磁盘的限额,防止极端情况下会把主机资源耗尽。为了方便调试和使用,可以给容器起一个容易记忆的名字,顺便将Squid的缓存和日志目录也挂载到主机上。完整命令如下:

docker run -d --name squid3 --restart=always \
-m 1G \
-p 3128:3128 \
-v /etc/squid3/squid.conf:/etc/squid3/squid.conf \
-v /var/log/squid3:/var/log/squid3 \
-v /var/spool/squid3:/var/spool/squid3 \
sameersbn/squid:3.3.8-14


现在这个代理服务就可以作为通用的HTTP和HTTPS代理了!

让Docker使用Squid下载镜像

那么最后一个问题就是,怎样让Docker去使用这个代理服务器呢?

首先我们需要找到Docker启动的配置,以Systemd管理的系统为例,首先使用『systemctl show docker』命令找到Docker服务的配置文件。例如:

$ systemctl show docker | grep /lib/systemd/system/docker.service
FragmentPath=/lib/systemd/system/docker.service


然后编辑这个文件:

$ sudo vim /lib/systemd/system/docker.service

在[Unit]段加上下面这两行:

Environment=HTTP_PROXY={SERVER_IP}:3128
Environment=HTTPS_PROXY={SERVER_IP}:3128

(注:将{SERVER_IP}替换为实际的服务器IP地址)

然后重新启动Docker服务就可以啦~

$ sudo systemctl daemon-reload
$ sudo restart docker

现在可以尝试一下获取一个gcr.io仓库的镜像,是不是就已经可以了呢 ^^:

$ docker pull gcr.io/google_containers/pause:2.0
2.0: Pulling from google_containers/pause
8f216013977d: Pull complete
a3ed95caeb02: Pull complete
Digest: sha256:9ce5316f9752b8347484ab0f6778573af15524124d52b93230b9a0dcc987e73e
Status: Downloaded newer image for gcr.io/google_containers/pause:2.0


-----------------------------------------------------------------------------------
本文首发于DockOne,转发请标明出处『http://dockone.io/article/1380

9 个评论

你好,我用ubuntu 14.04试了一下,还是pull不了镜像
$ docker pull gcr.io/google_containers/pause:2.0
Error response from daemon: Get https://gcr.io/v1/_ping: dial tcp 64.233.188.82:443: getsockopt: connection refused
64.233.188.82 这个IP地址是 gcr.io 的,说明代理没有生效,还是直连的服务器。
配置文件修改之后需要重启Docker,然后应该要么能够成功,要么应该报代理服务器的错误。
Environment=HTTP_PROXY={SERVER_IP}:3128
Environment=HTTPS_PROXY={SERVER_IP}:3128
这样写所有的docker pull/push都走代理了,自己还有私有仓库就麻烦了。

再加一点条件会更好用:
Environment="no_proxy=xxx.xxx.xxx.xxx, .xxx.com"

这样私有仓库就不用过代理了。
http://www.myfreax.com/use-aliyun-mirror-acceleration-on-docker/ 可以使用阿里云的镜像
docker run -d --name squid3 --restart=always \
-p 3128:3128 \
-v /root/squid.conf:/etc/squid3/squid.conf \
-v /var/log/squid3:/var/log/squid3 \
-v /var/spool/squid3:/var/spool/squid3 \
sameersbn/squid:3.3.8-14

然后容器一直处在Restarting状态 。。。
本人把所有的gcr.io/google-containers下的docker镜像全部都同步到中央库,并且每天会定时更新,请关注:
https://hub.docker.com/u/googlecontainer/
amd64的镜像一个月没有更新了~~ 请问以后还会更新么
最近有更新哦
之前用的vps手动更新的,现在用的ci每天更新,有问题麻烦给我留言: https://xiongyingqi.com/2019/01/29/google-containers/

要回复文章请先登录注册