###############################################################################
#
Name : Mahavairocana
#
Author : Mahavairocana
#
QQ : 10353512
#
WeChat : shenlan-qianlan
#
Blog : http://www.cnblogs.com/Mahavairocana/
#
Description : You are welcome to reprint, or hyperlinks to indicate the
#
source of the article, as well as author
information.
###############################################################################
dockerimage构建方式:
docker镜像含有启动容器所需要的文件系统及其内容,用于创建并启动容器,
采用封层构建机制,最底层问bootfs,其之位rootfs
bootfs:用于系统引导的文件系统,包括bootloader和kernel,容器启动完成后悔被卸载以节约内存资源
rootfs:位于bootfs之上,表现为docker容器的根文件系统;
传统模式中,系统启动之时,内核挂在rootfs时,会首先将其挂载位只读模式,完整性自检完成后将其重新挂载为读写模式;
docker中,rootfs由内核挂在为只读模式,而后通过联合挂载技术,额外挂在一个可写层;
docker image layer
位于下层的镜像称为父镜像(parent image),最底层的称为基础镜像(base image)
最上层称为可读写层,中间的均为只读层。
镜像分层挂载均依赖文件系统
文件类型:
aufs:multi-layered unification filesystem:高级多层统一文件系统
用于为linux文件系统实现联合挂载
aufs之前unionfs重新实现,2006年由junjiro okajima开发;非内核自带,需要使用,需要自行编译、打补丁。centos无法使用,unbutu很早将aufs打包到内核使用,早期使用docker 只能使用docker。
aufs竞争产品overlayfs,从3.18版本被合并到linux内核。
docker分层镜像,除了aufs,docker还支持btrfs,devicemapper和vfs等。
在ubuntu下,docker默认为aufs
在centos下,docker默认为devicemapper
devicemapper性能比较差,而且性能不稳定。
devicemapper:在内核中,他通过一个一个模块化的targetdriver 插件实现对IO请求的过滤或者重新定向等工作,当前已经实现的targetdriver插件包括软raid,软加密,逻辑卷条带,多路径,镜像,快照等
下图linear、mirror 、snapshot、multipath表示为targetdirvcer
在众多插件中,thin provisioning snapshot,docker 使用了这个技术实现了类似aufs的分层镜像。
确认当前docker使用文件系统类型:
[root@docker--0001 ~]# docker info Containers: 1 Running: 1 Paused: 0 Stopped: 0 Images: 2 Server Version: 18.09.2 Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Native Overlay Diff: false
Logging Driver: json-file
Cgroup Driver: cgroupfs
overlay2 需要借助其他文件系统使用,如此处的extfs
Docker registry:
用途:用于保存docker镜像,包括镜像的层次结构和元数据
来源:用户可以自建regisry,也可以使用官方的dockerhub
用途
启动容器时,dockerdaemon会试图从本地获取相关的镜像,本地镜像不存在的时候,其将从registry中下载该镜像并保存到本地;
harbor:vmware提供。
分类:
sponsor registry:第三方registry,供客户和docker社区使用;{docker hub}
mirror registry:第三方的registry,只让客户使用{如红帽等,只提供给买了红帽服务的客户}vendor registry:由发布docker镜像的提供商提供的registryprivate registry:通过设有防火墙和额外的安全层的私有实体提供的registry。{私有镜像仓库}
R egistry(repository and index)
●Repository
●由某特定的docker镜像的所有迭代版本组成的镜像仓库
●一个Registry中可以存在多个R epository
●Repository可分为“顶层仓库”和“用户仓库”
●用户仓库名称格式为“用户名/仓库名”
每个仓库可以包含多个Tag(标签),每个标签对应一个镜像
●Index
维护用户账户、镜像的校验以及公共命名空间的信息
相当于为Registry提供了一个完成用户认证等功能的检索接口
Docker registry中的镜像通常有开发人员制作,而后推送到公共或私有registry上保存,供其他人员使用,例如部署到生产环境。
镜像制作:
基础镜像制作(基于运行中的容器进行镜像制作) 1、运行busybox,并创建文件: [root@docker--0001 ~]# docker run --name test -it busybox / # ls bin dev etc home proc root sys tmp usr var / # ls bin dev etc home proc root sys tmp usr var / # touch liuqi / # ls [root@docker--0001 ~]# docker commit -h Flag shorthand -h has been deprecated, please use --help Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] Create a new image from a container's changes Options: -a, --author string Author (e.g., "John Hannibal Smith #添加一个作者名称。 <hannibal@a-team.com>") -c, --change list Apply Dockerfile instruction to the created image 修改原有基础镜像运行的命令,如修改cmd指令等。 -m, --message string Commit message -p, --pause Pause container during commit (default true) + -p:保证持续写入的文件也可以注入镜像内。 [root@docker--0001 ~]# docker commit -p test sha256:666f55b9078eb538c57b37f03ad51f47b38f2351eb62b6e93618b2cf5960a68e [root@docker--0001 ~]# docker image list REPOSITORY TAG IMAGE ID CREATED SIZE <none> <none> 666f55b9078e 5 seconds ago 1.2MB busybox latest d8233ab899d4 2 weeks ago 1.2MB nginx 1.14-alpine 66952fd0a8ef 4 weeks ago 16MB 打标签 [root@docker--0001 ~]# docker tag 666f55b9078e tyy/bbox_name:v0.1-1 [root@docker--0001 ~]# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE tyy/bbox_name v0.1-1 666f55b9078e About a minute ago 1.2MB busybox latest d8233ab899d4 2 weeks ago 1.2MB nginx 1.14-alpine 66952fd0a8ef 4 weeks ago 16MB 打多个标签 [root@docker--0001 ~]# docker tag tyy/bbox_name:v0.1-1 tyy/names:latest You have new mail in /var/spool/mail/root [root@docker--0001 ~]# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE tyy/bbox_name v0.1-1 666f55b9078e 2 minutes ago 1.2MB tyy/names latest 666f55b9078e 2 minutes ago 1.2MB busybox latest d8233ab899d4 2 weeks ago 1.2MB nginx 1.14-alpine 66952fd0a8ef 4 weeks ago 16MB 删除标签:其实是删除镜像,,但可以看到,提示为untaged,所以,删除的其实是连接,而非镜像。 [root@docker--0001 ~]# docker image rm tyy/names Untagged: tyy/names:latest 运行容器: [root@docker--0001 ~]# docker run --name test -it tyy/bbox_name Unable to find image 'tyy/bbox_name:latest' locally ##未加版本号 ^C [root@docker--0001 ~]# docker run --name test -it tyy/bbox_name:v0.1-1 #名字重复 docker: Error response from daemon: Conflict. The container name "/test" is already in use by container "1631923fe00f3daa3e3abc09dacb8199e3e365bab5e02c41c53607d7766599f4". You have to remove (or rename) that container to be able to reuse that name. See 'docker run --help'. [root@docker--0001 ~]# docker run --name test1 -it tyy/bbox_name:v0.1-1 / # ls bin dev etc home liuqi proc root sys tmp usr var 修改容器默认运行cmd,以及添加作者信息。 docker commit -a "Liuqi1@chinatelecom.cn" -c 'CMD ["/bin/bash","echo liuqi"]' -p test tyy/bbox_name:v0.1-1 上传镜像到dockerhub 前提:已经注册镜像仓库账号: [root@docker--0001 ~]# docker push -h Flag shorthand -h has been deprecated, please use --help Usage: docker push [OPTIONS] NAME[:TAG] Push an image or a repository to a registry Options: --disable-content-trust Skip image signing (default true) [root@docker--0001 ~]# [root@docker--0001 ~]# docker login --help Usage: docker login [OPTIONS] [SERVER] Log in to a Docker registry Options: -p, --password string Password --password-stdin Take the password from stdin -u, --username string Username docker login -u user 登陆。 docker push tyy/bbox_name:v0.1-1 docker save docker load