什么是仓库

Docker仓库是用来包含镜像的位置,Docker提供一个注册服务器(Register)来保存多个仓库,每个仓库又可以包含多个具备不同tag的镜像。
Docker运行中使用的默认仓库是Docker Hub公共仓库。

docker 公仓库账号密码 docker公共仓库_Docker


docker hub是docker公司维护的公共仓库,用户可以免费使用,也可以购买私有仓库。

docker 公仓库账号密码 docker公共仓库_私有仓库_02

docker hub公共仓库

首先在https://hub. docker. com/网站注册一个账号
(1)在docker hub上新建一个公共仓库,创建之后可以看到如下公共仓库

docker 公仓库账号密码 docker公共仓库_私有仓库_03

(2)登陆

docker 公仓库账号密码 docker公共仓库_docker 公仓库账号密码_04


查看信息

docker 公仓库账号密码 docker公共仓库_私有仓库_05


(3)将本地镜像上传至私有仓库

docker 公仓库账号密码 docker公共仓库_docker 公仓库账号密码_06


(4)docker hub上查看

docker 公仓库账号密码 docker公共仓库_私有仓库_07


(5)从私有仓库拉取并运行查看信息

拉取前先把本地创建的镜像删掉

docker 公仓库账号密码 docker公共仓库_docker 公仓库账号密码_08


(6)测试

docker 公仓库账号密码 docker公共仓库_Docker_09

Registry工作原理

docker 公仓库账号密码 docker公共仓库_私有仓库_10


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

Docker Registry有三个角色,分别是index、registry和registry client(1)index
负责并维护有关用户帐户、镜像的校验以及公共命名空间的信息。
Web UI
元数据存储
认证服务
符号化
(2)registry
是镜像和图表的仓库,它不具有本地数据库以及不提供用户认证,通过Index Auth service的Token的方式进行认证。
(3)Registry Client
Docker充当registry客户端来维护推送和拉取,以及客户端的授权。

docker 公仓库账号密码 docker公共仓库_私有仓库_11


docker 公仓库账号密码 docker公共仓库_Docker_12


docker 公仓库账号密码 docker公共仓库_私有仓库_13

搭建私有仓库

docker 公仓库账号密码 docker公共仓库_Docker_14


(1)拉取registry

docker 公仓库账号密码 docker公共仓库_私有仓库_15


(2)运行容器

运行前删除其他所有的容器

docker 公仓库账号密码 docker公共仓库_docker_16


(3)将本地镜像上传至私有仓库

本地镜像在命名时需要加上仓库的ip和端口

docker 公仓库账号密码 docker公共仓库_私有仓库_17


(4)尝试拉取刚刚上传的镜像

docker 公仓库账号密码 docker公共仓库_docker 公仓库账号密码_18


(5)安装tree,查看目录下的镜像数据

docker 公仓库账号密码 docker公共仓库_Docker_19


docker 公仓库账号密码 docker公共仓库_docker 公仓库账号密码_20


docker 公仓库账号密码 docker公共仓库_docker 公仓库账号密码_21

这样的库任何人都可以访问,这样不安全,下来我们要增加库的安全性

给私有仓库添加证书

(1)增加一台虚拟机serve2并配置

yum文件,依赖包,bridge.conf文件

docker 公仓库账号密码 docker公共仓库_docker_22


安装docker

docker 公仓库账号密码 docker公共仓库_Docker_23


使之生效后开启服务

docker 公仓库账号密码 docker公共仓库_docker 公仓库账号密码_24

安装bash可以用table补齐

docker 公仓库账号密码 docker公共仓库_Docker_25


(2)配置完成后在server2拉取

docker 公仓库账号密码 docker公共仓库_Docker_26

可以看到此时不行,需要https加密!!!

(3)可以明确指出不走加密,不推荐这种

docker 公仓库账号密码 docker公共仓库_Docker_27


还原

docker 公仓库账号密码 docker公共仓库_Docker_28

(4)给server1服务端生成证书,添加解析

docker 公仓库账号密码 docker公共仓库_私有仓库_29


docker 公仓库账号密码 docker公共仓库_私有仓库_30

(5)删除之前的registry仓库,也可以不用删除,起一个别的名字

docker 公仓库账号密码 docker公共仓库_docker 公仓库账号密码_31


(6)再次构建容器(私有仓库)

docker 公仓库账号密码 docker公共仓库_Docker_32


docker 公仓库账号密码 docker公共仓库_Docker_33


(7)创建证书存放目录,并复制证书

docker 公仓库账号密码 docker公共仓库_docker_34


(8)再次把本地镜像上传到刚刚建立的私有仓库里面

docker 公仓库账号密码 docker公共仓库_docker 公仓库账号密码_35


docker 公仓库账号密码 docker公共仓库_docker_36


docker 公仓库账号密码 docker公共仓库_docker 公仓库账号密码_37


(9)用另一台主机server2从server1的私有仓库上面拉取镜像

给server2上传一份证书

docker 公仓库账号密码 docker公共仓库_docker_38


拉取

docker 公仓库账号密码 docker公共仓库_docker 公仓库账号密码_39

配置用户权限 ,给证书加密

如果想要控制registry的使用权限,使其只有在登录用户名和密码之后才能使用的话
还需要做额外的设置,registry的用户名密码文件可以通过htpasswd来生成

docker 公仓库账号密码 docker公共仓库_docker 公仓库账号密码_40


(1)在服务端server1设置用户密码并查看

docker 公仓库账号密码 docker公共仓库_docker_41


(2)再次创建仓库

[root@server1 ~]# docker run -d \
> --restart=always \
> --name registry \
> -v "$(pwd)"/certs:/certs \
> -v "$(pwd)"/auth:/auth \
> -v /opt/registry:/var/lib/registry \
> -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 \
> -e "REGISTRY_AUTH=htpasswd" \
> -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
> -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd
> -p 443:443 \
>  registry

docker 公仓库账号密码 docker公共仓库_Docker_42

(3)准备上传本地镜像到私有仓库当中,先换标签

docker 公仓库账号密码 docker公共仓库_docker 公仓库账号密码_43


(4)登录加密仓库,并输入用户名和密码进行认证

docker 公仓库账号密码 docker公共仓库_私有仓库_44


(5)server2上登陆后拉取

docker 公仓库账号密码 docker公共仓库_Docker_45