如何使用TLS SSL證書在Linux上設置安全的Docker註冊表
如果要在企業的Docker註冊表中創建自定義映像,則關於託管Docker映像的位置有兩種選擇:
- Docker集線器 -此註冊表託管服務是免費的,由Docker Inc.提供。 他們還具有幾種企業級功能,您可以在其中為組織創建多個帳戶,設置自動構建等。
- 自包含的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