Docker仓库
- 一、什么是仓库?
- 二、Docker Hub仓库
- 三、Registry工作原理及仓库搭建
-
- 1.工作原理
- 2.配置镜像加速器
- 3.搭建私有仓库
- 四、添加证书加密功能
- 五、为仓库添加用户认证功能
一、什么是仓库?
- Docker 仓库是用来包含镜像的位置,Docker提供一个注册服务器(Register)来保存多个仓库,每个仓库又可以包含多个具备不同tag的镜像。
- Docker运行中使用的默认仓库是 Docker Hub 公共仓库。
二、Docker Hub仓库
docker hub是docker公司维护的公共仓库,用户可以免费使用,也可以购买私有仓库。
首先在https://hub.docker.com/网站注册一个账号
在docker hub上新建一个公共仓库
- 创建之后可以看到如下公共仓库
-
接下来要从docker主机上传镜像,首先需要登录:
[[email protected] ~]# docker login
Username: yakexi007
Password: <填写密码>
docker hub为了区分不同用户的同名镜像,要求镜像的格式是:[username]/xxx.tag
docker tag busybox:latest yakexi007/busybox:latest
-
上传镜像到docker hub
docker push yakexi007/busybox:latest
-
从docker hub拉取镜像
docker pull yakexi007/busybox:latest
-
删除本地镜像
docker rmi yakexi007/busybox:latest
- 删除docker hub中的镜像仓库
三、Registry工作原理及仓库搭建
1.工作原理
Registry是一个几种存放image并对外提供上传下载以及一系列API的服务。可以很容易和本地源代码以及远端Git服务的关系相对应。
Docker hub是Docker公司提供的一些存储镜像的空间,这部分空间是有限的。我们一般会自主建设Docker私有仓库Registry。
-
Docker Registry有三个角色,分别是index、registry和registry client
index:
负责并维护有关用户帐户、镜像的校验以及公共命名空间的信息。
Web UI
元数据存储
认证服务
符号化
registry:
是镜像和图表的仓库,它不具有本地数据库以及不提供用户认证,通过Index Auth service的Token的方式进行认证。
registry client:
Docker充当registry客户端来维护推送和拉取,以及客户端的授权。
index服务主要提供镜像索引以及用户认证的功能。当下载一个镜像的时候,首先会去index服务上做认证,然后查找镜像所在的registry的地址并放回给docker客户端,docker客户端再从registry下载镜像,在下载过程中 registry会去index校验客户端token的合法性,不同镜像可以保存在不同的registry服务上,其索引信息都放在index服务上。
-
情景A:
用户要获取并下载镜像
-
情景B:
用户要获取并下载镜像
-
情景C:
用户要从index或registry中删除镜像
2.配置镜像加速器
从docker hub上下载镜像的速度太慢,需要配置镜像加速器,这里以阿里云为例:(需要提前注册阿里云帐号)
配置docker daemon文件:
vim /etc/docker/daemon.json
\\\
{
"registry-mirrors": ["https://vo5twm71.mirror.aliyuncs.com"]
}
\\\
systemctl daemon-reload #重载docker服务
systemctl restart docker
3.搭建私有仓库
docker hub虽然方便,但是还是有限制
需要internet连接,速度慢
所有人都可以访问
由于安全原因企业不允许将镜像放到外网
好消息是docker公司已经将registry开源,我们可以快速构建企业私有仓库
网址: https://docs.docker.com/registry/deploying/
下载registry镜像tag标记,需要加上仓库的ip和端口然后上传到本地
docker pull registry #下载镜像
docker run -d -p 5000:5000 registry:2 #运行registry容器
docker tag game2048:latest localhost:5000/game2048:latest #标记镜像
docker push localhost:5000/game2048:latest #上传镜像到本地仓库需要加上ip和端口
拉取镜像
查看
上传
测试
测试成功,但是这个私有仓库任何人都可以访问不安全,我们需要为Docker仓库添加证书加密功能
四、添加证书加密功能
- 为Docker仓库添加证书加密功能
- 生成证书(域名westos.org要求在主机上有解析)
创建证书存放目录并生成证书
mkdir certs #创建证书目录
openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/westos.org.key -x509 -days 365 -out certs/westos.org.crt
证书生成时报错,原因是ssl版本太低的问题
我们需要用openssl11来生成证书,需要删掉原来的证书文件
下载本地安装包
lftp 172.25.254.111:/pub/docs/docker> mirror openssl11/
exit
cd openssl11/
yum install -y * #将目录中的openssl11的安装包全部安装
下载好openssl11之后创建加密认证的密钥
openssl11 req -newkey rsa:4096 -nodes -sha256 -keyout certs/westos.org.key -addext "subjectAltName = DNS:reg.westos.org" -x509 -days 365 -out certs/westos.org.crt
重新将证书拷贝到/etc/docker/certs.d/reg.westos.org/ca.crt
拷贝证书到docker主机
因为使用的是自签证书,客户端要与私有仓库通信,那么必须建立一个目录:/etc/docker/certs.d,在这个目录下建立签名的域名的目录,需要把私有仓库的证书拷贝到这个目录下
mkdir -p /etc/docker/certs.d/reg.westos.org
cp certs/westos.org.crt /etc/docker/certs.d/reg.westos.org/ca.crt
将域名reg.westos.org写在/etc/hosts解析文件中
标记重命名game2048并上传到本地的reg.westos.org仓库中
五、为仓库添加用户认证功能
(1)创建用户认证文件并安装相关支持软件
mkdir auth
yum install -y httpd-tools-2.4.6-88.el7.x86_64 #安装认证的软件
(2)添加用户admin
htpasswd -Bc auth/htpasswd admin
(3)删除之前的容器并重建,添加用户认证及密钥模块
运行registry容器
docker rm -f registry
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/westos.org.crt -e REGISTRY_HTTP_TLS_KEY=/certs/westos.org.key -p 443:443 registry # -v表示挂载
(4)在server2主机上拉取仓库镜像
server2主机应当安装docker,设置为开机启动,拷贝server1的证书ca.crt到server2已经安装docker的
报错了,说明需要身份验证
(5)server1进行身份认证后,再次上传镜像
登陆用户
上传镜像
上传成功
(6)server2再次拉取镜像
登陆用户admin 再次拉取
说明添加身份认证之后必须登陆用户之后才能拉取和上传镜像!