如何使用TLS SSL證書在Linux上設置安全的Docker註冊表

如果要在企業的Docker註冊表中創建自定義映像,則關於託管Docker映像的位置有兩種選擇:

  1. Docker集線器 -此註冊表託管服務是免費的,由Docker Inc.提供。 他們還具有幾種企業級功能,您可以在其中為組織創建多個帳戶,設置自動構建等。
  2. 自包含的Docker註冊表-您可以在組織中設置一個Docker註冊表來託管自己的映像。

本指南說明了如何設置安全的自行編寫的Docker註冊表。

1.設置TLS證書和密鑰

將現有證書和密鑰文件複製到〜/ docker-certs目錄。

# mkdir /root/docker-certs

# cd /root/docker-certs

# ls -1
andreyex.crt
andreyex.key
intermediateCA.pem

在此示例中,我使用的是證書文件andreyex.crt和為我的Apache Web服務器生成的文件andreyex.key。

有關如何創建自己的證書和密鑰文件的更多信息,請參考以下指南:如何使用Let’s Encrypt在Ubuntu上安裝SSL和SPDY證書。

2.中間證書文件的管理

在這種情況下,我還從CA獲得了Lets Ensrypt證書。

對於Docker註冊表,您必須將兩個證書和中間證書合併到同一證書文件中。

那些。 如下所示,將中間證書的內容添加到證書文件中。

cd /root/docker-certs

cat intermediateCA.pem >> andreyex.crt

3.運行您的安全註冊表Docker

現在如下所示啟動安全的Docker。

docker run -d -p 5000:5000 --restart=always --name registry 
  -v /root/docker-certs:/certs 
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/root/docker-certs/andreyex.crt 
  -e REGISTRY_HTTP_TLS_KEY=/root/docker-certs/andreyex.key 
  registry:2

在上面的命令中:

  • Docker註冊表開始在端口5000上工作
  • Docker容器名稱“註冊表”
  • 包含/ root / docker-cert證書的本地目錄在Docker註冊表容器內顯示為/ certs。
  • REGISTRY_HTTP_TLS_CERTIFICATE變量指向具有完整路徑的證書文件
  • REGISTRY_HTTP_TLS_KEY變量指向具有完整路徑的密鑰文件的名稱

啟動Docker註冊表後,您現在將看到一個正在運行的註冊表容器,如下所示:

# docker ps
CONTAINER ID  IMAGE       COMMAND                  CREATED         STATUS         PORTS                    NAMES
v347s8c5dest  registry:2  "/entrypoint.sh /etc/"   25 seconds ago  Up 1 seconds   0.0.0.0:5000->5000/tcp   registry

4.訪問安全的Docker註冊表

設置安全的Docker註冊表後,您可以從網絡上的其他服務器(或從外部)訪問它,並在其上使用所有標準Docker命令。

例如,您可以如下圖所示為該安全Docker註冊表推送或拉取映像。

docker pull andreyex.com:5000/mongodb

docker push andreyex.com:5000/mongodb

5.設置不安全的Docker註冊表

注意:如果您對Secure Docker Registry有任何問題,出於調試目的,請在沒有證書的情況下啟動註冊表,並查看其工作方式,如下所示:

docker run -d -p 5000:5000 --restart=always --name registry registry:2

當嘗試從Docker註冊表中顯示圖像(或執行其他任何操作)時,您可能會收到以下錯誤消息“接收到的記錄長度過大”。

例如,當我們在遠程服務器上(而不是在安裝了Docker註冊表的服務器上)運行以下命令時,我們收到以下錯誤消息:

# docker pull 192.168.51.1:5000/mongodb
Using default tag: latest
Error response from daemon: Get https://192.168.51.1:5000/v1/_ping: tls: oversized record received with length 20527

在這種情況下,192.168.51.1是運行安全docker註冊表的服務器(我們沒有安全證書)。

在這種情況下,必須在遠程服務器上允許註冊表中進行不安全的操作。 為此,必須將“ -insecure-registry”參數傳遞給DOCKER_OPTS環境變量。

在遠程服務器上,修改此文件並添加以下行:

vi /etc/default/docker
DOCKER_OPTS="--insecure-registry 192.168.101.1:5000"

現在在遠程服務器上重新啟動docker。

systemctl daemon-reload
systemctl stop docker
systemctl start docker

現在,由於存在不安全的註冊表調整選項,因此docker將pull(或任何其他docker命令)將正常運行。

docker pull 192.168.101.1:5000/mongodb

Sidebar