分類
Docker 技術文章 最新文章

使用 Let’s Encrypt 建立 TLS 的 Docker Registry

筆者有在用 Docker 還有 k8s,因為有要從 k8s 上將映像檔 (image) 拉下來佈署的需求,所以有自建 docker registry:2。

因為自行建立的 docker registry 沒有支援 SSL(TLS),所以需要在 k8s 的主機中在 Docker 底下的 daemon.json 中加入:

{
  "insecure-registries" : ["registry.example.com:5000"]
}

才能在目的端將連線到自建的 Docker registry 把 Image 拉下來。但因為 k8s 具備擴充性,可以隨時加開主機,所以我不可能每一台機器都去改一次,因此研究如何在 Docker registry 中加入 TLS 連線,就不須上述設定,直接在 k8s 的 yaml 中指定自建的 docker regsitry 即可使用。

Let’s encrypt 憑證

如果你已經有憑證,可以跳過這段。

我們先用 let’s encrypt 簽署憑證,筆者是用 certbot 配合 DNS 驗證來取得憑證,如果你不想打指令的話,可以用 SSL for Free 來取得憑證。

Certbot

Certbot 就不多做介紹,我們透過 DNS 驗證的方式,指令 (請把 example.com 換成你的 docker registry 網址):

# certbot certonly --manual --preferred-challenges dns --domain example.com

[略]
(請把下列的 TXT 紀錄加到你的 DNS 紀錄裡面)
- - - - - - - - - - - - - -  - - - - - - - - - - - - -
Please deploy a DNS TXT record under the name
_acme-challenge.example.com with the following value:

-1LsPNYfEPu-lKQlcCIUWudsEwxecwETUA4-f9PbvSQPuto

Before continuing, verify the record is deployed.
- - - - - - -- - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue  
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! 
[略]

上方的指令會請你手動輸入 TXT 紀錄,如果你使用的是 Gandi.net 的網域名稱,並且使用 LiveDNS 名稱伺服器 (預設),您可以參考 使用自動驗證 DNS 紀錄 的方法。

完成後你會在 /etc/letsencrypt/live/example.com/ 中有 fullchain.pem、privkey.pem、cert.pem 與 chain.pem。

我們要用到的是 fullchain.pem (包含憑證與中繼憑證) 與 privkey.pem,但因為這幾個檔案預設是連結:

lrwxrwxrwx. 1 root root   36 Aug  6 13:01 cert.pem -> ../../archive/example.com/cert1.pem
lrwxrwxrwx. 1 root root   37 Aug  6 13:01 chain.pem -> ../../archive/example.com/chain1.pem
lrwxrwxrwx. 1 root root   41 Aug  6 13:01 fullchain.pem -> ../../archive/example.com/fullchain1.pem

而我們需要使用在 Docker 裡面,所以我們需要另存成實體檔案:

# cd /etc/letsencrypt/live/example.com
# cat fullchain.pem > pfullchain.pem
# cat privkey.pem > pprivkey.pem

Docker Registry + SSL (TLS)

憑證產生好之後,只要透過環境變數指定給 Docker Registry 即可:

# docker run -d \
  -p 5000:5000 \
  --restart=always \
  --name registry2 \
  -v /home/docker-storage:/var/lib/registry \
  -v /etc/letsencrypt/live/example.com:/certs \
  -e REGISTRY_HTTP_HOST=https://docker.example.com \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/pfullchain.pem \
  -e REGISTRY_HTTP_TLS_KEY=/certs/pprivkey.pem \
  registry:2

接只把你的 Image 打上 tag 就可以推送進去:

# docker tag image-hash example.com:5000/project:v1
# docker push example.com:5000/project:v1

參考資料

  • https://blog.csanchez.org/2017/05/23/docker-registry-with-lets-encrypt-certificate/
  • https://gist.github.com/PieterScheffers/63e4c2fd5553af8a35101b5e868a811e
  • https://gadelkareem.com/2018/10/23/deploy-a-docker-registry-with-letsencrypt-certificates-on-ubuntu-18-04/
  • https://gadelkareem.com/2018/10/23/deploy-a-docker-registry-with-letsencrypt-certificates-on-ubuntu-18-04/
  • https://docs.gandi.net
  • https://docs.docker.com/registry/deploying/

在〈使用 Let’s Encrypt 建立 TLS 的 Docker Registry〉中有 6 則留言

編輯 /etc/docker/daemon.json
把你的 docker registry server ip 放到 “insecure-registries” 中:

{ “insecure-registries” : [ “172.30.0.0/16” ], “data-root”: “/home/docker” }

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *