1、镜像是什么?

一个分层存储的文件
一个软件的环境
一个镜像可以创建N个容器
一种标准化的交付
一个不包含linux内核而又精简的linux操作系统
镜像不是一个单一的文件,而是有多层构成。我们可以通过docker history <ID/NAME>查看镜像中各层内容及大小,
每层对应着Dockerfile中的一条指令。Docker镜像默认存储在/var/lib/docker/中。


搜索镜像:

[root@linux-node1 ~]# docker search nginx

下载镜像

[root@linux-node1 ~]# docker pull nginx

镜像从哪里来?
Docker Hub是由Docker公司负责维护的公共注册中心,包含大量的容器镜像,Docker工具默认从这个公共镜像库下载镜像。
地址:https://hub.docker.com/explore

配置镜像加速器:https://www.daocloud.io/mirror
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io

#配置加速器:

[root@linux-node1 ~]# curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
docker version >= 1.12
{"registry-mirrors": ["http://f1361db2.m.daocloud.io"]}
Success.
You need to restart docker to take effect: sudo systemctl restart docker 
[root@linux-node1 ~]# cat /etc/docker/daemon.json    #查看配置结果
{"registry-mirrors": ["http://f1361db2.m.daocloud.io"]}
[root@linux-node1 ~]# systemctl restart docker.service        #配置完成后重启

[root@linux-node1 ~]# docker pull centos    #下载一个镜像测一下速度

2、镜像与容器联系

Writable Container
Add Apache Image
Add Emacs Image
Debian Base Image
bootfs
kernel

容器其实是在镜像的最上面加了一层读写层,在运行容器里文件改动时,会先从镜像里要写的文件复制到容器自己的文件系统中(读写层)。
如果容器删除了,最上面的读写层也就删除了,改动也就丢失了。所以无论多少个容器共享一个镜像,所做的写操作都是从镜像的文件系统中复制过来操作的,并不会修改镜像的源文件,这种方式提高磁盘利用率。
若想持久化这些改动,可以通过docker commit 将容器保存成一个新镜像

查看本地已有镜像:

[root@linux-node1 ~]# docker images   
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              02256cfb0e4b        31 hours ago        109MB
centos              latest              1e1148e4cc2c        3 weeks ago         202MB
hello-world         latest              4ab4c602aa5e        3 months ago        1.84kB

创建一个容器nginx后台启动:

[root@linux-node1 ~]# docker run -itd nginx

创建一个docker容器默认会从宿主机挂载/resolv.conf /hostname /hosts 这三个文件:

[root@linux-node1 ~]# docker inspect 47cb511b8faf|grep resolv.conf
        "ResolvConfPath": "/var/lib/docker/containers/47cb511b8fafa6c8fceba82198c12c9eaae19dd699995d422d9f55efaed4e704/resolv.conf",
[root@linux-node1 ~]# docker inspect 47cb511b8faf|grep hostname
        "HostnamePath": "/var/lib/docker/containers/47cb511b8fafa6c8fceba82198c12c9eaae19dd699995d422d9f55efaed4e704/hostname",
[root@linux-node1 ~]# docker inspect 47cb511b8faf|grep hosts
        "HostsPath": "/var/lib/docker/containers/47cb511b8fafa6c8fceba82198c12c9eaae19dd699995d422d9f55efaed4e704/hosts",

容器存储对应宿主机的位置:        
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/0b747104a0a8deaef8824f23cc1b57a2d2ad501e8e56d1fbbff0a61645e340c6-init/diff:/var/lib/docker/overlay2/e32a7bca511ccdabcb99b6218f89e9d5e86609d15b2ee5b08034686c59a9ec79/diff:/var/lib/docker/overlay2/c9d822f8a4c8219b2b34b594f407bf247bde13299e03a05bd7a0fd0f9dde0317/diff:/var/lib/docker/overlay2/e667dae3d4a0983ebabed19877230ee897748c70575849fa2ea5845c0b5edcf2/diff",
                "MergedDir": "/var/lib/docker/overlay2/0b747104a0a8deaef8824f23cc1b57a2d2ad501e8e56d1fbbff0a61645e340c6/merged",
                "UpperDir": "/var/lib/docker/overlay2/0b747104a0a8deaef8824f23cc1b57a2d2ad501e8e56d1fbbff0a61645e340c6/diff",
                "WorkDir": "/var/lib/docker/overlay2/0b747104a0a8deaef8824f23cc1b57a2d2ad501e8e56d1fbbff0a61645e340c6/work"
            },

3、管理镜像常用命令

