如来神掌第四式第二招----docker镜像管理

###############################################################################
# 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

 

posted on 2019-03-06 10:39  Mahavairocana  阅读(233)  评论(0编辑  收藏  举报

导航