Docker——仓库(如何构建一个私有仓库)

一、Docker仓库(registry)的定义

仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。
实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载
国内的公开仓库包括 Docker Pool等,可以提供大陆用户更稳定快速的访问 当然,用户也可以在本地网络内创建一个私有仓库
当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库 这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上pull 下来就可以了

但是,比如一些仅供公司内部使用的镜像,就需要我们自己构建属于自己的私有仓库了。

目前Docker Registry已经升级到了v2,最新版的Docker已不再支持v1。 Registry
v2使用Go语言编写,在性能和安全性上做了很多优化,重新设计了镜像的存储格式。 如果需要安装registry v2,只需下载registry:2.2即可。 Docker官方提供的工具docker-registry可以用于构建私有的镜像仓库。
在这里插入图片描述

二、仓库(Registry)的工作原理

在这里插入图片描述

Index服务主要提供镜像索引以及用户认证的功能
当下载一个镜像的时候,首先会去index服务上做认证,然后查找镜像所在的registry的地址并放回给docker客户端
docker客户端再从registry下载镜像,在下载过程中 registry会去index校验客户端token的合法性
不同镜像可以保存在不同的registry服务上,其索引信息都放在index服务上

模块功能
index负责并维护有关用户帐户、镜像的校验以及公共命名空间的信息
registry是镜像的仓库,通过Index Auth service的Token的方式进行认证
Registry ClientDocker充当registry客户端来维护推送和拉取,以及客户端的授权。

三、创建基于http的私有仓库

  • 1 从dockerhub上拉取仓库的镜像,上面说过了,Docker官方提供的工具docker-registry可以用于构建私有的镜像仓库。这是docker公司将自己的仓库开源了,方便大家使用。我们直接拉取一个最新的下来,这里需要配置镜像加速器,我这里使用的是阿里云的镜像加速器。
[root@server1 ~]# docker pull registry
Using default tag: latest
latest: Pulling from library/registry
Digest: sha256:8004747f1e8cd820a148fb7499d71a76d45ff66bac6a29129bfdbfdc0154d146
Status: Downloaded newer image for registry:latest
  • 2 基于官方提供的registry镜像运行容器
[root@server1 opt]# docker run -d --name registry -p 5000:5000 -v /opt/registry/:/var/lib/registry registry
fc08755bd54478545e80a05b131bb21bb20a351f6beb3483153cdd6f73629863
[root@server1 opt]# netstat -tnlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      666/sshd            
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      950/master          
tcp6       0      0 :::22                   :::*                    LISTEN      666/sshd            
tcp6       0      0 ::1:25                  :::*                    LISTEN      950/master          
tcp6       0      0 :::5000                 :::*                    LISTEN      1491/docker-proxy
  • 3 接下来,需要将想要上传的镜像打标签tag,目的是:说明你要上传到哪个仓库(ip或者域名),以及在该仓库中叫什么名的镜像。
[root@server1 opt]# docker tag nginx:v1 172.25.10.1:5000/nginx
[root@server1 opt]# docker images
REPOSITORY                      TAG                        IMAGE ID            CREATED             SIZE
172.25.10.1:5000/nginx          latest                     db5e27be7e42        2 days ago          25.1MB
nginx                           v1                         db5e27be7e42        2 days ago          25.1MB

可以看到,tag的作用相当于基于源镜像复制了一份,命名规则是仓库名(ip)/自定义镜像名

  • 4 将本地镜像上传至私有仓库
[root@server1 opt]# docker push 172.25.10.1:5000/nginx
The push refers to repository [172.25.10.1:5000/nginx]
Get https://172.25.10.1:5000/v2/: http: server gave HTTP response to HTTPS client

我们发现这里报错了,是因为,docker仓库默认上传是基于https的,因为我们这里暂时没有ssl认证的证书和key,所以我们需要修改一下,改为http方式。

  • 5 修改客户端上传仓库基于http
    这里需要进入到/etc/docker下,创建daemon.json指定其上传仓库和http的方式
{
        "registry-mirrors": ["https://pkfo3lsr.mirror.aliyuncs.com"],		#	阿里云加速器
        "insecure-registries": ["172.25.10.1:5000"]			# 以http方式上传到指定的仓库
}

记得重新加载daemon守护进程和重启docker生效。

[root@server1 opt]# systemctl daemon-reload 
[root@server1 opt]# systemctl restart docker
  • 6 再次尝试上传
[root@server1 opt]# docker push 172.25.10.1:5000/nginx
The push refers to repository [172.25.10.1:5000/nginx]
e2efc1ad613a: Layer already exists 
668afdbd4462: Layer already exists 
latest: digest: sha256:d9f0b8a2d6441220cac823e479f6f74185c6393fa5233bd3dbe347a30b36679a size: 739

成功!

  • 6 其他主机也可以通过http的方式上传到该仓库

server2安装docker客户端,修改/etc/docker/daemon.json配置文件,指定为http的方式上传。

[root@server2 ~]# vim /etc/docker/daemon.json 
写入:
{
"registry-mirrors": ["https://pkfo3lsr.mirror.aliyuncs.com"],
"insecure-registries": ["172.25.10.1:5000"]
}

