这篇文章来聊一聊怎么搭建用于Docker下载镜像的代理服务。
先说点废话,什么是代理服务器,以及为什么要使用代理服务器。
在国内下载DockerHub的镜像老慢了有木有,时不时还超时出错有木有,gcr.io仓库访问不了有木有,换用国内仓库又要修改镜像名字,各种麻烦有木有。
(注:gcr.io是由Google CloudPlatform提供的Docker镜像仓库)
现在都云时代了,在搞一个在海外的云主机多容易的事, 阿里云 、 首都在线 早都有国外机房了。可是总不能把所有主机都往国外搬,毕竟业务还在国内,远水不解近渴。
代理服务器就可以让处在国内的服务器在需要的时候通过一条通往外界的管道,间接的下载到国内无法下载或者下载不稳定的镜像。
代理服务器依据使用的方式可以分成正向代理、反向代理、透明代理等许多种,依据代理的协议又可以分为HTTP、HTTPS、FTP、SOCK5等众多类型。Docker能够使用的是HTTP和HTTPS的代理服务,而Squid是目前功能最完善且支持HTTPS正向代理的开源服务软件。
Squid目前的版本已经更新到3.x版本,因此称为Squid3,以示与前两版本的区别。
怎样搭建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这个文件看看是不是有什么错误。
默认的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去使用这个代理服务器呢?
首先我们需要找到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
现在可以尝试一下获取一个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,转发请标明出处『』