在使用 K8S 和 Docker 進行快速 CI/CD 的過程當中咱們須要提交 Docker 鏡像. 在公有云上, 咱們可使用阿里雲鏡像服務. 但本地開發和測試環境, 若是使用阿里雲等公有云服務, 在速度和流量費用方面都須要考慮, 所以少不了私有化部署. 常見的私有化方案有2種:nginx
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
在 docker 所在機器編輯 (如沒有, 能夠新建) /etc/docker/daemon.json
(假設爲 Linux 系統):json
{ "insecure-registries" : ["ttg12:5000"] }
如今示例把 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
參考 ### 給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
參考 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
參考 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