1.什么是仓库?
- Docker 仓库是用来包含镜像的位置,Docker提供一个注册服务器 (Register)来保存多个仓库,每个仓库又可以包含多个具备不同tag 的镜像。
- Docker运行中使用的默认仓库是 Docker Hub 公共仓库。
2.docker hub
docker hub是docker公司维护的公共仓库,用户可以免费使用,也可以购买私有仓库。
- 首先在https://hub.docker.com/网站注册一个账号
- 在docker hub上新建一个公共仓库
- 创建之后可以看到如下公共仓库
- 接下来要从docker主机上传镜像,首先需要登录:
[root@server1 ~]# 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中的镜像仓库
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客户端来维护推送和拉取,以及客户端的授权。
- 情景A:用户要获取并下载镜像
- 情景B:用户要推送镜像到registry中。
- 情景C:用户要从index或registry中删除镜像。
4.配置镜像加速器
- 从docker hub上下载镜像的速度太慢,需要配置镜像加速器,这里以 阿里云为例:(需要提前注册阿里云帐号)
- 配置docker daemon文件:
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://vo5twm71.mirror.aliyuncs.com"]
}
- 重载docker服务:
systemctl daemon-reload
systemctl restart docker
5.搭建私有仓库
docker hub虽然方便,但是还是有限制
- 需要internet连接,速度慢
- 所有人都可以访问
- 由于安全原因企业不允许将镜像放到外网
好消息是docker公司已经将registry开源,我们可以快速构建企业私有仓库
具体步骤:
- 下载registry镜像
docker pull registry
- 运行registry容器
docker run -d --name registry -p 5000:5000 -v /opt/registry:/var/lib/registry registry
-
本地镜像在命名时需要加上仓库的ip和端口
-
上传镜像到本地仓库
docker tag nginx:latest localhost:5000/nginx:latest
- 上传镜像到本地仓库
docker push localhost:5000/nginx:latest
-
以上生成的仓库为本地仓库,远程主机不能访问,远程主机访问仓库需要通过加密认证
-
强制使用非加密认证的方式让远程主机访问仓库:(不安全)
在远程主机上:
vim /etc/docker/daemon.json
编辑:
{
"insecure-registries" : ["192.168.0.80:5000"]
}
systemctl restart docker
- 加密方式访问仓库需要做加密及认证
具体步骤如下: - 安装openssl11版本
yum install -y openssl11-libs-1.1.1k-2.el7.x86_64.rpm openssl11-1.1.1k-2.el7.x86_64.rpm
- 为docker仓库添加证书加密功能
- 生成证书(域名reg.westos.org要求在主机上有解析)
[root@server4 ~]# mkdir certs
[root@server4 ~]# 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
- 安装httpd-tools工具
yum install httpd-utils -y
- 创建认证文件及用户
创建用户RINGringrui和admin "追加创建第二个用户不用加 -c "
[root@server4 ~]# mkdir auth
[root@server4 ~]# htpasswd -Bc auth/htpasswd RINGringnrui
New password:
Re-type new password:
Adding password for user RINGringnrui
[root@server4 ~]# htpasswd -B auth/htpasswd admin
New password:
Re-type new password:
Adding password for user admin
- 创建加密文件
[root@server4 ~]# cd /etc/docker/
[root@server4 docker ]# mkdir certs.d
[root@server4 ~]# cd certs
[root@server4 certs]# mkdir reg.westos.org
[root@server4 certs]# cd reg.westos.org/
[root@server4 reg.westos.org]# cp /root/certs/westos.org.crt ca.crt
- 重建registry容器 ,[做加密以及认证]
[root@server4 ~]# docker run -d --name registry/
-p 443:443/
-v /opt/registry:/var/lib/registry/
-v /root/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 /root/auth:/auth/
-e "REGISTRY_AUTH=htpasswd"/
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm"/
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd/
registry
- 在docker主机(server1)上:
vim /etc/docker/daemon.json
编辑:
{
"registry-mirrors" : ["https://reg.westos.org"]
}
systemctl restart docker
- 将证书拷贝到docker主机上:
[root@server4 ~]# scp -r /etc/docker/certs.d/ server1:/etc/docker/
root@server1's password:
ca.crt 100% 2163 2.3MB/s 00:00
- docker 主机认证
docker login reg.westos.org
6.harbor仓库
- 软件下载:https://githhub.com/goharbor/harbor/releases
- 部署: (依赖性 17.06.0-ce+ and docker-compose 1.18.0+)
- 下载并解压harbor软件包
[root@server4 ~]# tar zxf harbor-offline-installer-v2.5.0.tgz
[root@server4 ~]# cd harbor/
- 修该harbor配置文件相关信息
[root@server4 harbor]# cp harbor.yml.tmpl harbor.yml
[root@server4 harbor]# vim harbor.yml
- 下载docker-compose软件
[root@server4 ~]# mv docker-compose-linux-x86_64-v2.5.0 /usr/local/bin/docker-compose
[root@server4 ~]# chmod +x /usr/local/bin/docker-compose
- 创建证书文件(复制之前创建的证书即可)
[root@server4 ~]# mv certs/ /data/
- 执行harbor配置文件相关脚本
[root@server4 harbor]# ./install.sh --with-chartmuseum
- 由于之前实验生成的registry容器与执行该脚本生成的registry容器名称冲突,因此需要删除之前建立的registry容器
[root@server4 harbor]# docker rm -f registry
registry
再次执行上面的脚本,执行成功!
- 启动harbor仓库
[root@server4 harbor]# docker-compose up -d
- 在浏览器登录harbor仓库
- harbor仓库创建成功!!!
- 从windows导入镜像
docker load -i 镜像名称
- 标记镜像到harbor仓库指定位置
[root@server4 ~]# docker tag ikubernetes/myapp:v1 reg.westos.org/library/myapp:v1
- 上传镜像
[root@server4 ~]# docker push reg.westos.org/library/myapp:v1