背景
我們知道Harbor是用來存儲docker鏡像的倉庫系統。目前docker從鏡像倉庫pull或push鏡像都是採用https形式的(例如官方的Docker hub),故有必要將Harbor配置成https訪問,並使其他Docker機器能成功推送、拉取鏡像。
步驟
關於Harbor配置https的文檔官方有非常詳盡的說明。這裏主要對一些我遇到的問題做一個補充。
因我這裏配置Harbor的機器沒有申請到域名,故只能採用Harbor主機IP代替,假設IP爲:10.34.56.78。
1. 生成證書
在10.34.56.78的機器目錄下新建文件夾例如叫ca_files(絕對路徑假設爲/home/usr/ca_files),然後在該目錄下依照官方文檔步驟生成證書(下面每個命令以###隔開):
mkdir ca_files
###
cd ca_files
###
openssl genrsa -out ca.key 4096
###
openssl req -x509 -new -nodes -sha512 -days 3650 -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=10.34.56.78" -key ca.key -out ca.crt
上面的命令運行完後,可以看到在ca_files下生成了ca.key、ca.crt兩個文件,繼續運行如下命令來生成私鑰:
openssl genrsa -out 10.34.56.78.key 4096
###
openssl req -sha512 -new -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=10.34.56.78" -key 10.34.56.78.key -out 10.34.56.78.csr
上面命令運行完後可以看到在ca_files下繼續生成了10.34.56.78.key、10.34.56.78.csr兩個文件。
接着生成一個v3.ext文件並使用這個文件來獲取認證,命令如下:
cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = IP:10.34.56.78
EOF
###
openssl x509 -req -sha512 -days 3650 -extfile v3.ext -CA ca.crt -CAkey ca.key -CAcreateserial -in 10.34.56.78.csr -out 10.34.56.78.crt
不出意外又會在ca_files文件夾下生成一些文件.這裏要注意,上面第一個命令中的:subjectAltName = IP:10.34.56.78 這一行與官方文檔中有些不同,因爲我們這裏沒有申請域名,所以直接以IP指定。
2. 配置Harbor
假設我這裏在10.34.56.78機器上安裝Harbor的絕對路徑爲/home/usr/harbor,則在harbor目錄下找到 harbor.yml 文件(我這裏Harbor安裝的版本爲v1.10.1)進行編輯:
# https related config
https:
# https port for harbor, default is 443
port: 443
# The path of cert and key files for nginx
# 注意這裏配置證書路徑
certificate: /home/usr/ca_files/10.34.56.78.crt
private_key: /home/usr/ca_files/10.34.56.78.key
配置完成後,若Harbor還沒有安裝,則直接在harbor目錄下運行:
sudo ./install.sh
若Harbor已安裝過,則在harbor目錄下運行如下命令:
sudo ./prepare
###
docker-compose down -v
###
docker-compose up -d
此時,若沒有報錯,則Harbor已經變成https訪問了。
3. 在其他機器上docker login Harbor
假設我有另一臺機器(IP爲:12.34.56.78),這臺機器已配置完docker環境,並且我已經做好了一個docker的image,假設image名爲:my_nginx:v1.0。
這時,爲了使該機器能“docker login 10.34.56.78”成功,我們還需要做一些配置。首先在12.34.56.78機器上創建一個文件夾(例如名爲:my_ca,絕對路徑是:/home/me/my_ca),然後將10.34.56.78機器(即Harbor部署的主機)的ca_files文件夾下的:10.34.56.78.crt、10.34.56.78.key、ca.crt這三個文件拷貝到my_ca目錄下。
拷貝完成後,進入到my_ca目錄下,運行如下命令:
openssl x509 -inform PEM -in 10.34.56.78.crt -out 10.34.56.78.cert
可以看到my_ca目錄下新生成了10.34.56.78.cert這個文件。
下面我們需要在12.34.56.78這臺機器的/etc/docker/目錄下創建一對父子文件夾(certs.d/10.34.56.78),命令如下:
mkdir –p /etc/docker/certs.d/10.34.56.78
創建完後成,我們將my_ca目錄下的一些文件拷貝到certs.d/10.34.56.78目錄下,即:
cd /home/me/my_ca/
###
cp 10.34.56.78.cert /etc/docker/certs.d/10.34.56.78/
###
cp 10.34.56.78.key /etc/docker/certs.d/10.34.56.78/
###
cp ca.crt /etc/docker/certs.d/10.34.56.78/
接着重啓docker服務:
systemctl restart docker
上面的操作進行完後,我們就能在12.34.56.78這臺機器上 docker login 10.34.56.78 並推送“my_nginx:v1.0”這個image了。
例如在Harbor系統網站內建立一個名爲test的項目,則推送image到該項目下的命令爲:
docker tag my_nginx:v1.0 10.34.56.78/test/my_nginx:v1.0
docker push 10.34.56.78/test/my_nginx:v1.0