部署企業自己的Docker Hub鏡像加速器

在這裏插入圖片描述

背景

國內從 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:

  1. 以主賬號登錄阿里雲管理控制檯
  2. 將鼠標置於頁面右上方的賬號圖標,單擊accesskeys
  3. 安全提示頁面,選擇獲取主賬號還是子賬號的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/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章