docker hub是docker公司维护的公共仓库,用户可以免费使用,也可以购买私有仓库。
首先在docker hub 官网网站注册一个账号
在docker hub上新建一个公共仓库
接下来要从docker主机上传镜像,首先需要登录:
[root@server1 sysctl.d]# docker loginLogin with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.Username: 852791073Password:
docker hub为了区分不同用户的同名镜像,要求镜像的格式是:[username]/xxx.tag
[root@server1 ~]# docker tag webserver:v1 852791073/webserver:latest ## 我们将之前最好的nginx镜像上传[root@server1 ~]# docker push 852791073/webserver:latest
我们在dockerhub上已经成功看到刚才我们上传的webserver了
3.registry工作原理
一次docker pull 或 push背后发生的事情
index服务主要提供镜像索引以及用户认证的功能。当下载一个镜像的时候,首先会去index服务上做认证,然后查找镜像所在的registry的地址并放回给docker客户端,docker客户端再从registry下载镜像,在下载过程中 registry会去index校验客户端token的合法性,不同镜像可以保存在不同的registry服务上,其索引信息都放在index服务上。
Docker Registry有三个角色,分别是index、registry和registry client。
index负责并维护有关用户帐户、镜像的校验以及公共命名空间的信息。
Web UI
元数据存储
认证服务
符号化registry
是镜像和图表的仓库,它不具有本地数据库以及不提供用户认证,通过Index Auth service的Token的方式进行认证。Registry Client
Docker充当registry客户端来维护推送和拉取,以及客户端的授权。
二、搭建私有仓库
docker hub虽然方便,但是还是有限制
需要internet连接,速度慢
所有人都可以访问
由于安全原因企业不允许将镜像放到外网
好消息是docker公司已经将registry开源,我们可以快速构建企业私有仓库
1.下载registry镜像
[root@server1 nginx]# docker pull registry[root@server1 nginx]# docker images registry[root@server1 nginx]# docker history registry:latest
我们看到registry的端口是5000,数据卷是/var/lib/registry 所以我们需要做端口映射,把数据卷指定挂载到宿主机
2.端口映射
[root@server1 nginx]# docker run -d --name registry -p 5000:5000 -v /opt/registry:/var/lib/registry registry将本地的镜像上传到仓库[root@server1 registry]# docker tag yakexi007/game2048 localhost:5000/game2048:latest ## 改名[root@server1 registry]# docker push localhost:5000/game2048
查看是否上传成功
[root@server1 registry]# curl localhost:5000/v2/_catalog
5.为Docker仓库添加证书加密功能
链接:参考docker参考文档
实验环境,这里我们需要重新开一台虚拟机。server2,并且下载docker
我们测试从远端拉取我们上传的镜像,发现拉取不到,这是没有相应的注册信息
1.部署普通的HTTP注册表
编辑daemon.json文件,其默认位置 /etc/docker/daemon.json , 重新启动Docker以使更改生效。
[root@server2 ~]# cd /etc/docker/[root@server2 docker]# vim daemon.json{ "insecure-registries" : ["myregistrydomain.com:5000"]}[root@server2 docker]# systemctl reload docker.service
这是我们再次尝试拉取,成功拉取
[root@server2 docker]# docker pull 172.25.1.1:5000/webserver
2.使用自签名证书
使用自签名证书,这比不安全的注册表解决方案更安全
这里还需要将刚才编写的注册巍峨文件删除
[root@server2 docker]# rm -fr daemon.json
生成自己的证书 [root@server1 ~]# mkdir -p certs[root@server1 ~]# openssl req \> -newkey rsa:4096 -nodes -sha256 -keyout certs/westos.org.key \> -x509 -days 365 -out certs/westos.org.crt
生成证书(域名westos.org要求在主机上有解析)
如果注册表当前正在运行,请停止它。
[root@server1 ~]# docker stop registry[root@server1 ~]# docker rm registry
参考:官方文档
[root@server1 ~]# vim /etc/hosts ##加上reg.westos.org解析 ,server2相同将westos.org..crt文件复制到 /etc/docker/certs.d/reg.westos.org/ca.crt每个Docker主机上。您无需重启Docker。[root@server1 ~]# mkdir /etc/docker/certs.d/reg.westos.org -p[root@server2 ~]# mkdir /etc/docker/certs.d/reg.westos.org -p[root@server1 ~]# cp certs/westos.org.crt /etc/docker/certs.d/reg.westos.org/ca.crt拷贝证书到其他docker主机[root@server1 ~]# cd /etc/docker/certs.d/reg.westos.org/[root@server1 reg.westos.org]# scp ca.crt server2:/etc/docker/certs.d/reg.westos.org/重新启动注册表,将其定向为使用TLS证书。此命令将certs/目录绑定安装到容器中的/certs/,并设置环境变量,该变量告诉容器在何处找到domain.crt anddomain.key文件。注册表在端口443(默认的HTTPS端口)上运行。[root@server1 ~]# docker run -d --name registry -p 443:443 -v /opt/registry:/var/lib/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 registry
测试:
server1上传,server2下载
[root@server1 ~]# docker tag busybox:latest reg.westos.org/busybox:latest[root@server1 ~]# docker push reg.westos.org/busybox:latest[root@server2 ~]# docker pull reg.westos.org/busybox:latest
3.本地基本身份验证
实现访问限制的最简单方法是通过基本身份验证(这与其他Web服务器的基本身份验证机制非常相似)。本示例使用本机基本身份验证htpasswd来存储机密。
参考:https://docs.docker.com/registry/deploying/#get-a-certificate
创建一个密码文件
[root@server1 ~]# yum install -y httpd-tools[root@server1 ~]# mkdir auth[root@server1 ~]# htpasswd -B -c auth/htpasswd sun[root@server1 ~]# docker rm -f registry ## 停止注册表。[root@server1 ~]# docker run -d --name registry -p 443:443 -v /opt/registry:/var/lib/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 -v "$(pwd)"/auth:/auth -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd registry## 使用基本身份验证启动注册表。
注意路径问题
测试上传镜像
[root@server1 ~]# docker tag mario:latest reg.westos.org/mario:latest[root@server1 ~]# docker push reg.westos.org/mario:latest
我们发现没有认证,所以不能上传。
尝试从注册表中提取镜像,或将图像推入仓库。这些命令都是失败的。
需要登录到注册表。
[root@server1 ~]# docker login reg.westos.org
再次尝试上传,显示上传成功。
尝试远端拉取镜像,显示失败,没有认证信息。
[root@server2 ~]# docker pull reg.westos.org/mario
登陆
[root@server2 ~]# docker login reg.westos.orgUsername: sunPassword: [root@server2 ~]# docker pull reg.westos.org/mario
二、harbor仓库
软件下载:harbor-offline
部署:(依赖性 docker 17.06.0-ce+ and docker-compose 1.18.0+)
链接: harbor-offline-install提取码: 2azb
1.软件下载
[root@server1 ~]# tar zxf harbor-offline-installer-v1.10.1.tgz [root@server1 ~]# cd harbor/[root@server1 harbor]# mv docker-compose-Linux-x86_64-1.27.0 /usr/local/bin/docker-compose[root@server1 harbor]# chmod +x /usr/local/bin/docker-compose[root@server1 harbor]# docker rm -f registry[root@server1 ~]# cp -r certs/ / ##因为下面配置文件里我选择了放在/下,所以这里将证书复制到根下了。
2.修改配置信息
[root@server1 harbor]# vim harbor.yml ## 修改内容如下hostname: reg.westos.org certificate: /certs/westos.org.crt private_key: /certs/westos.org.keyharbor_admin_password: westos
[root@server1 harbor]# ./install.sh ##进入默认,不加任何选项
[root@server1 harbor]# docker-compose ps[root@server1 harbor]# docker ps
3.登陆到web页面
推送的路径查看
4.重新获取认证
[root@server1 harbor]# docker logout reg.westos.orgRemoving login credentials for reg.westos.org[root@server1 harbor]# docker login reg.westos.orgUsername: adminPassword: 此处账号密码和配置文件中相同,就是登陆web页面的账号密码。
5.上传镜像
[root@server1 harbor]# docker tag mario:latest reg.westos.org/library/mario:latest[root@server1 harbor]# docker push reg.westos.org/library/mario:latest
到web页面查看是否上传成功
在远端拉取镜像时,我们可以直接指定我们的私有仓库进行下载,如果私有仓库中没有,再从网络上下载。
这里我们编辑一下文件
[root@server2 ~]# cd /etc/docker/[root@server2 docker]# vim daemon.json{ "registry-mirrors" : ["https://reg.westos.org"]}[root@server2 docker]# systemctl reload docker.service[root@server2 docker]# docker pull mario