一、生成https通信需要的證書文件
這一步生成與倉庫進行https通信時需要的證書文件宿接,使用的工具是openssl
辕录,生成的過程如下:
文件 | 用途 |
---|---|
ca.key | ca私鑰文件 |
ca.csr | 根證書的簽發(fā)申請文件 |
ca.crt/ca.cer | 證書文件 |
ca.cnf | 約束根證書只用于簽發(fā)其他證書 |
site.key | 倉庫私鑰 |
site.csr | 倉庫證書簽發(fā)申請文件 |
site.crt/site.cer | 倉庫證書文件 |
site.cnf | 約束倉庫只用于服務(wù)器認證的配置文件 |
箭頭上的文字代表所使用的openssl子命令走诞,數(shù)字+“#”號表示步驟順序速梗。具體每一步使用的命令在下面有說明姻锁。
這個過程docker文檔中也有一個例子猜欺。不過它使用的Common Name是localhost,而我們的倉庫需要給其他機器訪問涧黄,需要修改為對應(yīng)的ip地址或者域名。
1懊昨、生成CA根證書
- 生成ca根證書秘鑰文件
ca.key
openssl genrsa -out "ca.key" 4096
- 生成根證書簽發(fā)申請文件
ca.csr
openssl req \ -new -key "ca.key" \ -out "ca.csr" -sha256 \ -subj '/C=US/ST=CA/L=San Francisco/O=Docker/CN=Swarm Secret Example CA'
- 創(chuàng)建根證書配置文件春宣,命名為
ca.cnf
[root_ca] basicConstraints = critical,CA:TRUE,pathlen:1 keyUsage = critical, nonRepudiation, cRLSign, keyCertSign subjectKeyIdentifier=hash
- 簽發(fā)根證書文件月帝,生成
ca.crt
openssl x509 -req -days 3650 -in "ca.csr" \ -signkey "ca.key" -sha256 -out "ca.crt" \ -extfile "ca.cnf" -extensions \ root_ca
2、生成倉庫服務(wù)器https通信證書
- 生成一個私鑰
site.key
openssl genrsa -out "site.key" 4096
- 生成服務(wù)器證書簽證申請文件
site.csr
openssl req -new -key "site.key" -out "site.csr" -sha256 \ -subj '/C=US/ST=CA/L=San Francisco/O=Docker/CN=localhost'
劃重點: 命令中的
localhost
需要替換為將來用于訪問倉庫的域名簿姨,例如:registry.local.com
扁位。 - 創(chuàng)建配置文件
site.cnf
[server] authorityKeyIdentifier=keyid,issuer basicConstraints = critical,CA:FALSE extendedKeyUsage=serverAuth keyUsage = critical, digitalSignature, keyEncipherment subjectAltName = DNS:localhost, IP:127.0.0.1 subjectKeyIdentifier=hash
劃重點:
localhost
和127.0.0.1
要換為倉庫的訪問域名和ip地址贤牛,例如:registry.local.com
和
192.168.10.100
则酝。 - 用根證書簽證服務(wù)器證書,生成
site.crt
證書文件openssl x509 -req -days 750 -in "site.csr" -sha256 \ -CA "ca.crt" -CAkey "ca.key" -CAcreateserial \ -out "site.crt" -extfile "site.cnf" -extensions server
二般卑、在運行倉庫的機器上運行官方倉庫鏡像library/registry
-
首先下載該鏡像
docker pull registry:2.6.2
-
運行
這里有三種方式:- container(
docker run
) - service(
docker service create
) - stack(
docker stack deploy
)
三種方式都可以蝠检,這里以stack為例挚瘟,其他兩種根據(jù)配置做對應(yīng)參數(shù)填充即可。具體參考官方CLI對應(yīng)命令的文檔焰檩。
但是運行之前订框,要先知道一個重要的文件,-
/etc/docker/registry/config.yml
這是倉庫程序的總配置文件国旷,是一個yml
格式的文本文件茫死,可以配置的項很多。具體可以配置的項以及每一項的說明可以在官方文檔找到特漩。
而這里我們需要配置的項有:# config.yml version: 0.1 storage: filesystem: rootdirectory: /var/lib/registry #鏡像文件存放目錄骨杂,這是默認值,不配置也可以蛤售,需要的可以自己修改 proxy: remoteurl: 上游倉庫訪問地址 # 所代理的倉庫悴能,也就是本地倉庫的上游倉庫 http: addr: 0.0.0.0:443 # 倉庫綁定的ip地址與端口號 tls: certificate: /certs/site.crt # 倉庫證書雳灾,就是上面我們用根證書簽證過的服務(wù)器證書 key: /certs/site.key # 倉庫私鑰,就是用于生成證書的私鑰(注意不是ca的私鑰)
劃重點: 注意這個配置文件中所有用到的文件和目錄都是從容器內(nèi)部訪問的炒嘲,所以連同這個配置文件本身都需要掛載進容器夫凸。
-
不過這個文件并不是必須的阱持,在配置文件中的每一項,都可以通過以一定規(guī)則命名的環(huán)境變量傳遞給容器來配置鸽扁,這個規(guī)則是镶骗,以
REGISTRY
開頭,之后按照配置文件的樹形結(jié)構(gòu),每一級通過下劃線_
連接,例如倉庫目錄的環(huán)境變量是:REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=/somewhere
如果有數(shù)組值即横,則后跟下劃線和索引如
_0
东囚,_1
…… -
現(xiàn)在以
stack
為例战授,寫一個compose
文件來啟動倉庫。# registry-compose.yml version: '3.3' services: registry: image: registry:2.6.2 deploy: replicas: 1 ports: - 443:443 volumes: - /your/path/to/config.yml:/etc/docker/registry/config.yml - /your/path/to/repository:/var/lib/registry - /your/path/to/certs:/certs
- container(
三份帐、配置客戶端docker
現(xiàn)在要去訪問私有倉庫還需要幾步
1废境、配置使用你的私有倉庫為鏡像筒繁,假設(shè)ip地址是192.168.10.100
,則訪問地址為
https://192.168.10.100
或者域名registry.local.com
https://registry.local.com
2驮宴、配置ca根證書
要把最開始用于簽證服務(wù)器ca根證書放置到/etc/docker/certs.d/ip地址或domain/
下呕缭,例如:
/etc/docker/certs.d/192.168.10.100/
劃重點: 由于我們使用https的默認端口號443去訪問,這里不需要添加端口號
192.168.10.100是一個文件夾落恼,下同佳谦。
如果配置倉庫鏡像地址時滋戳,使用了域名,這里也要對應(yīng)地用域名咪笑,總而言之娄涩,你用什么訪問就配置成什么映跟,目錄沒有的話自己創(chuàng)建
/etc/docker/certs.d/registry.local.com/
當然努隙,如果你把443映射為其他端口辜昵,也需要在文件夾名稱添加端口號
/etc/docker/certs.d/registry.local.com:5000/
如果你配錯了,會報這個錯誤
Error response from daemon: Get https://192.168.10.100/v2/: x509: certificate signed by unknown authority
四躬存、錯誤
- 生成證書時
site.cnf
文件寫錯舀锨,要指定為你用于訪問的域名和ip地址
Error response from daemon: Get https://192.168.10.100/v2/: x509: certificate is valid for 127.0.0.1, not 192.168.10.100
- 生成證書時沒有傳cnf文件
Error response from daemon: Get https://192.168.10.100/v2/: x509: cannot validate certificate for 192.168.10.100 because it doesn't contain any IP SANs