Docker镜像由文件系统叠加组成。最底端是一个引导文件系统,即bootfs,这很像典型的Linux/Unix的引导文件系统。Docker用户几乎永远不会和引导文件系统有什么交互。实际上,当一个容器启动后,它将会被移到内存中,而引导文件系统则会被卸载(unmount),以留出更多的内存供initrd磁盘镜像使用。

rootfs可以是一种或多种操作系统(如Debian或者Ubuntu文件系统)。

       传统的Linux引导过程中,root文件系统会最先以只读的方式加载,当引导结束并完成了完整性检查之后,它会被切换为读写模式。但是Docker中root文件只会是只读模式,并且Docker利用联合加载技术会在root文件系统上加载更多的只读文件系统。联合加载指的是一次同时加载多个文件系统,但是外面看起来只能看到一个文件系统。联合加载会将各层文件系统叠加到一起,这样最终的文件系统会包含所有底层的文件和目录。

       Dcoker将这样的文件系统称为镜像。一个镜像可以放到另一镜像的顶部。位于下面的镜像称为父镜像,可以以此类推,直到镜像栈的最底部,最底部的镜像称为基础基础镜像。最后,当从一个镜像启动容器时,Docker会在该镜像的最顶层加载一个读写文件系统。我们想在Docker中运行的程序就是在这个读写层中执行的。

       当Docker第一次启动一个容器时,初始的读写层是空的。当文件系统发生变化时,这些变化都会应用到这一层上。比如想修改一个文件,这个文件首先会从该读写层下面的只读层复制到该读写层。该文件的只读版本依然存在,但是已被读写层中的该文件副本所隐藏。

栈的最顶端添加一个读写层。这个读写层再加上其下面的镜像层以及一些配置数据,就构成了一个容器。容器是可以修改的,他们都有自己的状态,并且是可以启动和停止的。容器的这种特点加上镜像分层框架,使我们可以快速构建镜像并运行包含我们自己应用程序和服务容器。


一、获取镜像

       可以使用docker pull命令从网络上下载镜像。命令格式docker pull NAME[:TAG]。如果不指定TAG,默认选择latest标签,即下载仓库中最新版本的镜像。


[root@localhost ~]# sudo docker pull centos

      

下载特定版本的镜像:


[root@localhost ~]# sudo docker pull ubuntu:14.04

      

从其他服务器的仓库下载镜像:


[root@localhost ~]# sudo docker pull dl.dockerpool.com:5000/ubuntu


二、查看镜像

       1、使用docker images命令列出本地所有镜像:


[root@localhost ~]# sudo docker images
REPOSITORY                            TAG                 IMAGE ID            CREATED             SIZE
mytomcat                              4.0                 6580d037abd5        47 hours ago        598.1 MB
mytomcat                              3.0                 54607a3a5195        2 days ago          516.8 MB
centos                                7                   561b424305df        2 weeks ago         434.5 MB
ouruser/sinatra                       v2                  57fd9b213d64        2 weeks ago         452.9 MB


       REPOSITORY:来自于哪个库;

       TAG:镜像的标签信息;

       IMAGE ID:镜像的ID号(唯一);

       CREATED:创建时间;

       SIZE:镜像大小;

var/lib/docker/containers目录下面看到所有的容器。

       2、使用docker tag命令为本地镜像添加新的标签:


[root@localhost ~]# sudo docker tag dl.dockerpool.com:5000/ubuntu:latest  ubuntu:14.04


       3、使用docker inspect命令可以获取镜像的详细信息:


