本章内容html
一、docker镜像基础docker
二、docker环境下使用的文件系统apache
三、registry(仓库)后端
四、获取镜像安全
五、制做(生成)并上传镜像服务器
---------------------------------------网络
镜像是做为docker环境的核心内容,一帮状况下,咱们都须要根据工做环境来定制镜像文件,这就对于运维人员提出了很高的要求;app
一、docker镜像基础运维
docker镜像含有启动容器所须要的文件系统及其内容,所以,其用于建立并启动docker容器采用分层构建机制,最底层的bootfs,其之为rootfs;ssh
docker镜像的分层结构,以下:
首先,咱们须要了解bootfs ,它是用于引导文件系统的,包含有bootloader和kernel,容器启动以后就会将其卸载下来;(这里就是为了去加载内核,内核加载完成就能够卸载,以节约资源)
其次,rootfs 位于bootfs之上,它就是docker容器的根文件件系统,是每一个容器的根;
一、在传统系统模式中,系统启动时,内存挂载在rootfs“只读”模式,完整性自检完成后将其从新挂载为读写模式;(系统启动知识)
二、docker中,rootfs由内核挂载为“只读”模式,然后经过”联合挂载“技术额外挂载一个”可写”层;
最后再在rootfs上面去挂载编译环境(编辑器emacs),以及应用程序,而这两层都是“只读”层,若是须要修改,咱们再在最上层挂载writable读写层。也就是咱们的container;
【这里咱们须要知道,下层是能够屡次使用的,能够同时关联于多个writable层上,这样的话,下层能够重复利用】
如上图:
二、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
三、registry(仓库)
镜像文件是从registry(仓库)中获取;
在启动容器时(run),docker daemon会同时从本地获取相关的镜像文件,若是本地没有这个镜像文件,服务器就回直接去对应的公网仓库中去下载;
仓库的分类:
sponsor Registry 第三方仓库,供客户和docker社区使用
mirror Registry 第三方仓库,只让客户使用
vendor Registry 由发布docker镜像的供应商提供的registry
private Registry 经过设有防火墙和额外的安全层的私有实体提供的registry
tag标签:
对于仓库,能够定义标签tag,每一个仓库能够有多个标签,可是,一个标签是不能属于多个仓库的;
index索引:
维护用户帐号、镜像的校验以及公共命名空间的信息;
至关于为registry(仓库)提供了一个完成用户认证等功能的检索接口;
四、获取镜像
咱们获取镜像,经过 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
五、制做(生成)并上传镜像
镜像生成途径有两种:一、dockerfile 二、基于容器制做
其中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网站
在该界面下,去建立本身的仓库;
一、指定仓库名称 二、指定仓库描述 三、指定镜像是否公开
最后建立便可:
有了本身的公有仓库,这时候,咱们就能够将本身的镜像文件上传到仓库中:
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
这样就能上传镜像到仓库;
查看仓库:刷新一下便可