registry私有仓库搭建

我的环境相关设置如下

环境:ubuntu 16.04

IP地址:10.78.115.167

docker版本:17.03.2~ce-0~ubuntu-xenial

一、无鉴权认证部署

部署之前有一个配置项需要注意:参考下文 三、遇到的问题  three


参考自: http://www.jb51.net/article/104545.htm

首先在10.78.115.167机器上下载registry镜像

$ docker pull registry 

下载完之后我们通过该镜像启动一个容器

$ docker run -d -p 5000:5000 --restart=always --name registry registry 

默认情况下,会将仓库存放于容器内的/tmp/registry目录下,这样如果容器被删除,则存放于容器中的镜像也会丢失,所以我们一般情况下会指定本地一个目录挂载到容器内的/tmp/registry下,我将/opt/data/registry目录挂载到/tmp/registry目录下,如果你本地没有这个目录需要新创建,同时需要给/opt/data/registry目录扩大权限

chmod +777 /opt/data/registry 

此处有坑:默认情况下是在容器内的/tmp/registry目录下,但是我的容器镜像是存放在容器中的/var/lib/registry  这个位置。
我是搭建完毕之后,上传一个镜像之后然后使用 find / -name ***查到的位置

[root@server01 ~]# docker run -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry 
55c60589cb0e2d094d5371c4dd650127cfeae1b361477d50cfe48552e6308830 

可以看到我们启动了一个容器,地址为:10.78.115.167:5000。

测试

接下来我们就要操作把一个本地镜像push到私有仓库中。首先在10.78.115.167机器下pull一个比较小的镜像来测试(此处使用的是busybox)

$ sudo docker pull busybox 

接下来修改一下该镜像的tag,镜像的格式为  镜像仓库IP:端口/镜像名称

$ sudo docker tag busybox 10.78.115.167:5000/busybox 

接下来把打了tag的镜像上传到私有仓库。

$ sudo docker push 10.211.55.30:5000/busybox 

可以看到push失败,具体错误如下:


因为Docker从1.3.X之后,与docker registry交互默认使用的是https,然而此处搭建的私有仓库只提供http服务,所以当与私有仓库交互时就会报上面的错误。为了解决这个问题需要在启动docker server时增加启动参数为默认使用http访问。
注意修改--incecure-registry参数。

ubuntu可配置/etc/docker/daemon.json
    "insecure-registries": ["10.78.115.167:5000"]


二、鉴权认证部署

参考:https://blog.youkuaiyun.com/wanghailong041/article/details/52162087

首先在10.78.115.167机器上下载registry镜像

$ docker pull registry 

1. 设置证书

   注:创建证书及生成鉴权镜像时,请在/etc/docker下

  • 创建自签证书(创建之前有一个配置项需要注意:参考三、遇到的问题   one
mkdir -p certs && openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key -x509 -days 365 -out certs/domain.crt
# Common Name (e.g. server FQDN or YOUR name) []:   一定要输入域名,也就是“myregistrydomain.com”
  • 客户端添加认证
将生产的domain.crt证书scp到每个机器的/etc/docker/certs.d/myregistrydomain.com:5000/ca.crt文件内
  • 重启docker服务
service docker restart

2. 设置registry访问控制

    注:创建密码文件及生成鉴权镜像时,请在/etc/docker下
  • 创建密码文件
mkdir auth
docker run --entrypoint htpasswd registry -Bbn hbt hbt > auth/htpasswd
# user=hbt、pwd=hbt
  • 创建registry( 创建之前有个配置项需要注意: 参照三、遇到的问题  three)
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
  • Login
docker login myregistrydomain.com:5000

三. 遇到的问题

one. cannot validate certificate for 192.168.2.107 because it doesn't contain any IP SANs      

参考:https://serverfault.com/questions/611120/failed-tls-handshake-does-not-contain-any-ip-sans

  1. 修改 /etc/ssl/openssl.cnf  在 subjectAltName = IP:192.168.2.107 in [v3_ca] section.

  2. Recreate the certificate

  3. Copy the cert and key to both hosts

two. docker: Error response from daemon: Get https://registry-1.docker.io/v2/: read tcp 10.78.115.167:48836->52.204.202.231:443: read: connection reset by peer.   


参考: https://docs.docker.com/install/linux/linux-postinstall/#specify-dns-servers-for-docker

$ sudo nano /etc/docker/daemon.json
{
"dns": ["8.8.8.8", "8.8.4.4", "your ip"]
}
$ sudo service docker restart


three. http: server gave HTTP response to HTTPS client  

可以看到push失败,具体错误如下:


因为Docker从1.3.X之后,与docker registry交互默认使用的是https,然而此处搭建的私有仓库只提供http服务,所以当与私有仓库交互时就会报上面的错误。为了解决这个问题需要在启动docker server时增加启动参数为默认使用http访问。
注意修改--incecure-registry参数。

ubuntu可配置/etc/docker/daemon.json
    "insecure-registries": ['registry address']



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值