ls ————列出镜像
build ————构建镜像来自Dockerfile
histiry ————查看镜像历史
inspect ————显示一个或多个镜像详细信息
pull ————从镜像仓库拉取镜像
push ————推送一个镜像到镜像仓库
rm ————移除一个或多个镜像
prune ————移除未使用的镜像。没有被标记或被任何容器引用的
tag ————创建一个引用源镜像标记目的镜像
export ————导出容器文件系统到tar归档文件
import ————导入容器文件系统tar归档文件创建镜像
save ————保存一个或多个镜像到一个tar归档文件
load ————加载镜像来自tar归档或标准输入

例子:

[root@linux-node1 ~]# docker image ls        #列出镜像(新的方式)
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              02256cfb0e4b        6 days ago          109MB
centos              latest              1e1148e4cc2c        3 weeks ago         202MB
hello-world         latest              4ab4c602aa5e        3 months ago        1.84kB

[root@linux-node1 ~]# docker images            #列出镜像(老的方式)
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              02256cfb0e4b        6 days ago          109MB
centos              latest              1e1148e4cc2c        3 weeks ago         202MB
hello-world         latest              4ab4c602aa5e        3 months ago        1.84kB
[root@linux-node1 ~]# docker image inspect nginx:latest   #显示镜像信息
[
    {
        "Id": "sha256:02256cfb0e4bd19bdb74a077cee8ab26dd14d2e54402878a848e172a85a5cec7",
        "RepoTags": [
            "nginx:latest"
        ],
        "RepoDigests": [
            "nginx@sha256:726ad789543f7ecededeba6b68147d86aff5d33f9b5c7ddeef0340a389d2f465"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2018-12-26T23:20:18.874449006Z",
        "Container": "38acc26b719d83b9a8895e34c3241ffb4e7b242037398cb495dacbd87f6e98cd",
        "ContainerConfig": {
            "Hostname": "38acc26b719d",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "80/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "NGINX_VERSION=1.15.8-1~stretch",
                "NJS_VERSION=1.15.8.0.2.7-1~stretch"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "#(nop) ",
                "CMD [\"nginx\" \"-g\" \"daemon off;\"]"
            ],
            "ArgsEscaped": true,
            "Image": "sha256:86e6b30c0d2583dd451dd10582dd644cda524e5f1aac743fa3d8efb896f271be",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
            },
            "StopSignal": "SIGTERM"
        },
        "DockerVersion": "18.06.1-ce",
        "Author": "",
        "Config": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "80/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "NGINX_VERSION=1.15.8-1~stretch",
                "NJS_VERSION=1.15.8.0.2.7-1~stretch"
            ],
            "Cmd": [
                "nginx",
                "-g",
                "daemon off;"
            ],
            "ArgsEscaped": true,
            "Image": "sha256:86e6b30c0d2583dd451dd10582dd644cda524e5f1aac743fa3d8efb896f271be",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
            },
            "StopSignal": "SIGTERM"
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 109169260,
        "VirtualSize": 109169260,
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/c9d822f8a4c8219b2b34b594f407bf247bde13299e03a05bd7a0fd0f9dde0317/diff:/var/lib/docker/overlay2/e667dae3d4a0983ebabed19877230ee897748c70575849fa2ea5845c0b5edcf2/diff",
                "MergedDir": "/var/lib/docker/overlay2/e32a7bca511ccdabcb99b6218f89e9d5e86609d15b2ee5b08034686c59a9ec79/merged",
                "UpperDir": "/var/lib/docker/overlay2/e32a7bca511ccdabcb99b6218f89e9d5e86609d15b2ee5b08034686c59a9ec79/diff",
                "WorkDir": "/var/lib/docker/overlay2/e32a7bca511ccdabcb99b6218f89e9d5e86609d15b2ee5b08034686c59a9ec79/work"
            },
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:ef68f6734aa485edf13a8509fe60e4272428deaf63f446a441b79d47fc5d17d3",
                "sha256:2978900fe42b72766df5e07855abd2bb46bbf6c2f12453fbd8e7dc313ab63978",
                "sha256:3c0285ad7db909a5658daa2f52817b4bc2a344ece95800e965f80e0a1ae547ea"
            ]
        },
        "Metadata": {
            "LastTagTime": "0001-01-01T00:00:00Z"
        }
    }
]
[root@linux-node1 ~]# docker inspect nginx       #显示镜像信息
[
    {
        "Id": "sha256:02256cfb0e4bd19bdb74a077cee8ab26dd14d2e54402878a848e172a85a5cec7",
        "RepoTags": [
            "nginx:latest"
        ],
        "RepoDigests": [
            "nginx@sha256:726ad789543f7ecededeba6b68147d86aff5d33f9b5c7ddeef0340a389d2f465"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2018-12-26T23:20:18.874449006Z",
        "Container": "38acc26b719d83b9a8895e34c3241ffb4e7b242037398cb495dacbd87f6e98cd",
        "ContainerConfig": {
            "Hostname": "38acc26b719d",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "80/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "NGINX_VERSION=1.15.8-1~stretch",
                "NJS_VERSION=1.15.8.0.2.7-1~stretch"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "#(nop) ",
                "CMD [\"nginx\" \"-g\" \"daemon off;\"]"
            ],
            "ArgsEscaped": true,
            "Image": "sha256:86e6b30c0d2583dd451dd10582dd644cda524e5f1aac743fa3d8efb896f271be",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
            },
            "StopSignal": "SIGTERM"
        },
        "DockerVersion": "18.06.1-ce",
        "Author": "",
        "Config": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "80/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "NGINX_VERSION=1.15.8-1~stretch",
                "NJS_VERSION=1.15.8.0.2.7-1~stretch"
            ],
            "Cmd": [
                "nginx",
                "-g",
                "daemon off;"
            ],
            "ArgsEscaped": true,
            "Image": "sha256:86e6b30c0d2583dd451dd10582dd644cda524e5f1aac743fa3d8efb896f271be",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
            },
            "StopSignal": "SIGTERM"
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 109169260,
        "VirtualSize": 109169260,
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/c9d822f8a4c8219b2b34b594f407bf247bde13299e03a05bd7a0fd0f9dde0317/diff:/var/lib/docker/overlay2/e667dae3d4a0983ebabed19877230ee897748c70575849fa2ea5845c0b5edcf2/diff",
                "MergedDir": "/var/lib/docker/overlay2/e32a7bca511ccdabcb99b6218f89e9d5e86609d15b2ee5b08034686c59a9ec79/merged",
                "UpperDir": "/var/lib/docker/overlay2/e32a7bca511ccdabcb99b6218f89e9d5e86609d15b2ee5b08034686c59a9ec79/diff",
                "WorkDir": "/var/lib/docker/overlay2/e32a7bca511ccdabcb99b6218f89e9d5e86609d15b2ee5b08034686c59a9ec79/work"
            },
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:ef68f6734aa485edf13a8509fe60e4272428deaf63f446a441b79d47fc5d17d3",
                "sha256:2978900fe42b72766df5e07855abd2bb46bbf6c2f12453fbd8e7dc313ab63978",
                "sha256:3c0285ad7db909a5658daa2f52817b4bc2a344ece95800e965f80e0a1ae547ea"
            ]
        },
        "Metadata": {
            "LastTagTime": "0001-01-01T00:00:00Z"
        }
    }
]
[root@linux-node1 ~]# docker pull nginx:1.14        #下载一个nginx1.14镜像
1.14: Pulling from library/nginx
177e7ef0df69: Pull complete 
132d4353ecd5: Pull complete 
9482632c8a8f: Pull complete 
Digest: sha256:dbdb714212692aec98c262add7f3f3eddc170ea47cd493d0403145c09c302c31
Status: Downloaded newer image for nginx:1.14

