這篇文章介紹如何搭建一個私有的Docker倉庫,包括配置證書和密碼認(rèn)證。
安裝
因為本身有docker環(huán)境,所以直接通過docker來安裝。
下載
下載registry的docker鏡像,點擊查看官方鏡像地址
$ docker pull registry # 這樣會使用官方docker鏡像庫,或者配置在/etc/docker/domain.json中的鏡像庫。也可以像下面這樣,直接指定下載庫。
$ docker pull registry.docker-cn.com/library/registry
配置數(shù)據(jù)存儲位置
配置存儲位置/var/lib/registry,通過-v指定。
$ docker run -d \
--restart=always \
--name registry \
-v data:/var/lib/registry \
registry
這樣就能夠通過:localhost:5000來push自己的鏡像了。
配置證書
生成證書
-
如果你自己的域名已經(jīng)有證書了,就下載下來會有兩個文件:
crt和pem,然后合并成一個crt:$ cat domain.crt intermediate-certificates.pem > certs/domain.crt -
如果沒有證書,可以自己通過
openssl生成,注意:master.mesos是自己的域名,我這里是因為mesosphere的主節(jié)點是這個域名,我就生成master.mesos對應(yīng)的證書。$ openssl req -new -SHA256 -newkey rsa:2048 -nodes -keyout master.mesos.key -out master.mesos.csr -subj "/C=CN/ST=Sichuan/L=Chengdu/O=/OU=/CN=master.mesos"
生成好了就會在當(dāng)前目錄下面有兩個文件:master.mesos.csr和master.mesos.key,我們最終是需要crt格式的證書,通過下面的方式轉(zhuǎn)換:
$ openssl x509 -req -in master.mesos.csr -signkey master.mesos.key -out domain.crt
現(xiàn)在在目錄下面就是三個文件:master.mesos.csr、master.mesos.key、domain.crt。
使用證書
生成好了domain.crt后,通過以下方式使用證書:
$ docker run -d \
--restart=always \
--name registry \
-v `pwd`/certs:/certs \
-e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
-p 443:443 \
registry
注意里面的證書目錄,不能配置錯了?,F(xiàn)在就能夠通過https訪問倉庫了。
密碼認(rèn)證
配置密碼認(rèn)證后,訪問倉庫必須通過輸入用戶名和密碼才行。
創(chuàng)建密碼文件
用戶名是testuser,密碼是testpassword
$ mkdir auth
$ docker run \
--entrypoint htpasswd \
registry:2 -Bbn testuser testpassword > auth/htpasswd
現(xiàn)在在當(dāng)前目錄下面會有一個auth目錄,目錄下面有一個密碼文件:htpasswd,文件內(nèi)容大概像這個:
[root@master auth]# cat htpasswd
testuser:$2y$05$pQC8s2X7.k0/yrRr6ksdfsdfsdlkxlkjskld235Im
[root@master auth]#
使用密碼
$ docker run -d \
-p 5000:5000 \
--restart=always \
--name registry \
-v `pwd`/auth:/auth \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
-v `pwd`/certs:/certs \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
registry
這樣使用docker倉庫的時候就需要先登錄:
$ docker login -u testuser -p testpassword localhost:5000
登錄后就可以同之前一樣推送和拉去鏡像了。
通過docker-compose來啟動
我比較喜歡使用docker-compose。完整的配置如下:
registry:
restart: always
container_name: registry
image: registry.docker-cn.com/library/registry
environment :
TZ : 'Asia/Shanghai'
REGISTRY_HTTP_TLS_KEY: /certs/domain.key
REGISTRY_HTTP_TLS_CERTIFICATE: /certs/domain.crt
REGISTRY_AUTH: htpasswd
REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
volumes:
- ./data/registry:/var/lib/registry
- ./conf/registry/auth:/auth
- ./conf/registry/certs:/certs
ports:
- 5000:5000
docker-compose所在目錄結(jié)構(gòu):
[root@master docker]# ls -al
總用量 12
drwxr-xr-x 5 root root 84 5月 30 11:00 .
dr-xr-x---. 15 root root 4096 5月 30 15:24 ..
drwxr-xr-x 4 root root 35 5月 8 17:52 conf
drwxr-xr-x 4 root root 35 5月 8 17:55 data
-rw-r--r-- 1 root root 815 5月 9 11:26 docker-compose.yml
目錄說明:
把
domain.crt放到./conf/registry/certs下
把htpasswd放到./conf/registry/certs下
倉庫數(shù)據(jù)在./data/registry目錄中
問題
1. 如果出現(xiàn)x509: certificate signed by unknown authority
解決方案:
$ mkdir -p /etc/docker/certs.d/master.mesos:5000 # `master.mesos`是自己的域名
$ 通過scp等方式拷貝之前生成的`domain.crt`到/etc/docker/certs.d/master.mesos:5000/ca.crt
注意:這個不是把domain.crt放到倉庫所在的機(jī)器上,而是在哪兒使用docker就應(yīng)該在這臺機(jī)器上配置這個證書。比如倉庫在A服務(wù)器,我在B服務(wù)器使用,這個配置操作應(yīng)該在B操作,同樣如果在A上也要操作也需要這樣做。
簡單的使用
$ docker login -u testuser -p testpassword master.mesos:5000
$ docker tag xxxx master.mesos:5000/library/java:8 # xxxx是docker鏡像,通過`docker images`查看
$ docker push master.mesos:5000/library/java:8
$ docker pull master.mesos:5000/library/java:8
docker tag這一步很重要,必須要是這種格式:master.mesos:5000(倉庫地址)+ 其他。
查看更多 > > >
不登高山,不知天之高也;不臨深溪,不知地之厚也
感謝指點、交流、喜歡