云计算第二课

本文深入探讨了Docker镜像的概念,强调了分层结构带来的资源共享和效率提升。此外,详细介绍了如何建立和使用私有库Registry,包括下载、运行Registry、制作新镜像以及将镜像推送到私有仓库的步骤,强调了配置Docker支持HTTP的重要性。
摘要由CSDN通过智能技术生成

本节课学习了镜像云的发布,

镜像是什么

 镜像(Mirroring)是一种文件存储形式,是冗余的一种类型,一个磁盘上的数据在另一个磁盘上存在一个完全相同的副本即为镜像。可以把许多文件做成一个镜像文件,与GHOST等程序放在一个盘里用GHOST

对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供 rootfs 就行了。由此可见对于不同的linux发行版, bootfs基本是一致的, rootfs会有差别, 因此不同的发行版可以公用bootfs。

 

为什么 Docker 镜像要采用这种分层结构呢? 

镜像分层最大的一个好处就是共享资源,方便复制迁移,就是为了复用。

比如说有多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保存一份 base 镜像;同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。 

1.4.2重点理解

Docker镜像层都是只读的,容器层是可写的 当容器启动时,一个新的可写层被加载到镜像的顶部。 这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。

当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。(比如吃鸡蛋)

所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的。

GHOST等软件打开后,又恢复成许多文件,RAID 1和RAID 10使用的就是镜像。常见的镜像文件格式有ISO、BIN、IMG、TAO、DAO、CIF、FCD,镜像是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是image镜像文件。

 Docker镜像加载原理:

   docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。

bootfs(boot file system)主要包含bootloader(根加载)和kernel,bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是引导文件系统bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。

rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

Docker中的镜像分层,支持通过扩展现有镜像,创建新的镜像。类似Java继承于一个Base基础类,自己再按需扩展。

新镜像是从 base 镜像一层一层叠加生成的。每安装一个软件,就在现有镜像的基础上增加一层。

私有库是什么?

Docker入门:私有库(Docker Registry)简介及使用方法(防踩坑)
一、私有库的应用场景
二、准备工作
2.1 下载镜像Docker Registry
2.2 运行私有库Registry——相当于本地有个私有Docker hub
2.3 制作一个新镜像
三、 本地新建镜像发布到私有仓库Registry流程
3.1 curl验证私服库Registry上有什么镜像
3.2 将新镜像修改为符合私服规范的Tag
3.3 修改配置文件使docker支持http
3.4 push推送到私服库
3.5 将私有库的镜像拉取到本地并运行
一、私有库的应用场景
像Dockerhub、阿里云这样的公共镜像仓库有的时候用起来不太方便:Dockerhub网速太慢;阿里云需要花钱买云主机。
另外,涉及内部资源的保密性,有的机构不太可能将镜像提供给公网,因此需要创建一个基于内部项目镜像,构造本地私人仓库供给团队使用。
因此,Docker提供了Dcoker Registry工具,可以用于构建私有镜像仓库。

二、准备工作
为了实现本地镜像发布到私有仓库Registry,准备工作主要包括:

(1)首先,安装Reistry和验证安装成功;
(2)然后,创建一个本地的新镜像,用于发布到私有仓库Registry。
2.1 下载镜像Docker Registry
Docker Registry工具也是个docker镜像,它的功能就是用于创建私服版本个人企业版的docker hub。输入如下命令下载Docker Registry:

docker pull registry
 


2.2 运行私有库Registry——相当于本地有个私有Docker hub
1、运行私有库Registry的方法

通过上一步我们已经具有了Registry镜像了,这里需要run该镜像,构建一个本地私有服务器容器,并将本地镜像发送上去,命令如下所示:

docker run -d -p 5000:5000 -v /liang/my_registry/:/tmp/registry --privileged=true registry

默认情况下,仓库创建在容器的/var/lib/registry目录下,也就是说每次我们上传到registry的私人服务器仓库的文件就存储到/var/lib/registry目录下。考虑到权限管理问题,在实际应用中通常需要自定义容器卷映射,以便与宿主机联调。

上面指令中参数的具体含义:

(1)-d:设置Reigistry容器后台运行模式;
(2)-p:网络端口映射,指定容器端口绑定到主机相应主机端口;默认情况下Docker开放了5000端口(Python Flask端口)映射到主机端口32769上,这里的-p 5000:5000是将Docker内部默认端口映射到主机端口5000上,第一个5000是主机端口;第二5000是容器端口。
(3)-v:添加数据卷,格式为:-v /宿主机目录:/容器内目录。需要注意的是,指令执行后会自动创建文件夹。
(4)--privileged=true:Docker挂载主机目录Docker访问出现cannot open directory .: Permission denied的解决办法。
(5)registry:docker registry镜像。


防踩坑:上面的指令-p 5000:5000端口,并没有指定端口的绑定网络地址,这时候系统会默认主机的绑定网络地址为0.0.0.0。也就是说,我们访问主机上私有仓库Registry时候需要通过网络地址0.0.0.0

2、验证私有库Registry的运行
执行完上面指令后,在本地的/liang/my_registry/目录下创建了数据卷。

使用docker ps命令查看正在运行的registry的容器ID,需要之一的是COMMAND与别的容器不太一样。

防踩坑:在进入registry容器的时候的命令参数不能使用/bin/bash,而要使用:bin/sh、bash、sh三个中的一个。输入命令进入registry容器:

docker exec -it c4ff108b25e0 /bin/sh
 