[root@server2 ~]# systemctl daemon-reload 
[root@server2 ~]# systemctl restart docker

使用tag对本地镜像打标签:

[root@server2 ~]# docker tag busybox:latest 172.25.10.1:5000/newbusybosx
[root@server2 ~]# docker images
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
172.25.10.1:5000/newbusybosx   latest              db8ee88ad75f        2 weeks ago         1.22MB
busybox                        latest              db8ee88ad75f        2 weeks ago         1.22MB

上创至远程自己的私有仓库:

[root@server2 ~]# docker push 172.25.10.1:5000/newbusybosx
The push refers to repository [172.25.10.1:5000/newbusybosx]
0d315111b484: Pushed 
latest: digest: sha256:895ab622e92e18d6b461d671081757af7dbaa3b00e3e28e12505af7817f73649 size: 527
  • 7 在server1上可以看到我们上传的镜像:
[root@server1 repositories]# pwd
/opt/registry/docker/registry/v2/repositories
[root@server1 repositories]# ls
newbusybosx  nginx  nginx1

四、创建基于https的私有仓库并为私有仓库添加认证(auth)信息

当然,上面的http方式不安全,所以我们构建自己的私有仓库,最好使用https的方式构建,同时,我们使用auth登录的方式,双重保证安全性。

  • 1 创建服务端key以及证书,是为了给私有仓库生成证书和key
[root@server1 ~]# mkdir certs
[root@server1 ~]# cd certs/
[root@server1 ~]# openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/westos.org.key -x509 -days 365 -out certs/westos.org.crt
  • 2 域名westos.org要求在主机上有解析,添加本地解析。注意,上面生成证书时,要注意你写的servername是你这里要作解析的域名,要一一对应。
[root@server1 ~]# sed -n 4p /etc/hosts
172.25.10.1 server1 westos.org
  • 3 拷贝证书到docker客户端
[root@server1 ~]# cd certs/
[root@server1 certs]# ls
westos.org.crt  westos.org.key
[root@server1 docker]# mkdir -p certs.d/westos.org/
[root@server1 docker]# cd certs.d/westos.org/
[root@server1 westos.org]# pwd
/etc/docker/certs.d/westos.org
[root@server1 westos.org]# cp ~/certs/westos.org.crt ca.crt
[root@server1 westos.org]# ls
ca.crt
  • 4 在另一台server2主机:安装docker客户端,做好解析,将证书发给docker客户端,用于登陆认证。
[root@server1 westos.org]# scp -r /etc/docker/certs.d/ server2:/etc/docker/
  • 5 为Docker仓库添加用户认证功能,生成用户密码文件。
[root@server1 ~]# mkdir auth
[root@server1 ~]# docker run --rm --entrypoint htpasswd registry:2 -Bbn admin westos > auth/htpasswd
[root@server1 ~]# docker run --rm --entrypoint htpasswd registry:2 -Bbn zhang westos >> auth/htpasswd
[root@server1 ~]# cat auth/htpasswd 
  • 6 重建registry容器(可以netstat命令查看下,保证443端口没有被占用。同时删除之前的docker 容器,避免重名)
[root@server1 ~]# docker run -d \
> --restart=always \
> --name registry \
> -v /root/certs:/certs \
> -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
> -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/westos.org.crt \
> -e REGISTRY_HTTP_TLS_KEY=/certs/westos.org.key \
> -p 443:443 \
> -v /root/auth:/auth \
> -e "REGISTRY_AUTH=htpasswd" \
> -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
> -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
> registry:2

[root@server1 ~]# docker ps 
[root@server1 ~]# netstat -ntlp    #查看443端口有没有开启
[root@server1 ~]# docker history registry:2 
  • 7 docker客户端login,打tag镜像并上传
[root@server1 ~]# docker login westos.org
Authenticating with existing credentials...
Login did not succeed, error: Error response from daemon: login attempt to https://westos.org/v2/ failed with status: 401 Unauthorized
Username (admin): admin
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
[root@server1 ~]# docker tag busybox:latest westos.org/mybusybox
[root@server1 ~]# docker push westos.org/mybusybox
The push refers to repository [westos.org/mybusybox]
0d315111b484: Pushed 
latest: digest: sha256:895ab622e92e18d6b461d671081757af7dbaa3b00e3e28e12505af7817f73649 size: 527

此时,server2也可以拉取,因为我们server2也有证书,所以可以通过https的ssl协议。

[root@server2 ~]# docker logout westos.org		# 因为之前配置过http登陆,所以需要锡安退出登陆。
Removing login credentials for westos.org

[root@server2 ~]# docker login westos.org
Username: admin
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

登录成功后,现在从私有仓库拉取一个镜像

[root@server2 ~]# docker pull westos.org/mybusybox
Using default tag: latest
latest: Pulling from mybusybox
Digest: sha256:895ab622e92e18d6b461d671081757af7dbaa3b00e3e28e12505af7817f73649
Status: Downloaded newer image for westos.org/mybusybox:latest
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值