在国内从 Docker Hub 上 pull 镜像的时候实在是蛋疼,虽然国内中科大已经有 Docker 的 Mirror 了,但是公司的网最近实在是太慢了,于是我就在内网整了一台 Docker Hub 的 Mirror。
弄好之后,那速度爽的我不要不要的。
服务端
安装 Docker
Linux 下安装 Docker 非常方便,一条命令就搞定:
1
$ curl https://get.docker.com | sh
制作证书
Docker 自从1.6版本开始,API 都是 https 协议,所以需要申请一张证书。如果你有在 CA 申请证书,可以跳过第2步。我是自签名的证书,后面会麻烦一些。
在终端依次执行下面 3 条命令,注意第一条是你自己要设置的域名,反正在内网用,随便写,到时改一下 hosts 文件就行了。
1
2
3
4
5$ signdomain=hub.evalbug.com
$ openssl req -nodes -subj "/C=CN/ST=Xian/L=Gaoxin/CN=$signdomain" -newkey rsa:4096 -keyout $signdomain.key -out $signdomain.csr
$ openssl x509 -req -days 3650 -in $signdomain.csr -signkey $signdomain.key -out $signdomain.crt执行完这 3 条命令之后,就会在当前目录下生成三个文件,我们关注下面这两个文件:
hub.evalbug.com.crt
是服务器证书,hub.evalbug.com.key
是服务器私钥。如果你是在 CA 申请的,也会有这两个东西。
然后我们把这证书和私钥统一放在
/root/certs/
目录下。创建仓库存储的目录
1
mkdir /opt/registry
创建一个 Registry 容器
1
2$ signdomain=hub.evalbug.com
$ docker run -d -p 443:5000 --restart=always --name registry -v /opt/registry:/var/lib/registry -v /root/certs:/certs -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/$signdomain.crt -e REGISTRY_HTTP_TLS_KEY=/certs/$signdomain.key registry:2这里需要注意使用的 tag 是 2。
容器启动成功后,进入容器 bash 下:
1
$ docker exec -it registry /bin/bash
然后执行:
1
2$ echo "proxy:" >> /etc/docker/registry/config.yml
$ echo " remoteurl: https://docker.mirrors.ustc.edu.cn" >> /etc/docker/registry/config.yml有人说这个可以通过创建容器的时候,
加上MIRROR_SOURCE=https://docker.mirrors.ustc.edu.cn
和MIRROR_SOURCE_INDEX=https://index.docker.io
这两个环境变量来实现,但经过实测后发现并不能。接着退出 bash ,重启 registry 容器。
1
docker restart registry
这里的
registry
是我们在docker run
的时候加了--name
,取了一个别名。至此,Server 端就搞定了。
客户端
安装 Docker, 过程不再多说,不过要注意版本不要太低
先设置域名解析。
1
$ echo "192.168.1.101 hub.evalbug.com" >> /etc/hosts
如果自己有域名,可以在域名提供商那设置解析,如果域名是自己随便写的,就在 hosts 里面加上解析。
信任证书
如果是在 CA 申请的证书,可以跳过此步
因为我们是自己签名、颁发的证书,肯定不是受信的,不过在内网中,完全够用了。信任证书也分两种方式,让 docker 信任证书和让操作系统信任证书,两种都可以。
让 Docker 信任证书
1
2
3$ DOMAIN_NAME=hub.evalbug.com
$ mkdir -p /etc/docker/certs.d/$DOMAIN_NAME
$ openssl s_client -connect $DOMAIN_NAME:443 -showcerts </dev/null 2>/dev/null | openssl x509 -outform PEM | sudo tee /etc/docker/certs.d/$DOMAIN_NAME/ca.crt其实就是把证书拷到
/etc/docker/certs.d/域名/
目录下。让操作系统信任证书
- debian、ubuntu 下
1
2
3$ DOMAIN_NAME=hub.evalbug.com
$ openssl s_client -connect $DOMAIN_NAME:443 -showcerts </dev/null 2>/dev/null | openssl x509 -outform PEM | sudo tee /usr/local/share/ca-certificates/$DOMAIN_NAME.crt
$ sudo update-ca-certificates- readhat 下
1
2
3$ DOMAIN_NAME=hub.evalbug.com
$ openssl s_client -connect $DOMAIN_NAME:443 -showcerts </dev/null 2>/dev/null | openssl x509 -outform PEM | sudo tee /etc/pki/ca-trust/source/anchors/$DOMAIN_NAME.crt
$ sudo update-ca-trust配置 Docker Mirrors
1
$ vi /etc/docker/daemon.json
然后输入如下内容:
1
2
3{
"registry-mirrors": ["https://hub.evalbug.com"]
}重启 Docker
1
$ service docker restart
或
1
$ systemctl restart docker.service
测试
随便拉取一个镜像试试
1
$ docker pull ubuntu:14.04
第一次可能会慢一些,因为服务器上没缓存,拉取完毕后,把客户端的 images 删除,然后重新拉取一下,就能感受到速度了。