然后可以看到在registry容器中的/tmp文件夹下就有了一个registry文件夹,至此说明运行私有库Registry成功。

2.3 制作一个新镜像
我们首先对一个容器进行升级,让它具有更多的功能,然后提交这个镜像,制作成一个具有新功能的镜像;
然后将这个具有新功能的镜像提交给私有库Registry。
1、由下载的镜像创建容器并对容器进行功能加强

这里以ubuntu16.04为例演示创建一个镜像的过程。这里我已经下载了ubuntu16.04镜像,使用命令docker run -itd --name='liang-ubuntu16.04' ubuntu:16.04创建一个名字为liang-ubuntu16.04的容器。


使用指令docker exec -it liang-ubuntu16.04以交互式方式进入容器liang-ubuntu16.04,由于容器只有ubuntu16.04内核系统,所以这里安装vim和net-tool两个工具包。在容器内部,安装这两个包的命令为:

apt-get update
apt-get install vim
apt-get install net-tool

完成上面的操作后,输入exit命令退出容器liang-ubuntu16.04.

2、提交容器副本为镜像

使用命令docker commit来提交容器副本,命令如下:

docker commit -m="ubuntu advanced version" -a="liang" liang-ubuntu16.04 ubuntu-advanced:v1
1
docker commit指令中的参数说明:

(1)-m:自定义的提交描述信息;
(2)-a:指定镜像作者;
(3)liang-ubuntu16.04:容器名字,这里也可以用容器ID代替;
(4)ubuntu-advanced:v1:指定要创建目标镜像的自定义名字(这里为unbuntu-advanced)和自定义版本(v1)。

这样就将具有vim、net-tools的ubuntu-advanced镜像就构建成功了,有关它的具体信息如上图所示。

三、 本地新建镜像发布到私有仓库Registry流程
3.1 curl验证私服库Registry上有什么镜像
指令格式如下所示:

curl -XGET http://主机映射的网络地址:主机映射网络端口/v2/_catalog

防踩坑:如果记得自己映射的主机Registy网络地址就可以直接输入;如果不记得,可以使用docker ps -a查看私服库Registry的网络映射信息(映射网络地址和映射端口)。

如下图所示,我的本地私有库Registry的网络地址为0.0.0.0,映射端口为5000。


所以,使用curl验证私服库Registry上有什么镜像的指令为:

curl -XGET http://0.0.0.0:5000/v2/_catalog
 

可以看出,目前本地私有库为空仓库。

3.2 将新镜像修改为符合私服规范的Tag
使用命令docker tag指令格式如下所示:

docker tag 镜像ID或镜像名:Tag Host:Port/Repository:Tag

上面代码的参数含义如下所示:

(1)镜像ID或镜像名:要上传到私有库Registry的镜像ID或名字;
(2)Tag:要上传的镜像版本号;
(3)Host:本地私有库的映射网址(本文为0.0.0.0);
(4)Post:本地私有库的映射端口(本文为5000);
(5)Repository:Tag:上传到私有库Registry后自定义的镜像名字、版本号。
根据需要上传的镜像:


这里的具体代码如下所示:

docker tag ubuntu-advanced:v1 0.0.0.0:5000/ubuntu-advanced:v1

这样就将ubuntu-advanced:v1镜像修改为符合私服规范的Tag了:

3.3 修改配置文件使docker支持http
由于docker的私服库作了安全加固,通常是不支持http的推送,所以这里需要配置取消该限制,代码如下所示:

首先查看,安装的docker支持的可访问的支持http:

cat /etc/docker/daemon.json
 

由上可以看出,安装的docker只支持阿里云镜像加速网址的http连接,为了实现镜像上传到私有库Registry,我们还要配置支持本地安装私有库Registry的http连接,代码如下:

修改/etc/docker/daemon.json配置文件,在终端输入sudo gedit /etc/docker/daemon.json,打开配置文件添加如下内容(注意不要遗漏,):


在终端输入systemctl restart docker命令重启docker,配置完成。

3.4 push推送到私服库
命令格式为:

docker push 符合私服规范的Tag的镜像名称或ID:版本号

查看要推送的镜像:


具体代码为:

docker push 0.0.0.0:5000/ubuntu-advanced:v1

上传私服库完成,在终端输入命令curl -XGET http://0.0.0.0:5000/v2/_catalog查看私服库上是否有推送的镜像,由下图可以看出已经存在unbunt-advanced镜像了。

防踩坑:由于上一步在配置支持http的时候,重启了docker,所以应该保证Registy是启动状态,才能上传成功,不然会出现如下错误:

3.5 将私有库的镜像拉取到本地并运行
使用docker pull命令从私有库拉取镜像到docker中:

docker pull Registry的网络映射:Registry的端口映射/私有库中的镜像名字:版本号

上面的Registry的网络映射与Registry的端口映射可由docker ps命令查看:


使用curl -XGET http://0.0.0.0:5000/v2/_catalog查看私服库上的镜像名字:

防踩坑:上面的curl指令只显示了私服库上的镜像名字,如为了获得版本号,需要如下指令,需要注意的ubuntu-advanced是要拉取的镜像名字:

curl -XGET http://0.0.0.0:5000/v2/ubuntu-advanced/tags/list
 

因此,这里的具体拉取指令如下所示:

docker pull 0.0.0.0:5000/ubuntu-advanced:v1

以上就是今天要讲的内容,本文仅仅简单介绍了镜像发布

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值