一、说明
registry是一个镜像,该镜像专门生成镜像仓库的容器,registry是基于http协议,那就是说,在单机、局域网、或者互联网上都可以建立registry数据仓库,存放自己构建的镜像。本篇专门介绍如何在本地单机上建立容器仓库。
至于在阿里云上推送镜像,参考:【docker概念和实践 4】(3)本地镜像提交到阿里云
二、准备一个自己的镜像
本节专门在单机上构建镜像仓库。采用registry镜像构建。下面将叙述本局的要点。
2.1 、实验前期工作
在实验实施前,需要做以下准备活动:
- 安装了docker-engine。
- pull了一个image,如ubuntu20.04作为被推拉的镜像。
- 对容器做一些操作,apt install net-tools
- commit转化成本地image
2.2 修改一个ubuntu容器
首先,在本地拉取一个ubuntu20.04镜像:
docker pull ubuntu:20.04
运行ubuntu20.04并进入容器:
docker run -it ubuntu:20.04 /bin/bash
在此ubuntu20.04内部,没有网络工具,因此安装它:
apt update
apt install net-tools
exit
此时,启动的ubuntu20.04镜像已经追加了网络工具(支持ifconfig命令)。
2.3 将容器转化成镜像
docker ps -a
将容器转化成镜像:
docker commit -a "Mr Smith" -m "this is ubuntu for ifconfig" c87c1de84192 myubuntu:1
此时,myubuntu:1镜像在本地docker-engine工作区生成。
docker images
以上实现了从镜像到容器再到镜像的转化过程。流程如下;
下面,我们将介绍如何将自己构建的myubuntu:1镜像推送到本地的仓库,下文我们将介绍如何构建自己的本地仓库。
三、搭建本地仓库registry并测试
3.1 实现步骤将如下
1 下载镜像Docker Registry |
2 运行私有库Registry,相当于本地有一个私有Docker hub |
3 案例演示创建立一个新镜像ubuntu,在容器安装ifconfig命令(见上面二节) |
4 curl验证私服库上有什么镜像 |
5 将新镜像修改成私有服务规范的Tag |
6 修改配置文件,使其支持http |
7 push将本地镜像推送到私服库中 |
8 curl验证私服库上有什么镜像 |
3.2 、挑选版本Registry:V1和V2
Docker Registry 2.0版本在安全性和性能上做了诸多优化,因此要优于1.6之版本。
这里不再介绍v1.6,直接推荐用v2版本。
3.3 宿主机环境介绍
明确以下项目:
宿主机项目 | 明细项 |
---|---|
操作系统 win10 | 虚拟机ubuntu18.04 |
网络地址 | 注意:这里的网络地址可不是win10下的IP地址,而是虚拟机下ifconfig获得的。 |
主机名称 | 主机名、或(localhost)、或ip地址,以上三个均可,也是指虚拟机ubuntu下获得。 |
3.4 拉取构建仓库的镜像registry
- 从云端(阿里云,或docker-hub)上拉取registry:2
docker pull registry:2
docker run -d -p 5000:5000 --name myreg registry:2
以上两句基本将仓库容器启动起来。容器本地查看:docker ps
- 配置私有仓库数据源
这一步至关重要,是配置当前的docker引擎,是从哪里提取镜像,这里有两个数据源:阿里云、本地仓库。
vim /ets/docker/daemon.json
{
"registry-mirrors": ["https://3005ts6m.mirror.aliyuncs.com"]
}
进入vim进行手工编辑,追加了"insecure-registries": ["192.168.131.137:5000"],这个ip地址是从宿主机上ifconfig得来。也就是localhost默认地址。
修改结果:
{
"registry-mirrors": ["https://3005ts6m.mirror.aliyuncs.com"],
"insecure-registries": ["192.168.131.137:5000"]
}
一般需要重启动docker:systemctl restart docker。
3.5 从本地推送镜像到本地registry仓库:
先查看本地引擎管辖的镜像表:
将上文中自己制作的myubuntu:1推送到本机的仓库,分两步走:
- 第一步:将镜像做成标准名称
[root@node1 ~]# docker tag myubuntu:1 localhost:5000/myubuntu
注意:
1)这一步是固定操作,凡是push提交必须作这种操作,就是将myubuntu:1做成一个固定提交格式。
2)其中的localhost可以是registry所在主机的ip地址。
检查执行结果,发现仅仅是多了一个 localhost:5000/myubuntu镜像:
第二步:推送该镜像到仓库
docker push localhost:5000/myubuntu
3.6 测试操作结果
值得一提的是,registry仓库是基于http协议,虽然在本地单机上查看它,也是需要用http的访问方法完成,查看语句是:
curl -XGET http://192.168.1.6:5000/v2/_catalog
可以看到myubuntu已经在仓库了。
尝试从本地registry中拉取 localhost:5000/my-ubuntu 镜像:
docker pull localhost:5000/myubuntu
成功拉取!说明安装成功。