03 docker容器镜像基础
本章内容
1、docker镜像基础
2、docker环境下使用的文件系统
3、registry(仓库)
4、获取镜像
5、制作(生成)并上传镜像
---------------------------------------
镜像是作为docker环境的核心内容,一帮情况下,我们都需要根据工作环境来定制镜像文件,这就对于运维人员提出了很高的要求;
1、docker镜像基础
docker镜像含有启动容器所需要的文件系统及其内容,因此,其用于创建并启动docker容器采用分层构建机制,最底层的bootfs,其之为rootfs;
docker镜像的分层结构,如下:
首先,我们需要了解bootfs ,它是用于引导文件系统的,包含有bootloader和kernel,容器启动之后就会将其卸载下来;(这里就是为了去加载内核,内核加载完成就可以卸载,以节约资源)
其次,rootfs 位于bootfs之上,它就是docker容器的根文件件系统,是每个容器的根;
1、在传统系统模式中,系统启动时,内存挂载在rootfs“只读”模式,完整性自检完成后将其重新挂载为读写模式;(系统启动知识)
2、docker中,rootfs由内核挂载为“只读”模式,而后通过”联合挂载“技术额外挂载一个”可写”层;
最后再在rootfs上面去挂载编译环境(编辑器emacs),以及应用程序,而这两层都是“只读”层,如果需要修改,我们再在最上层挂载writable读写层。也就是我们的container;
【这里我们需要知道,下层是可以多次使用的,可以同时关联于多个writable层上,这样的话,下层可以重复利用】
如上图:
2、docker环境下使用的文件系统
此时,基于docker镜像的工作原理,我们使用原有传统的数据组织方式(文件系统)是不适用的,所以我们使用了新的文件系统来满足docker容器技术;
其中包括三种技术:aufs overlayfs devicemapper(dm)
其中,devicemapper使用的是dm的模块来实现,而并不是修改了文件系统,在生产环境下,我们建议使用overlayfs的文件系统来实现docker技术;
Aufs
用于为Linux文件系统实现“联合挂载”,aufs是之前UnionFS的重新实现,2006年由Junjiro Okajima开发;docker使用之初是用aufs作为文件系统层,它目前仍然作为存储后端之一来支持;
它的竞争产品overlayfs,后来从3.18版本开始被合并到Linux内核;docker;
而aufs一直不是内核中自有的文件系统。它因为代码太乱了,3万行太多,没有写入内核;如果需要,则必须打补丁升级;而Ubuntu则是将aufs写入内核了;
overlayfs
相对于aufs,overlayfs则要优秀的多,它已经被写入到Linux内核,默认启动docker,只要支持overlayfs,则就回使用这种方式来创建docker环境;
devicemapper
在没有使用上面两种文件系统的系统程序中,去启动docker进程,则是使用该方式来实现的;它是借助 dm 模块(和lvm技术是同一个模块)来实现,而不是依靠文件系统;
所以这种方式非常的不稳定,不建议使用;但是在3.18内核之前的版本,redhat系列的Linux操作系统不支持aufs和overlayfs,就会使用该方式来实现docker环境;
查看我的docker环境:
docker info
3、registry(仓库)
镜像文件是从registry(仓库)中获取;
在启动容器时(run),docker daemon会同时从本地获取相关的镜像文件,如果本地没有这个镜像文件,服务器就回直接去对应的公网仓库中去下载;
仓库的分类:
sponsor Registry 第三方仓库,供客户和docker社区使用
mirror Registry 第三方仓库,只让客户使用
vendor Registry 由发布docker镜像的供应商提供的registry
private Registry 通过设有防火墙和额外的安全层的私有实体提供的registry
tag标签:
对于仓库,可以定义标签tag,每个仓库可以有多个标签,但是,一个标签是不能属于多个仓库的;
index索引:
维护用户账号、镜像的校验以及公共命名空间的信息;
相当于为registry(仓库)提供了一个完成用户认证等功能的检索接口;
4、获取镜像
我们获取镜像,通过 docker 命令的子命令 pull 来实现;
用法如下:
docker pull registry[:<port>]/[namespace/]<name>:<tag>
示例:下载一个镜像文件;
我们通过第三方的仓库来下载我们所需要的镜像文件: https://quay.io
搜索 flannel ;这是云环境下最常用的一个网络部署系统镜像文件;
点击“coreos/flannel”进入下载界面: 在右下角可以复制镜像地址,进入镜像下载界面
这里,我们一定要指定tag,如下图查看tag:
下载镜像:
docker pull quay.io/coreos/flannel:v0.11.0-arm
查看镜像:
docker images
5、制作(生成)并上传镜像
镜像生成途径有两种:1、dockerfile 2、基于容器制作
其中dockerfile是我们最常用的镜像制作方式,而且是docker容器的核心,我们需要通过dockerfile自己定义镜像,自己定义仓库;
这里我们先通过容器技术来配置:
我们通过子命令commit来通过容器制作镜像;
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
-a --author 指定作者
-c --change 应用dockerfile的指令来创建镜像
-m --message 添加消息信息
-p --pause 创建镜像的时候,需要暂停容器
a\首先我们运行一个容器
我们这里首先通过 pull 命令下载一个busybox的容器,启动这个容器
docker run --name b1 -it busybox
b\启动busybox的http服务
/ # mkdir -p /data/html / # vi /data/html/index.html <h1>Busybox httpd server</h1> / # busybox httpd server
查看busybox地址:
从新开启一个 ssh 远程接口,查看http服务:
curl 172.17.0.2
c\保存镜像
docker commit -p b1 //制作新的镜像
docker images //查看制作的镜像
我们可以为新的镜像文件添加标签:
通过子命令 tag 来实现
docker tag 6l6b37df33a7 test/httpd:v0.1 //添加标签需要指定镜像id
删除镜像,我们可以通过 images 子命令来实现
docker images rm test/httpd:v0.1
我们这里就不删除了
d\我们可以运行这个镜像
操作如下: 这里,我新添加一个容器--b1.1,使用的就是我们创建的镜像,同时,我们可以 cat /data/html/index.html 文件,这样,我们就能够看到之前编辑的文件;
e\指定默认容器启动的服务
这里我们启动的容器后,还需要指定启动httpd服务,但是,如果我们默认就需要镜像启动httpd的服务,这里,我们也可以通过commit子命令来实现;
docker commit -a "test <test@admin.com>" -c 'CMD ["/bin/httpd","-f","-h","data/html"]' -p b1 test/httpd:v0.2
此时,则创建了一个新的镜像,我们再启动这个镜像:
docker run --name b1.2 -it test/httpd:v0.2
docker inspect b1.2 //查看地址
查看服务:
查看容器:
在这里,我们可以看到,我们指定的默认启动命令;
f\上传镜像到公网仓库
根据上面的内容,我们已经为自己制作了对应的镜像文件;我们可以将自己制作的镜像文件上传到公网仓库,提供给别人下载;
首先,我们需要去dockerhub.com上面注册账号:
注册完成以后,登录dockerhub.com网站
在该界面下,去创建自己的仓库;
1、指定仓库名称 2、指定仓库描述 3、指定镜像是否公开
最后创建即可:
有了自己的公有仓库,这时候,我们就可以将自己的镜像文件上传到仓库中:
pull 子命令为下载镜像,同样的 push 命令就是上传进项;
在上传之前,我们需要登录到自己的公网仓库,这个操作通过 login 操作来完成;
docker login -u burnov
提示登录成功后,我们就可以上传镜像了
注意:这里有个问题--上传镜像我们一定要让仓库名称,登录名称对应上:
上图是我们仓库的名称,所以,我们的镜像名称也需要修改过来
docker tag test/httpd:v0.2 burnov/httpd:v0.2
这里,burnov/httpd 中 burnov为用户名,而httpd为仓库名;v0.2为tag标记;
再次上传镜像
docker push burnov/httpd:v0.2
这样就能上传镜像到仓库;
查看仓库:刷新一下即可