Docker(六)---docker公有、私有仓库的搭建

Docker(六)—docker公有、私有仓库的搭建

1.Docker 仓库

Docker仓库是用来包含镜像的位置,Docker提供一个注册服务器

(Register)来保存多个仓库,每个仓库又可以包含多个具备不同tag的镜像。

Docker运行中使用的默认仓库是Docker Hub公共仓库。
在这里插入图片描述

有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。
实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。

仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载
国内的公开仓库包括 Docker Pool等,可以提供大陆用户更稳定快速的访问

当然,用户也可以在本地网络内创建一个私有仓库
当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,
这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。

2.在Docker Hub上上传镜像

在这里插入图片描述
首先需要注册一个docker hub帐号:

访问https://hub.docker.com/

在这里插入图片描述
在这里插入图片描述
创建仓库:

填写仓库名---选择public---create

在这里插入图片描述
此时我们已经在官方的仓库中创建了一个仓库,下面我们可以上传镜像到仓库中:

登陆docker hub帐号:

docker login

在这里插入图片描述
登陆成功后会自动生成以下文件,在这里存储了docker hub中的用户名和信息:
在这里插入图片描述

上传镜像到docker hub:
先把镜像名改为用户名/镜像名的形式:

docker tag busybox nigar0518/busybox

上传:

docker push nigar0518/busybox

search搜索自己的用户名:

docker search nigar0518

可以看到nigar0518用户上传的镜像

3.Registry的工作原理

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

Docker Registry有三个角色,分别是index、registry和registryclient:

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

4.三个典型情景

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.搭建私有仓库

在集群服务时,需要允许哦嗯docker,如果此时还从外部镜像仓库中下载镜像,会十分缓慢

docker hub虽然方便,但是还是有限制:

  • 需要internet连接, 速度慢
  • 所有人都可以访问
  • 由于安全原因企业不允许将镜像放到外网
  • 好消息是docker公司已经将registry开源,我们可以快速构建企业私有仓库

私有仓库的优点:

  • 节省网络带宽,针对于每个镜像不用每个人都去中央仓库上面去下载,只需要从私有仓库中下载即可;
  • 提供镜像资源利用,针对于公司内部使用的镜像,推送到本地的私有仓库中,以供公司内部相关人员使用。目前Docker Registry已经升级到了v2,最新版的Docker已不再支持v1。Registry v2使用Go语言编写,在性能和安全性上做了很多优化,重新设计了镜像的存储格式。如果需要安装registry v2,只需下载registry:2.2即可。
  • Docker官方提供的工具docker-registry可以用于构建私有的镜像仓库

Docker 官方已经把仓库封装为镜像,直接通过启动容器就可以完成部署仓库

导入registry镜像:

docker search registry
docker pull registry
docker history registry:latest 

在这里插入图片描述
释放现在不用的数据卷:

docker volume ls
docker volume prune 
docker volume ls

在这里插入图片描述
基于镜像运行registry容器:

docker run -d --name registry -p 5000:5000 registry
docker ps

在这里插入图片描述
至此,仓库在本地已经架设完成了

在本地私有仓库中上传镜像:

docker images 

将本地镜像上传至私有仓库,本地镜像在命名时需要加上仓库的ip和端口:

docker tag nginx:v5 localhost:5000/nginx:v5
docker images 

在这里插入图片描述
上传:

docker push localhost:5000/nginx:v5 

测试从本地仓库能否拉取镜像:
删除现有的镜像:

docker rmi localhost:5000/nginx:v5 
docker rmi nigar0518/nginx:v5 

拉取:

docker pull localhost:5000/nginx:v5
docker images 

拉取成功!
在这里插入图片描述

docker inspect registry	#查看到容器挂载点

在这里插入图片描述

cd /var/lib/docker/volumes/aa2ac07a1537e919b2b921b23e13c686e6c0ded43a0fba1ed1a71b6aeab29883/_data
ls	#从本地仓库拉取的镜像保存在本地的这个目录中
du -sh

在这里插入图片描述

至此,私有仓库创建完成

