私有化部署極簡 Docker Registry

在使用 K8S 和 Docker 進行快速 CI/CD 的過程當中咱們須要提交 Docker 鏡像. 在公有云上, 咱們可使用阿里雲鏡像服務. 但本地開發和測試環境, 若是使用阿里雲等公有云服務, 在速度和流量費用方面都須要考慮, 所以少不了私有化部署. 常見的私有化方案有2種:nginx

  • Docker Registry. 當前最新版本爲 Registry 2. 提供核心的倉庫服務, 但無節面. 適合開發和測試環境, 以及小團隊使用.
  • Harbor. Habor 是由VMWare公司開源的容器鏡像倉庫。事實上,Habor是在Docker Registry上進行了相應的企業級擴展,從而得到了更加普遍的應用,這些新的企業級特性包括:管理用戶界面,基於角色的訪問控制,支持 Helm charts, AD/LDAP 集成以及審計日誌等。所以, 對於比較大的組織, 或者須要在正式環境使用, 甚至二次開發或對外進行服務, 那麼推薦使用Harbor.

一. Docker Registry 安裝和啓動

Registry 直接使用 docker 安裝便可, 需暴露一個端口, 以及將鏡像存儲的路徑 map 到 host 持久化.使用如下命令進行安裝:git

docker pull registry:2.6.1
docker run -d -p 5000:5000 -v /data2/docker-registry/registry:/tmp/registry --restart=always daocloud.io/registry:2.6.1

若是使用使用國內 DaoCloud鏡像, 可將上面的 registry:2.6.1 替換爲 daocloud.io/registry:2.6.1.github

完整的 docker-compose.yaml 示例以下:docker

dockerregistry:
  image: registry:2.6.1
  privileged: false
  restart: always
  ports:
  - 5000:5000
  volumes:
  - /data2/docker-registry/registry:/tmp/registry

二. 訪問 Registry

2.1 配置本地 docker 容許訪問非安全 (http) 服務

在 docker 所在機器編輯 (如沒有, 能夠新建) /etc/docker/daemon.json (假設爲 Linux 系統):json

{
  "insecure-registries" : ["ttg12:5000"]
}

2.2 提交一個鏡像(image)

如今示例把 registry:2.6.1 這個鏡像打上私有倉庫的標籤, 而且提交:安全

docker tag registry:2.6.1 ttg12:5000/registry:2.6.1
docker push ttg12:5000/registry:2.6.1

輸出相似以下:bash

The push refers to repository [ttg12:5000/registry]
423c48d36423: Pushed
cec8f96b3c39: Pushed
25acfcbca8c9: Pushed
05d392f56700: Pushed
2b0fb280b60d: Pushed
2.6.1: digest: sha256:988247ab20a6b83e57039bea439c37fa3f3b728e9f8aa720bbc381f24ec78db3 size: 1364

三. 增長自籤 ssl 證書

3.1 生成自簽證書

參考 ### 給Nginx配置一個自簽名的SSL證書.less

咱們假設域名爲 registry.faceless.com, 指向 IP 爲 Docker Registry 所在 host ttg12 的 IP 192.168.31.12. ssh

利用上面博文給出的腳本生成通配符自簽證書 *.faceless.com:測試

$ ls ~/.ssh/certs:/certs
-rwxr-xr-x  1 faceless  staff  1008 Jul 14 21:06 gencrt.sh
-rw-r--r--  1 faceless  staff   883 Jul 14 21:06 star.faceless.com.crt
-rw-r--r--  1 faceless  staff   668 Jul 14 21:06 star.faceless.com.csr
-rw-r--r--  1 faceless  staff   887 Jul 14 21:06 star.faceless.com.key
-rw-r--r--  1 faceless  staff   963 Jul 14 21:06 star.faceless.com.origin.key

3.2 用自簽證書啓動 Registry

參考 Run an externally-accessible registry 🔗

mkdir -p certs
docker container stop registry
docker run -d \
  --restart=always \
  --name dockerregistry \
  -v "$(HOME)"/.ssh/certs:/certs \
  -e REGISTRY_HTTP_ADDR=0.0.0.0:5443 \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/star.faceless.com.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/star.faceless.com.key \
  -p 443:443 \
  registry:2.6.1

完整的 docker-compose.yml 以下:

dockerregistry:
  image: registry:2.6.1
  privileged: false
  restart: always
  ports:
  - 5443:443
  - 5000:5000
  volumes:
  - /home/faceless/.ssh/certs:/certs
  - /data2/docker-registry/registry:/tmp/registry
  environment:
  - REGISTRY_HTTP_TLS_KEY=/certs/star.faceless.com.key
  - REGISTRY_HTTP_ADDR=0.0.0.0:443
  - REGISTRY_HTTP_TLS_CERTIFICATE=/certs/star.faceless.com.crt

3.3 訪問使用自簽證書的 Registry

參考 Use self-signed certificates.

如今在主機 ttg12 上來驗證一下, push 一個鏡像到註冊中心. 首先須要將上面生成的證書star.faceless.com.crt複製並重名到本主機 /etc/docker/certs.d/registry.faceless.com:5443/ca.crt. :

# 複製證書到 /etc/docker/certs.d/registry.faceless.com:5443/ca.crt
faceless@ttg12:~/.ssh/certs$ sudo mkdir -p /etc/docker/certs.d/registry.faceless.com:5443/
faceless@ttg12:~/.ssh/certs$ sudo cp star.faceless.com.crt /etc/docker/certs.d/registry.faceless.com:5443/ca.crt
# 先 tag 而後 push 一個鏡像到註冊中心
faceless@ttg12:~/.ssh/certs$ docker tag nginx:alpine registry.faceless.com:5443/nginx:alpine
faceless@ttg12:~/.ssh/certs$ docker push registry.faceless.com:5443/nginx:alpine
The push refers to repository [registry.faceless.com:5443/nginx]
a181cbf898a0: Pushed
570fc47f2558: Pushed
5d17421f1571: Pushed
7bb2a9d37337: Pushed
3e207b409db3: Pushed
alpine: digest: sha256:ee5a9b68e8d4a4b8b48318ff08ad5489bd1ce52b357bf48c511968a302bc347b size: 1360

如今再從另一臺主機 ttg13 上訪問註冊中心, 一樣須要先將上面生成的證書star.faceless.com.crt傳輸到 ttg13 並複製到本主機 /etc/docker/certs.d/registry.faceless.com:5443/ca.crt.

faceless@ttg13:~$ sudo docker pull registry.faceless.com:5443/nginx:alpine
alpine: Pulling from nginx
cbdbe7a5bc2a: Pull complete
10c113fb0c77: Pull complete
9ba64393807b: Pull complete
262f9908119d: Pull complete
c4a057508f96: Pull complete
Digest: sha256:ee5a9b68e8d4a4b8b48318ff08ad5489bd1ce52b357bf48c511968a302bc347b
Status: Downloaded newer image for registry.faceless.com:5443/nginx:alpine
registry.faceless.com:5443/nginx:alpine

四. 給 Registry 增長權限驗證

參考 Authenticate proxy with nginx

相關文章
相關標籤/搜索