Docker推薦使用CA機構頒發的TLS(Transport Layer Security Protocol)證書來保護docker倉庫的安全,但是我們也可以選擇使用HTTP或者自簽名證書的方式實現本地私有倉庫的訪問。 本文將通過自簽名證書的方式實現本地私有倉庫的搭建。
使用自簽名的方式建立私有倉庫
使用環境
在不同的Docker版本或Linux系統上,部署的過程可能有差別,本文的測試環境為:
- Ubuntu15.10
- Docker 1.9.1
準備工作
- 為了方便測試,最好有兩臺機器,一臺作為私有倉庫主機(簡稱主機,用作映象倉庫),一臺作為客戶機(從主機下載映象)
- 客戶機和主機都已經已經安裝了Docker
- 主機已經安裝openssl(一般預設已經安裝)
- 主機的域名(domain),這裡以dev.leo.com為例
如果沒有獲得DNS能夠解析的域名,我們可以再客戶機的hosts檔案加上私有倉庫的主機名和IP的對映。如果已經有了,則忽略這一步。
~$ sudo vi /etc/hosts
#新增私有倉庫的主機名和IP對映, 主機名可以是任意的字串
192.168.16.160 dev.leo.com
給主機生成證書
#當前工作目錄為: ~ #建立一個目錄,存放生成的key和cert檔案 ~$ sudo mkdir -p cert #建立私鑰和證書 ~$ sudo openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/dev.leo.com.key -x509 -days 365 -out certs/dev.leo.com.crt Generating a 4096 bit RSA private key ... #省略不重要的資訊,以下資訊需要填寫,注意Common Name需要和主機名(domain)一致 Country Name (2 letter code) [AU]:CN State or Province Name (full name) [Some-State]:GD Locality Name (eg, city) []:GZ Organization Name (eg, company) [Internet Widgits Pty Ltd]:LEO Organizational Unit Name (eg, section) []:TECH Common Name (e.g. server FQDN or YOUR name) []:dev.leo.com Email Address []:
在主機上啟動支援https的repository容器
啟動registry:2映象的一個容器registry_https,如果本地沒有下載registry:2映象,那麼docker將自動下載。
~$ sudo docker run -d -p 5000:5000 --restart=always --name registry_https -v `pwd`/certs:/home/leo/certs -e REGISTRY_HTTP_TLS_CERTIFICATE=/home/leo/certs/dev.leo.com.crt -e REGISTRY_HTTP_TLS_KEY=/home/leo/certs/dev.leo.com.key registry:2
在客戶機上新增主機的CA證書
在客戶機的證書目錄下新增CA證書,因為我們使用自簽名證書,所以CA證書就是主機的證書。請注意證書所存放資料夾名稱要和倉庫映象的地址一致
~$ sudo cp ~/certs/dev.leo.com.crt /etc/docker/certs.d/dev.leo.com:5000/ca.crt #要重啟docker服務 ~$ service docker stop && service docker start
在客戶機上push/pull映象
~$ docker push dev.leo.com:5000/ubuntu ~$ docker pull dev.leo.com:5000/ubuntu
儲存對私有倉庫容器的更新
到目前為止,雖然已經將映象釋出到了容器,而且客戶機也已經可以通過pull命令獲取到該映象了。但是容器內部的資料在容器關閉後將會被銷燬,所以,最重要的步驟是還需要將容器的更新提交到倉庫映象。
#命令
~$ docker commit registry-container-name registry-image-name:tag
#例項
~$ docker commit registry-https leo-registry:0.1