一、docker仓库
1.docker仓库简介
Docker 仓库是用来包含镜像的位置,Docker提供一个注册服务器(Register)来保存多个仓库,每个仓库又可以包含多个具备不同tag的镜像。 Docker运行中使用的默认仓库是 Docker Hub 公共仓库。
2.docker hub
 docker search 应用,可以看到该应用的官方仓库在哪里: 比如:docker info 
3.在官方注册账号并建立docker仓库
首先在https://hub.docker.com/网站注册一个账号 在docker hub上新建一个公共仓库   
 做完上述操作,刷新一下该页面,就能得到如下界面。
 并且在客户端也能搜得到: 
4.docker hub帐号的注销
docker logout #注销帐号  注意:login一次就好,上传的时候也只需要在login时认证一次,注销后需要重新认证。
5.docker hub镜像的删除

二、Registry 工作原理
一次docker pull 或 push背后发生的事情:  Docker Registry有三个角色,分别是index、registry和registry client。 (1)index 负责并维护有关用户帐户、镜像的校验以及公共命名空间的信息。 Web UI 元数据存储 认证服务 符号化 (2)registry 是镜像和图表的仓库,它不具有本地数据库以及不提供用户认证,通过Index Auth service的Token的方式进行认证。 (3)Registry Client Docker充当registry客户端来维护推送和拉取,以及客户端的授权。
  
三、镜像加速器
从docker hub上下载镜像的速度太慢,需要配置镜像加速器,这里以阿里云为例:(需要提前注册阿里云帐号)
整体操作思路如下: 配置docker daemon文件: vim /etc/docker/daemon.json { “registry-mirrors”: [“阿里云加速器地址”] } 重载docker服务: systemctl daemon-reload systemctl restart docker
(1)获取阿里云加速器地址    这里获得了阿里云的镜像加速器地址。
(2)修改daemon配置文件</etc/docker/daemon.json>来使用加速器
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://t5ajcuue.mirror.aliyuncs.com"]
}
(3)导入配置并重启服务
systemctl daemon-reload #重新导入daemon配置
systemctl restart docker #重启docker
docker info #查看docker信息
 测试:拉取zabbix镜像 明显感觉速度快很多。
四、搭建私有仓库
1.初级搭建
docker hub虽然方便,但是还是有限制 需要internet连接,速度慢 所有人都可以访问 由于安全原因企业不允许将镜像放到外网 好消息是docker公司已经将registry开源,我们可以快速构建企业私有仓库
具体搭建步骤如下: (1)下载registry镜像 docker pull registry  (2)运行registry容器 
docker run -d -p 5000:5000 --restart=always --name registry registry:latest
# -d 后台运行; -p 宿主机端口:容器端口; --restart=always 容器随docker自启动; --name 容器名称
 (3)上传镜像到本地仓库 本地镜像在命名时需要加上仓库的ip和端口
docker tag nginx:latest localhost:5000/nginx:latest
docker push localhost:5000/nginx:latest
docker tag : 标记本地镜像,将其归入某一仓库。
示例:将镜像ubuntu:15.10标记为 runoob/ubuntu:v3 镜像: docker tag ubuntu:15.10 runoob/ubuntu:v3
docker push : 将本地的镜像上传到镜像仓库,要先登陆到镜像仓库
示例:上传本地镜像myapache:v1到镜像仓库中:docker push myapache:v1
 上传后再次检查,发现已经上传到私有仓库 
2.docker私有仓库的优化
默认情况下私有仓库不需通过认证即可操作,因此很不安全,所以需要对私有仓库进行加密。 具体操作步骤如下:
(1)生成证书(域名westos.org要求在主机上有解析)
生成密钥时,对openssl的版本有要求,所以需要先升级openssl
yum install -y openssl11-1.1.1k-2.el7.x86_64.rpm openssl11-libs-1.1.1k-2.el7.x86_64.rpm
  应用证书功能到仓库:
先删除容器,并且删除容器创建的卷 
(2)重新运行容器:
docker run -d --restart=always --name registry -v /root/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 run -d \ #后台运行
--restart=always \ #跟随docker启动
--name registry \ #容器名称
-v /root/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检测证书时会从指定路径读取证书,因此需要将证书放在指定路径下,操作步骤如下:
#创建目录
[root@server1 ~]# mkdir -p /etc/docker/certs.d/reg.westos.org
[root@server1 ~]# cd certs/
[root@server1 certs]# ls
westos.org.crt westos.org.key
#复制证书
[root@server1 certs]# cp westos.org.crt /etc/docker/certs.d/reg.westos.org/ca.crt
#目录的名字“reg.westos.org”一定要和域名保持一致,docker引擎会自动识别
[root@server1 certs]#
[root@server1 certs]# ll /etc/docker/certs.d/reg.westos.org/ca.crt
-rw-r--r-- 1 root root 2159 Feb 18 13:14 /etc/docker/certs.d/reg.westos.org/ca.crt
证书复制完成后,重新上传镜像。在目录</opt/registry/docker/registry>下可以看到刚才上传的镜像,目录已经不再是空的了。
 应用认证功能到仓库:
[root@server1 ~]# docker rm -f registry #删除registry容器
[root@server1 ~]# mkdir auth #创建目录,用于存储认证信息
[root@server1 ~]# yum install -y httpd-tools #安装工具,用于生成密钥

创建用户并生成密钥/文件:
htpasswd -cB auth/htpasswd admin #创建用户admin
htpasswd -B auth/htpasswd zlw #创建用户zlw
(再次创建用户时不要添加参数-c,否则会覆盖之前的文件,只有第一次创建用户时需要添加参数c)

docker run -d --restart=always --name registry -v /root/certs:/certs -v /opt/registry:/var/lib/registry -v /root/auth:/auth -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd -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 run -d \ #后台运行
--restart=always \ #跟随docker启动
--name registry \ #容器名称
-v /root/certs:/certs \ #目录映射关系——宿主机目录:容器内目录
-v /opt/registry:/var/lib/registry \ #目录映射
-v /root/auth:/auth \ #用户认证功能的目录映射
-e "REGISTRY_AUTH=htpasswd" \ #指定用户密码
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm"
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd #指定用户密钥路径
-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 #镜像名称

curl -k https://reg.westos.org/v2/_catalog -u admin:westos #查看私有仓库的镜像

docker tag yakexi007/game2048:latest reg.westos.org/game2048:latest #修改镜像标签
docker push reg.westos.org/game2048:latest #上传镜像
88fca8ae768a: Preparing
6d7504772167: Preparing
192e9fad2abc: Preparing
36e9226e74f8: Preparing
011b303988d2: Preparing
no basic auth credentials
 直接上传镜像会显示用户认证失败。因为本次启动容器时开启了用户认证功能,所以需要先登录后才能上传镜像。 
|