背景
國內從 Docker Hub 拉取鏡像有時會遇到困難,一般是網絡比較慢,需要很長時間,極有可能連接斷裂,拉不到鏡像。此時,可以配置鏡像加速器。國內很多雲服務商都提供了國內加速器服務,例如阿里雲、華爲雲、網易雲和道雲等等。一般都會去創建或修改 機器的/etc/docker/daemon.json文件:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://1nj0zren.mirror.aliyuncs.com",
"http://f1361db2.m.daocloud.io"
]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
這樣你的機器就能拉取dockerhub鏡像啦。
|但是企業中使用,也是每臺機器都去配置這個damon.json文件去拉取dockerhub鏡像嗎?
要是每臺機器都去配置這個加速器,會有以下問題:
- 萬一阿里雲或者華爲雲的加速器地址變了,那你每臺機器都要改,很麻煩,當然阿里雲和華爲雲是很穩定的,目前沒出現這種情況,但這種情況是可能發生的。本人之前用的是微軟雲的加速器地址(https://dockerhub.azk8s.cn/),現在該加速器地址微軟雲已經不對外開放了,只供微軟雲用戶使用。所以這種情況還是可能發生的。
- 要是在k8s部署一個nginx的deployment,副本數是10個,10個pod都分配在不同的節點上,那麼就要請求阿里雲鏡像加速服務10次以拉取nginx鏡像,也就是重複拉取了,使得應用部署時間邊長。
所以,本文將推出如何在企業內部部署dockerhub容器鏡像加速器服務,功能:
-
緩存鏡像。當節點來該加速器服務拉取鏡像時,如果加速器服務中已經有了該鏡像,則節點可直接從加速器服務拉取。要是加速器服務沒有該鏡像,就需要取dockerhub拉取鏡像,再返回請求節點。
-
加快鏡像拉取速度,進而加快應用的部署。因爲所有節點都去加速器服務拉鏡像,而加速器服務只需要去dockerhub拉取一次鏡像就可以將鏡像返回給所有節點。加速器服務後端有存儲,將存儲拉過的鏡像。
部署加速器服務前提條件
- 1臺vps主機(國外機器),可以去https://my.vultr.com/ 或者阿里雲上買一臺,Vultr上按小時租賃,很便宜,租一臺1C1G的就行
- 1個redis服務
- 1個S3存儲服務
- 1個docker registry服務: 這是一個docker私有倉庫,有官方鏡像,直接使用即可。點擊這裏查看詳情
1. 配置redis
配置redis的用戶名和密碼,修改redis.conf, 以6.0.3爲例
wget http://download.redis.io/releases/redis-6.0.3.tar.gz
tar xzf redis-6.0.3.tar.gz
修改redis.conf文件
requirepass zhounanjun
#bind 127.0.0.1
protected-mode no
保存配置文件
製作redis鏡像,redis的Dockerfile(將修改好的redis.conf與Dockerfile放在一個目錄):
FROM redis:6.0.3
COPY redis.conf /usr/local/etc/redis/redis.conf
CMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ]
運行:
docker build -t redis:v1.0 .
docker run -p 6379:6379 --name some-redis -d redis:v1.0
2. 配置minio
registry後端支持S3存儲,這邊選用minio作爲後端存儲,MinIO 是一個基於Apache License v2.0開源協議的對象存儲服務。它兼容亞馬遜S3雲存儲服務接口,非常適合於存儲大容量非結構化的數據,例如圖片、視頻、日誌文件、備份數據和容器/虛擬機鏡像等,而一個對象文件可以是任意大小,從幾kb到最大5T不等。Minio介紹
docker run -p 9000:9000 --name minio1 -v /mnt/data:/data -v /mnt/config:/root/.minio -d minio/minio server /data
本地創建好/mnt/data目錄
訪問minio前端UI:http://公網IP:9000 (阿里雲上的主機需要開通9000端口策略)
用戶名和密碼分別是minioadmin和minioadmin
點擊右下角+號創建buckets名爲 mirror-registry,如下圖所示:
3.配置registry
Docker registry是存儲docker image的倉庫,它在docke生態環境中的位置如下圖所示,運行 docker push 、 docker pull 、 docker search 時,實際上是通過docker daemon與docker registry通信, registry除了作爲私有倉庫外,他還有個緩存模式,開啓緩存模式是你只可以從registry拉取鏡像而不能推送鏡像,這種緩存模式也就可以被用來作鏡像加速器的功能。
那麼下面就開始來配置registry使它可以作爲鏡像加速服務:
配置registry的config.yml:
version: 0.1
log:
fields:
service: registry
level: info
storage:
cache:# registry自己需要用到緩存,可以使用內存或者redis,這邊使用redis
blobdescriptor: redis
s3: 配置後端存儲
accesskey: minioadmin #minio用戶名
secretkey: minioadmin #minio密碼
region: huadong #自己搭建的Minio就隨便填
regionendpoint: http://8.210.20.74:9000 #minio服務地址
bucket: mirror-registry #minio中創建的bucket名字
encrypt: false
secure: false
v4auth: true
chunksize: 5242880
rootdirectory: /
delete:
enabled: true
maintenance:
uploadpurging:
enabled: true
age: 168h
interval: 24h
dryrun: false
readonly:
enabled: false
http:
addr: :5000
headers:
X-Content-Type-Options: [nosniff]
redis:
addr: 8.210.20.74:6379 #redis服務
password: zhounanjun #redis密碼
db: 0
dialtimeout: 10ms
readtimeout: 10ms
writetimeout: 10ms
pool:
maxidle: 16
maxactive: 64
idletimeout: 300s
health: #配置健康檢查,以便進行監控
storagedriver:
enabled: true
interval: 10s
threshold: 3
tcp:
- addr: 8.210.20.74:6379
timeout: 3s
interval: 10s
threshold: 3
製作registry鏡像的Dockerfile:
FROM registry:latest
LABEL maintainer="zhounanjun"
COPY entrypoint.sh /entrypoint.sh
COPY config.yml /etc/docker/registry/config.yml
registry需要用到的entrypoint.sh:
#!/bin/sh
set -e
CONFIG_YML=/etc/docker/registry/config.yml
if [ -n "$PROXY_REMOTE_URL" -a `grep -c "$PROXY_REMOTE_URL" $CONFIG_YML` -eq 0 ]; then
echo "proxy:" >> $CONFIG_YML
echo " remoteurl: $PROXY_REMOTE_URL" >> $CONFIG_YML
echo "------ Enabled proxy to remote: $PROXY_REMOTE_URL ------"
elif [ $DELETE_ENABLED = true -a `grep -c "delete:" $CONFIG_YML` -eq 0 ]; then
sed -i '/rootdirectory/a\ delete:' $CONFIG_YML
sed -i '/delete/a\ enabled: true' $CONFIG_YML
echo "------ Enabled local storage delete -----"
fi
case "$1" in
*.yaml|*.yml) set -- registry serve "$@" ;;
serve|garbage-collect|help|-*) set -- registry "$@" ;;
esac
exec "$@"
Makefile
VERSION ?= v1.0
image:
docker build -t zhounanjun/mirror:${VERSION} .
run-dockerhub:
docker run -itd -p 7669:5000 -e PROXY_REMOTE_URL=https://registry-1.docker.io --restart=always --name registry-mirror zhounanjun/mirror:${VERSION}
上面Makefile中的PROXY_REMOTE_URL環境變量很重要哦,這個url的值就是去拉取dockerhub鏡像的地址,你可以配置成阿里雲加速器地址,你也可以配置成dockerhub官方地址。要是你沒有國外機器,你就寫入阿里雲鏡像加速器地址,我這邊寫的dokcerhub官方地址,因爲我部署在了國外的服務器上,海外服務器拉dockerhub鏡像賊快。
4.部署加速器
在你需要內網環境中的一個節點上部署加速器服務,運行:
make image
make run-dockerhub
然後你在k8s集羣中的節點中都做如下配置:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://192.168.1.1000:7669/"
]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
然後你的k8s集羣就可以正常拉取dockerhub鏡像啦,使用鏡像加速器服務越頻繁,加速效果越明顯,因爲你的內部加速器會緩存越來越多。
在阿里雲上部署鏡像加速器
因爲vps上的主機有可能會被封掉,所以你可以在阿里雲上買一臺香港主機,比較穩定,我在阿里雲上買了一臺輕量級服務器和對象存儲Oss。總共花了40元吧。要是企業內部使用,建議去買臺阿里雲ECS的服務器,注意下帶寬啊!好一點的帶寬,拉鏡像快。
1、創建對象存儲,在阿里雲oss下創建bucket,如圖
2、創建阿里雲香港服務器三臺企業級服務器,帶寬基礎能力:25 Gbit/s相當於3G/s。沒試過,應該很快。如圖
爲了順利使用阿里雲的對象存儲,你需要在阿里雲上創建AccessKey,如何在阿里雲創建AccessKey:
- 以主賬號登錄阿里雲管理控制檯 。
- 將鼠標置於頁面右上方的賬號圖標,單擊accesskeys。
- 在安全提示頁面,選擇獲取主賬號還是子賬號的Accesskey。
使用阿里雲的對象存儲只需要修改下registry的config.yaml:
version: 0.1
log:
fields:
service: registry
level: info
storage:
cache:# registry自己需要用到緩存,可以使用內存或者redis,這邊使用redis
blobdescriptor: redis
oss:
accesskeyid: LTAI4G8T5y8m2TtfwfgD66Kj #自己去控制檯創建
accesskeysecret: MPQUxt8O0csgbdfdjZdcAQPIEbVgHFa #自己去控制檯創建
region: oss-cn-hangzhou #所屬域
bucket: webplus-cn-hangzhou-s-5df099203c3f2876a5b6b344 #bucket名稱
delete:
enabled: true
maintenance:
uploadpurging:
enabled: true
age: 168h
interval: 24h
dryrun: false
readonly:
enabled: false
http:
addr: :5000 # registry服務地址
headers:
X-Content-Type-Options: [nosniff]
redis:
addr: 8.210.20.74:6379 #redis服務
password: zhounanjun #redis密碼
db: 0
dialtimeout: 10ms
readtimeout: 10ms
writetimeout: 10ms
pool:
maxidle: 16
maxactive: 64
idletimeout: 300s
health: #配置健康檢查,以便進行監控
storagedriver:
enabled: true
interval: 10s
threshold: 3
tcp:
- addr: 8.210.20.74:6379
timeout: 3s
interval: 10s
threshold: 3
其他的和上面配置一樣,redis還是用容器起就行。
因爲阿里雲香港服務器自帶公網地址,只要能連外網的機器都能連到這臺registry服務。
下面介紹下我的部署方案如下:
我的需求是:擁有自己的dockerhub鏡像加速器,不依賴阿里雲等公有云的加速器。
所以,我去找一臺海外服務器,部署一套完整的加速器服務(我是去阿里雲上部署的,租用阿里雲的對象存儲),海外節點部署registry的makefile文件中的PROXY_REMOTE_URL參數設置爲https://registry-1.docker.io,然後企業內部私有云中機器可能不能連接外網,所以可以找幾臺內部節點,部署加速器服務,其中makefile的PROXY_REMOTE_URL設置爲海外節點registry服務地址,申請開通這幾臺機器到海外節點的網絡策略。其他內部節點只需要配置下damon.json,且registry-mirrors參數指向內部加速節點registry的服務地址即可。當然,若是內部節點可以全開通到海外節點的網絡策略,那就連內部加速器服務節點都可以省掉了,但是這樣的話,內部節點拉鏡像的速度就完全取決於內部節點訪問公網的速度了,肯定沒有訪問內網快啦!
總結
根據我的部署方案去部署,你不需要依賴任何公有云的鏡像加速服務,自力更生,實現企業內部自己使用。要是有任何疑問請在評論區評價,我會及時回覆的!
歡迎關注本人微信公衆號“雲原生手記”,我會定時更新噠!
參考文章:
[1]:https://docs.docker.com/registry/recipes/mirror/
[2]: https://docs.docker.com/registry/configuration/