那么我们如何让集群中的其他主机访问我们的私有仓库呢?

首先我们再打开一台虚拟机server2,安装好docker(server2也要能上网)

我们可以直接把server1中的资源传到server2上:

cd /etc/yum.repos.d/
scp docker-ce.repo root@172.25.254.2:/etc/yum.repos.d
cd
scp container-selinux-2.77-1.el7.noarch.rpm root@172.25.254.2:

在这里插入图片描述
在server2中:

yum install docker-ce container-selinux-2.77-1.el7.noarch.rpm -y
systemctl start docker
docker info

在这里插入图片描述
在这里插入图片描述

非加密的方式

查看本地的5000端口能否正常工作:

netstat -antlp | grep 5000

在server2上尝试拉取镜像:

docker pull 172.25.254.1:5000/nginx:v5

没有权限,仓库是被加密的。
在这里插入图片描述
非加密:

cd /etc/docker/
vim daemon.json
{
  "insecure-registries": ["reg.westos.org:5000"]
}

添加解析:

vim /etc/hosts
172.25.254.1 server1 reg.westos.org

在这里插入图片描述
重启容器:

systemctl daemon-reload
systemctl restart docker
docker pull reg.westos.org:5000/nginx:v5

拉取成功!
注意:再次拉取时要通过域名,而不是ip
在这里插入图片描述

加密的方式

为私有仓库创建加密及签名证书:

生成证书和key:

mkdir -p certs
openssl req \
>  -newkey rsa:4096 -nodes -sha256 -keyout certs/westos.org.key \
>  -x509 -days 365 -out certs/westos.org.crt

在这里插入图片描述
在本地添加解析:

vim /etc/hosts
172.25.254.1 server1 reg.westos.org

证书和key已经生成:

ls certs/

删除之前的仓库:

docker rm -f registry
docker volume prune 

在这里插入图片描述
构建私有仓库:

docker run -d \
> --name registry \
> -v "$(pwd)"/certs:/certs \
> -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 \
> -p 443:443 \
> registry
docker ps

在这里插入图片描述
删除非加密(在server2中):

rm -f daemon.json 
systemctl daemon-reload
systemctl restart docker

创建证书存放目录,存放证书:

mkdir /etc/docker/certs.d
cd /etc/docker/certs.d/
mkdir reg.westos.org
cd reg.westos.org/
cp ~/certs/westos.org.crt .
mv westos.org.crt ca.crt

在这里插入图片描述
上传镜像到私有仓库:

docker tag busybox:latest reg.westos.org/busybox
docker push reg.westos.org/busybox
cd /opt/registry/
ls	#我们上传的镜像存放在这个目录中(运行容器时指定的)

把证书传给server2:

cd /etc/docker/
scp -r certs.d/ server2:/etc/docker/ 

在这里插入图片描述
在server2中拉取镜像:

docker pull reg.westos.org/busybox

拉取成功
在这里插入图片描述

为docker仓库添加用户认证:
修改仓库地址(server2):

cd /etc/docker
vim daemon.json
{
  "registry-mirrors": ["https://reg.westos.org"]
}
systemctl daemon-reload
systemctl restart docker

创建用户认证存放目录:

cd /etc/docker
mkdir auth

添加用户:

docker run --rm --entrypoint htpasswd registry -Bbn nigar redhat > auth/htpasswd
ls auth/
docker run --rm --entrypoint htpasswd registry -Bbn admin redhat >> auth/htpasswd
cat auth/htpasswd 

删除之前的仓库:

docker rm -f registry
mv auth ~

在这里插入图片描述
再次创建仓库:

docker run -d --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 ps

在这里插入图片描述
登陆用户:

docker login reg.westos.org

上传:

docker tag rhel7:latest reg.westos.org/rhel
docker push reg.westos.org/rhel

在这里插入图片描述
在server2中拉取镜像:
拉取之前也要登陆:

docker login reg.westos.org
docker pull reg.westos.org/rhel

查看用户认证信息:

cat ~/.docker/config.json 

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值