[root@linux-node1 ~]# docker image rm nginx:1.14     #删除nginx:1.14镜像
Untagged: nginx:1.14
Untagged: nginx@sha256:dbdb714212692aec98c262add7f3f3eddc170ea47cd493d0403145c09c302c31
Deleted: sha256:3f55d5bb33f3ae6e7f232c82f3bc09f2aa8029d9d213bf69324c95ac1cb9d7ae
Deleted: sha256:d178dd6080618d71e1b85319821b265d20c422511f59f58f4ad84d6341a497a2
Deleted: sha256:2784880ce5781d29eed1af54c19774de0f6fabd3d63db6e0bd2103d4febedbc0
Deleted: sha256:7b4e562e58dcb7fbe1e27bb274f0ff8bfeb2fd965203380436e159df9f218900


[root@linux-node1 ~]# docker image prune             #移除未使用的镜像
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
Total reclaimed space: 0B

4、保存镜像及加载镜像

[root@linux-node1 ~]# docker image save centos > centos.tar        #保存centos镜像到归档tar
[root@linux-node1 ~]# du -sh centos.tar 
201M    centos.tar
[root@linux-node1 ~]# docker image rm centos:latest             #删除centos镜像
Untagged: centos:latest
Untagged: centos@sha256:38777a4106f0072649128ea4236241345a3ed21c55abbbd53bad5342549f6126
Deleted: sha256:1e1148e4cc2c148c6890a18e3b2d2dde41a6745ceb4e5fe94a923d811bf82ddb
Deleted: sha256:071d8bd765171080d01682844524be57ac9883e53079b6ac66707e192ea25956
[root@linux-node1 ~]# docker image load < centos.tar             #加载已归档的镜像
071d8bd76517: Loading layer [==================================================>]  210.2MB/210.2MB
Loaded image: centos:latest
文档更新时间: 2019-02-25 12:54   作者:李延召