zoukankan      html  css  js  c++  java
  • 9.Docker镜像

    Docker images

    关于Docker images

    Docker镜像含有启动容器所需要的文件系统及内容,因此镜像主要用于创建并启动docker容器;

    Docker镜像含里面是一层层文件系统,叫做Union File System(Union FS 联合文件系统)可将多个目录挂载到一起从而形成一整个虚拟文件系统,该虚拟文件系统的目录结构就像普通linux的目录结构一样,docker通过这些文件加上宿主机的内核提供里一个linux的虚拟环境,每一层文件系统我们叫做一层layer,联合文件系统可以对每一层文件系统设置三种权限,只读(readonly)、读写(readwrite)和写出(whiteout-able),但docker镜像中每一层文件系统都相当于做一层的修改,增加了一层文件系统,一层层叠加,上层的修改会覆盖底层该位置的可见性,就像上层把底层遮住一样;当使用镜像时,我们只会看到一个完全的整体。

    典型的启动Linux运行需要两个FS: bootfs + rootfs:

    img

    bootfs (boot file system) 主要包含 bootloader和 kernel, bootloader主要是引导加载kernel, 当kernel 被加载到内存中后 bootfs就被umount了。rootfs (root file system) 包含的就是典型 Linux 系统中的 /dev, /proc,/bin, /etc 等标准目录和文件。

    docker中,rootfs由内核挂在为”只读“模式,而后通过“联合挂载(AUFS)”技术额外挂在一个可读写层。

    docker镜像通常比较小,官方提供centos基础镜像在200MB左右,一些其他版本镜像可能只有几MB,docker镜像直接调用宿主机的内核,镜像中只提供rootfs;只包含基本命令、工具、工程库,例如alpine镜像在5M左右

    下图就是docker image中最基础的两层结构,不同的linux发行版(Centos/Ubantu)在rootfs这一层会有所区别。

    img

    典型的Linux在启动后,首先将 rootfs 设置为 readonly, 进行一系列检查, 然后将其切换为 "readwrite" 供用户使用。在Docker中,初始化时也是将 rootfs 以readonly方式加载并检查,然而接下来利用 union mount 的方式将一个 readwrite 文件系统挂载在 readonly 的rootfs之上,并且允许再次将下层的 FS(file system) 设定为readonly 并且向上叠加, 这样一组readonly和一个writeable的结构构成一个container的运行时态, 每一个FS被称作一个FS层。如下图:

    img

    得益于AUFS的特性, 每一个对readonly层文件/目录的修改都只会存在于上层的writeable层中。这样由于不存在竞争, 多个container可以共享readonly的FS层。 所以Docker将readonly的FS层称作 "image" - 对于container而言整个rootfs都是read-write的,但事实上所有的修改都写入最上层的writeable层中, image不保存用户状态,只用于模板、新建和复制使用。

    img

    上层的image依赖下层的image,因此Docker中把下层的image称作父image,没有父image的image称作base image。因此想要从一个image启动一个container,Docker会先加载这个image和依赖的父images以及base image,用户的进程运行在writeable的layer中。所有parent image中的数据信息以及 ID、网络和lxc管理的资源限制等具体container的配置,构成一个Docker概念上的container。如下图:

    img

    Docker images基础操作

    镜像命名

    镜像层的ID既可以识别每个镜像层,也可以用来直接识别镜像(因为根据最上层镜像能够找出所有依赖的下层镜像,所以最上层进行的镜像层ID就能表示镜像的ID),但是使用这种无意义的超长哈希码显然是违背人性的,所以需要引入镜像命名,通过镜像名能够更容易的识别镜像。

    在docker images命令打印出的内容中,有两个与镜像命名有关的数据:repository和tag,这两者组成了docker对镜像的命名规则。

    完整看,镜像的命名可以分成三个部分:username、repository和tag。

    • username: 上传镜像的用户,与GitHub中的用户空间类似
    • repository:镜像内容,形成对镜像的表意描述
    • tag:表示镜像版本,方便区分内容细节

    搜索镜像

    登录hub.docker.com进行搜索,并查看tag信息

    #配置好docker镜像源后可进行搜索
    docker search jdk
    NAME                           DESCRIPTION              STARS     OFFICIAL   AUTOMATED
    primetoninc/jdk                Oracle jdk 1.8, 1.7       18                     [OK]
    codenvy/jdk8_maven3_tomcat8    JDK 8, Maven 3, Tomcat 8  9                      [OK]
    ascdc/jdk8                     jdk8                      8                      [OK]
    ......
    
    

    获取镜像

    #未指定默认从dockerhub自动获取镜像,默认地址https://index.docker.io/v1/
    #docker pull 仓库服务器:端口/项目名称/镜像名称:tag(版本)号
    docker pull [OPTIONS] NAME[:TAG|@DIGEST]
    docker pull <registry>[:<port>]/[<namespace>/]<name>:<tag>
    
    #获取ubantu镜像,未指明tag,则默认为latest
    docker pull ubantu:19.10
    #获取flannel镜像
    docker pull quay.io/coreos/flannel:v0.10.0-amd64
    
    #其他镜像地址
    https://quay.io
    

    推送镜像

    #推送至aliyun 
    #服务器地址/名称空间/仓库名:标签
    docker tag [ImageID] registry.cn-qingdao.aliyuncs.com/guomiaosen/httpd:[镜像版本号]
    docker login --username=guomiaosen registry.cn-qingdao.aliyuncs.com
    #不指定镜像则推送整个仓库
    docker push registry.cn-qingdao.aliyuncs.com/guomiaosen/httpd:[镜像版本号]
    

    查看本地镜像

    docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    nginx               latest              2622e6cca7eb        2 weeks ago         132MB
    alpine              latest              a24bb4013296        4 weeks ago         5.57MB
    
    意义
    REPOSITORY 镜像所属仓库名称
    TAG 镜像版本号标识符
    IMAGE ID 镜像唯一ID表示
    CREATED 镜像创建时间
    SIZE 镜像的大小

    当镜像REPOSITORY、TAG为None None时,通常是后期导入或制作的镜像与之前已存在的镜像REPOSITORY、TAG冲突,从而把之前的覆盖而导致,有很少部分镜像下载后这样

    镜像导入

    #-o指定输出文件名称
    docker save [Imagename] -o gms.gz [ImageID] #名称空间/仓库名:标签
    
    #保存导出nginx镜像
    docker save ngixn -o /opt/nginx.tar.gz
    
    #保存导出nginx镜像
    docker save nginx:1.16.1 > /opt/nginx-1.16.1.tar.gz
    

    镜像导出

    #-i指定加载文件
    docker load -i gms.gz
    
    #加载nginx镜像
    docker load -i nginx-1.16.1.tar.gz
    
    #加载nginx镜像
    docker load < nginx-1.16.1.tar.gz
    

    缺陷:使用docker run时,若无本地镜像时;还会连接远程dockerhub再次进行拉取操作

    删除镜像&删除容器

    #推荐使用IMAGE ID来删除镜像;也可以使用镜像名称,但强烈建议添加上tag号
    docker rm [IMAGE ID]
    
    docker rm IMAGE NAME/tag
    #通过镜像启动容器时,镜像不能被删除,除非关闭容器,强制删除加-f
    docker rmi [IMAGE ID]
    
    docker rmi IMAGE NAME/tag
    docker rmi nginx:1.16.1
    

    设置镜像标签

    我们可以使用 docker tag 命令,为镜像添加一个新的标签。

    docker tag 860c279d2fec runoob/centos:dev
    #docker tag 镜像ID,这里是 860c279d2fec ,用户名称、镜像源名(repository name)和新的标签名(tag)。
    #使用 docker images 命令可以看到,ID为860c279d2fec的镜像多一个标签。
    docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    runoob/centos       6.7                 860c279d2fec        5 hours ago         190.6 MB
    runoob/centos       dev                 860c279d2fec        5 hours ago         190.6 MB
    runoob/ubuntu       v2                  70bf1840fd7c        22 hours ago        158.5 MB
    ubuntu              14.04               90d5884b1ee0        6 days ago          188 MB
    php                 5.6                 f40e9e0f10c8        10 days ago         444.8 MB
    nginx               latest              6f8d099c3adc        13 days ago         182.7 MB
    mysql               5.6                 f2e8d6c772c0        3 weeks ago         324.6 MB
    httpd               latest              02ef73cf1bc0        3 weeks ago         194.4 MB
    ubuntu              15.10               4e3b13c8a266        5 weeks ago         136.3 MB
    hello-world         latest              690ed74de00f        6 months ago        960 B
    centos              6.7                 d95b5ca17cc3        6 months ago        190.6 MB
    

    查看镜像创建历史

    docker history : 查看指定镜像的创建历史。

    语法

    docker history [OPTIONS] IMAGE
    
    

    OPTIONS说明:

    • -H :以可读的格式打印镜像大小和日期,默认为true;

    • --no-trunc :显示完整的提交记录;

    • -q :仅列出提交记录ID。

    实例

    查看本地镜像runoob/ubuntu:v3的创建历史。

    root@runoob:~# docker history runoob/ubuntu:v3
    IMAGE             CREATED           CREATED BY                                      SIZE      COMMENT
    4e3b13c8a266      3 months ago      /bin/sh -c #(nop) CMD ["/bin/bash"]             0 B                 
    <missing>         3 months ago      /bin/sh -c sed -i 's/^#s*(deb.*universe)$/   1.863 kB            
    <missing>         3 months ago      /bin/sh -c set -xe   && echo '#!/bin/sh' > /u   701 B               
    <missing>         3 months ago      /bin/sh -c #(nop) ADD file:43cb048516c6b80f22   136.3 MB
    
  • 相关阅读:
    Dynamics CRM 2015-超大Solution导入问题
    Dynamics CRM 2015-Data Encryption激活报错
    Dynamics CRM 2011-RootComponent Type
    Dynamics CRM 2015-Sign Out选项
    Dynamics CRM 2015-如何修改Optionset Default Value
    顶象直播实录:零售金融在线展业的风控实践(内含PPT)
    分析 | 央行二代征信有效防范多头借贷套利
    警示 | 天天都是315:防诈骗指南,速来领取↓↓↓
    “无接触”线上化转型加快 疫情下的物流大考
    “宅经济”,推动金融机构迎来新业务
  • 原文地址:https://www.cnblogs.com/Gmiaomiao/p/13198529.html
Copyright © 2011-2022 走看看