應用背景
在企業應用Docker規劃初期配置非安全鏡像倉庫時,有時會遺漏一些倉庫沒配置,但此時應用程序已經在Docker平臺上部署起來了,體量越大就越不會讓人去直接重啓Docker。
那麼,不重啓Docker能添加自籤SSL證書鏡像倉庫嗎?
可以,在文中會找到答案。
實現思路
實現思路來自Docker官網(https://docs.docker.com/registry/insecure/),大意是通過複製鏡像倉庫的自簽證書到操作系統目錄,或者到docker的配置目錄中。這樣就可實現不重啓使用該倉庫了。
這裏有個問題是:“某些情況下,例如鏡像倉庫不是我們搭建的 或 拿不到證書,這時候怎麼辦?”
基於命令是可以拿得到的
實現方式
命令行
通過openssl輸出X.509證書到docker證書目錄中實現需求。
# 創建鏡像倉庫證書目錄,xxx.com.cn需替換爲鏡像倉庫域名,如端口非443則需要追加:port
mkdir -p /etc/docker/certs.d/xxx.com.cn
# 使用openssl獲取鏡像倉庫的X.509證書,寫入剛創建目錄下文件中,如端口非443則需替換
echo -n | openssl s_client -connect xxx.com.cn:443 2>/dev/null | openssl x509 > /etc/docker/certs.d/xxx.com.cn/ca.crt
# 測試登錄、拉取等操作
docker login xxx.com.cn
docker pull xxx.com.cn/somepath/nginx:latest
示例:
mkdir -p /etc/docker/certs.d/harbor.test.com.cn:5000
echo -n | openssl s_client -connect harbor.test.com.cn:5000 2>/dev/null | openssl x509 > /etc/docker/certs.d/harbor.test.com.cn:5000/ca.crt
docker login harbor.test.com.cn:5000
Shell腳本
cat > add-insecure-repo.sh <<EOF
#/bin/bash
if [ "\$1x" == "x" ]; then
echo "請輸入鏡像倉庫地址";
exit;
fi
REPO=\$1
#包含:443需去除
if [[ "\$1" =~ ":443" ]]; then
REPO=\${1%:443*}
fi
#包含https://需去除
if [[ "\$REPO" =~ "https://" ]]; then
REPO=\${REPO#*https://}
fi
mkdir -p /etc/docker/certs.d/\$REPO
#帶端口號的不加:443,不帶的需要加
if [[ "\$REPO" =~ ":" ]]; then
echo -n | openssl s_client -connect \$REPO 2>/dev/null | openssl x509 > /etc/docker/certs.d/\$REPO/ca.crt
else
echo -n | openssl s_client -connect \$REPO:443 2>/dev/null | openssl x509 > /etc/docker/certs.d/\$REPO/ca.crt
fi
EOF
# 執行示例
sh add-insecure-repo.sh harbor.test.com.cn:5000
寫作不易,如果有用就點個贊再走唄!~
參考: