这篇文章介绍如何搭建一个私有的Docker仓库,包括配置证书和密码认证。
安装
因为本身有docker环境,所以直接通过docker来安装。
下载
下载registry的docker镜像,点击查看官方镜像地址
$ docker pull registry # 这样会使用官方docker镜像库,或者配置在/etc/docker/domain.json中的镜像库。也可以像下面这样,直接指定下载库。$ docker pull registry.docker-cn.com/library/registry
配置数据存储位置
配置存储位置/var/lib/registry
,通过-v
指定。
$ docker run -d \ --restart=always \ --name registry \ -v data:/var/lib/registry \ registry
这样就能够通过:localhost:5000
来push自己的镜像了。
配置证书
生成证书
如果你自己的域名已经有证书了,就下载下来会有两个文件:
crt
和pem
,然后合并成一个crt:$ cat domain.crt intermediate-certificates.pem > certs/domain.crt
如果没有证书,可以自己通过
openssl
生成,注意:master.mesos
是自己的域名,我这里是因为mesosphere的主节点是这个域名,我就生成master.mesos
对应的证书。$ 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"
生成好了就会在当前目录下面有两个文件:master.mesos.csr
和master.mesos.key
,我们最终是需要crt
格式的证书,通过下面的方式转换:
$ openssl x509 -req -in master.mesos.csr -signkey master.mesos.key -out domain.crt
现在在目录下面就是三个文件: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
注意里面的证书目录,不能配置错了。现在就能够通过https访问仓库了。
密码认证
配置密码认证后,访问仓库必须通过输入用户名和密码才行。
创建密码文件
用户名是testuser
,密码是testpassword
$ mkdir auth$ docker run \ --entrypoint htpasswd \ registry:2 -Bbn testuser testpassword > auth/htpasswd
现在在当前目录下面会有一个auth目录,目录下面有一个密码文件:htpasswd
,文件内容大概像这个:
[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所在目录结构:
[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
下
仓库数据在./data/registry
目录中
问题
1. 如果出现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
放到仓库所在的机器上,而是在哪儿使用docker
就应该在这台机器上配置这个证书。比如仓库在A服务器,我在B服务器使用,这个配置操作应该在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
(仓库地址)+ 其他。
作者:Carltony
链接:https://www.jianshu.com/p/cdd80166ebd6