使用Dragonfly实现P2P分发镜像

一、Dragonfly概述

1. 简介

Dragonfly 是一款基于 P2P 的智能镜像和文件分发工具。它旨在提高文件传输的效率和速率,最大限度地利用网络带宽,尤其是在分发大量数据时,例如应用分发、缓存分发、日志分发和镜像分发。
尽管容器技术大部分时候简化了运维工作,但是它也带来了一些挑战:例如镜像分发的效率问题,尤其是必须在多个主机上复制镜像分发时。Dragonfly 在这种场景下能够完美支持 Docker ,相比原生方式,它能将容器镜像的分发速度提高了 57 倍,并让 Registry 网络出口流量降低 99.5%。使用它可以让容器镜像的分发变得简单而经济。

2. 官方文档地址

https://d7y.io/en-us/

3. GitHub地址

https://github.com/dragonflyoss/Dragonfly/tree/v0.3.0

4. 注意事项

目前Dragonfly的最新版本是v0.3.0,暂不支持对镜像仓库中的对私有镜像的认证。比如使用Harbor这种镜像仓库,把某个project的权限设置为私有权限,那么该project下的镜像是无法直接通过Dragonfly实现镜像的分发的。想通过Dragonfly实现镜像的分发,最简单的办法是必须把镜像对应的project的权限设置为公有权限。还有一种办法是为docker daemon设置http全局代理,但是必须使用0.0.1版本,最新的v0.3.0版本不支持这种方式。不过很遗憾,经测试该方式不好用。官方的Issues链接如下:
https://github.com/dragonflyoss/Dragonfly/issues/138

为docker daemon配置全局代理,方法如下:

1
2
3
4
5
6
7
8
9
mkdir -p /etc/systemd/system/docker.service.d
vi /etc/systemd/system/docker.service.d/http-proxy.conf

[Service]
Environment="HTTP_PROXY=http://127.0.0.1:65001"

systemctl daemon-reload
systemctl restart docker.service
systemctl show --property=Environment docker.service

为docker daemon配置全局代理,参考链接如下:
https://docs.docker.com/config/daemon/systemd/#httphttps-proxy

二、环境的相关信息

1. 版本信息

Docker Engine Community 18.09.5
Harbor 0.5.0
Dragonfly v0.3.0

2. 服务器信息

172.16.170.134 <-> supernode
172.16.170.135 <-> dfclient
172.16.170.136 <-> dfclient

三、实验过程记录

1. 在172.16.170.134上安装supernode,如下所示:

1
2
docker run -d --name supernode --restart=always -p 8001:8001 -p 8002:8002 \
dragonflyoss/supernode:0.3.0 -Dsupernode.advertiseIp=172.16.170.134

2. 分别在172.16.170.135和172.16.170.136上安装dfclient,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
cat <<EOD > /etc/dragonfly/dfget.yml
nodes:
- 172.16.170.134
EOD

cat <<EOD > /etc/docker/daemon.json
{
"registry-mirrors": ["http://127.0.0.1:65001"],
"insecure-registries": ["10.0.55.126"]
}
EOD

systemctl daemon-reload
systemctl restart docker.service

docker run -d --name dfclient --restart=always -p 65001:65001 \
-v /etc/dragonfly:/etc/dragonfly \
dragonflyoss/dfclient:v0.3.0 --registry http://10.0.55.126

3. 分别在172.16.170.135和172.16.170.136上安装拉取一个镜像,如下所示:

1
2
3
4
5
6
7
8
9
10
# docker pull base/alpine:3.8
3.8: Pulling from base/alpine
16f532fbdc2a: Already exists
Digest: sha256:78903b603e9fe76129d1a59ec94bc1ad47769b98e57e8f0c0a57760b12615960
Status: Downloaded newer image for base/alpine:3.8

# docker pull base/alpine:3.8
3.8: Pulling from base/alpine
Digest: sha256:78903b603e9fe76129d1a59ec94bc1ad47769b98e57e8f0c0a57760b12615960
Status: Image is up to date for base/alpine:3.8

四、参考资料

https://github.com/dragonflyoss/Dragonfly/tree/v0.0.1
https://github.com/dragonflyoss/Dragonfly/issues/138
http://dockone.io/article/4646
https://mp.weixin.qq.com/s/95mX8cDox5bmgQ2xGHLPqQ
https://www.cnblogs.com/atuotuo/p/7298673.html
https://docs.docker.com/config/daemon/systemd/
http://likakuli.com/post/2018/09/13/dragonfly/