[root@localhost ~]# sudo docker inspect 6580d037abd5
[
    {
        "Id": "sha256:6580d037abd5100c6e84e176fb8f27e32d9e4d8184fd1c21dbe35898da5ab2ce",
        "RepoTags": [
            "mytomcat:4.0"
        ],
        "RepoDigests": [],
        "Parent": "sha256:54607a3a51959cabec991991130f52c241a65f46e9d5eea4b503f0a414d5cde1",
        "Comment": "",
        "Created": "2017-10-25T05:59:46.393076408Z",
        "Container": "a81547038c2da62cf5d8e357a82d306525d3fc5910100c292d87fd22e58cda7b",
        "ContainerConfig": {
            "Hostname": "a81547038c2d",
            "Domainname": "",
            "User": "",
            "AttachStdin": true,
            "AttachStdout": true,
            "AttachStderr": true,
            "Tty": true,
            "OpenStdin": true,
            "StdinOnce": true,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/bash"
            ],
            "Image": "mytomcat:3.0",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "build-date": "20170911",
                "license": "GPLv2",
                "name": "CentOS Base Image",
                "vendor": "CentOS"
            }
        },
        "DockerVersion": "1.12.6",
        "Author": "",
        "Config": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/bash"
            ],
            "Image": "",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "build-date": "20170911",
                "license": "GPLv2",
                "name": "CentOS Base Image",
                "vendor": "CentOS"
            }
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 598118717,
        "VirtualSize": 598118717,
        "GraphDriver": {
            "Name": "devicemapper",
            "Data": {
                "DeviceId": "35",
                "DeviceName": "docker-253:1-2373897-832dbc49d7740bdf8ba5bab881e2192e7e20eb1165e6755204fc1cdd9c55f7e7",
                "DeviceSize": "10737418240"
            }
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:cf516324493c00941ac20020801553e87ed24c564fb3f269409ad138945948d4",
                "sha256:7085e133a3ca53dc3524cbcc098b1124b2028f02ae8416e4ae3fade58c50eeb7",
                "sha256:53db44f0a26cf7e66046c51480503e5e3d5f7fc3a5d077205866edc87e9e693b",
                "sha256:029cf7363934ffd781469d672a46eeac626c156c884479f50ef73e0bc6f87198",
                "sha256:39ba7093c1cf096732962c9435f66e7b253bef027430b8e1ecb4eda1f0e9dec0"
            ]
        }
    }
]


       docker inspect命令返回的是一个JSON格式的消息,只查看其中一项内容,可以使用-f参数来指定:


[root@localhost ~]# sudo docker inspect -f {{".Architecture"}} 6580d037abd5
amd64


三、搜索镜像

       使用docker search命令可以搜索远端仓库中的镜像,默认搜索Docker Hub官方仓库中的镜像。使用docker search TERM,支持参数包括:

       --automated=false仅显示自动创建的镜像。

       --no-trunc=false输出信息不截断显示。

       --s, --starts=0指定仅显示评价为指定星级以上的镜像。


[root@localhost ~]# sudo docker search centos
INDEX       NAME                                         DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/centos                             The official build of CentOS.                   3744      [OK]       
docker.io   docker.io/ansible/centos7-ansible            Ansible on Centos7                              103                  [OK]
docker.io   docker.io/jdeathe/centos-ssh                 CentOS-6 6.9 x86_64 / CentOS-7 7.4.1708 x8...   88                   [OK]
docker.io   docker.io/tutum/centos                       Simple CentOS docker image with SSH access      33                   
docker.io   docker.io/imagine10255/centos6-lnmp-php56    centos6-lnmp-php56                              31                   [OK]
docker.io   docker.io/gluster/gluster-centos             Official GlusterFS Image [ CentOS-7 +  Glu...   21


       返回数据项包括镜像名称、描述、星级(表示该镜像的受欢迎程度)、是否官方创建、是否自动创建等。


四、删除镜像

IMAGE...],其中IMAGE可以为标签或ID。


[root@localhost ~]# sudo docker rmi docker.io/training/sinatra
Untagged: docker.io/training/sinatra:latest
Untagged: docker.io/training/sinatra@sha256:03fc0cd265cbc28723e4efd446f9f2f37b4790cf9cc12f1b9203c79fb86b6772


       注意,当有用该镜像创建的容器存在时,需要先删除镜像创建的容器,再删除镜像。可以使用-f来强制删除该镜像,但是不建议使用这种方式来强制删除。


[root@localhost ~]# sudo docker rmi -f docker.io/training/sinatra


五、创建镜像

       创建镜像有三种方法:基于已有镜像的容器创建、基于本地模板导入、基于Dockerfile创建。

       1、基于已有镜像的容器创建

       使用docker commit命令,其命令格式为docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]],包括:

       -a,--author="" 作者信息

       -m,--message=""  提交信息

       -p, --pause=true  提交时暂停容器运行


[root@localhost ~]# sudo docker commit -m "add a file" -a "test" 6580d037abd5 test


       2、基于本地模板导入

       可以直接从一个操作系统模板文件导入一个镜像。可以到https://openvz.org/Download/template/precreated下载镜像模板,下载后将镜像模板上传到宿主机,可以使用以下命令导入:


[root@localhost ~]# sudo cat centos-7-x86_64.tar.gz |docker import - centos:7


六、导出和载入镜像

       使用docker save和docker load命令来存出和载入镜像。

       1、存出镜像


[root@localhost ~]# sudo docker save -o centos_7.tar centos:7


       2、载入镜像


[root@localhost ~]# sudo docker load --input centos_7.tar


       或


[root@localhost ~]# sudo docker load < centos_7.tar



七、上传镜像

       使用docker push命令上传镜像到仓库,默认上传到DockerHub官方仓库(需要登录),命令格式docker push NAME[:TAG]。

       需要在DockerHub网站注册后,才可以上传镜像。