docker镜像概述操作系统分为内核kernel和用户空间。对于Linux而言,内核(bootfs)启动后会挂载root文件系统为其提供用户空间支持。而docker镜像,就相当于是一个root文件系统(rootfs)。bootfs:用于系统引导的文件系统,包括bootloader和kernel,容器启动完成后会被卸载以节约内存资源rootfs:位于bootfs之上,表现为docker容器的根文件系统镜像原理镜像的root文件系统被设计为分层存储的架构。镜像在构建时,会一层一层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只会发生在自己这一层。分层存储的特征使得镜像的复用,定制变得更加容易。可以使用构建好的镜像作为基础层,再进一步的添加新的层,以定制自己所需的内容,构建新的镜像。简单来说,镜像是:文件和metedata的集合(rootfs)镜像是分层存储的,并且每一层都可以添加改变删除文件,成为一个新的镜像不同镜像可以共享相同的layer(层)镜像本身是read-only的镜像获取镜像的获取方式:从镜像仓库(registry)获取通过commit命令将容器保存为镜像通过Dockerfile定制容器(推荐使用)通过rootfs压缩包导入docker save和docker load命令镜像管理从Registry拉取镜像在docker hub上有大量高质量的镜像可以使用,从镜像仓库拉取镜像的命令格式是:docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]镜像的名称格式Docker镜像仓库地址:<域名/IP>[:端口号],默认地址是docker hub仓库名:<用户名>/<软件名>,对于docker hub,如果不给出用户名,默认是library,也就是官方镜像标签:标签一般是镜像的版本信息,不指定标签默认是latest例如:docker pull centos$ docker pull centosUsing default tag: latestlatest: Pulling from library/centosa02a4930cb5d: Pull complete Digest: sha256:184e5f35598e333bfa7de10d8fb1cebb5ee4df5bc0f970bf2b1e7c7345136426Status: Downloaded newer image for centos:latest这条命令没有给出镜像仓库地址,默认从Docker Hub上获取。而镜像名称是centos,因此会获取官方镜像library/centos中标签为latest的镜像配置镜像加速器因为docker hub地址是在国外,从国内拉取镜像仓库中的镜像会比较慢,此时可以配置镜像加速器。目前Docker官方和国内的云服务商都有提供国内加速服务。Docker官方提供的中国加速器阿里云加速器配置阿里云加速器为例:环境说明系统环境:centos7docker版本:Docker version 18.03.0-ce创建目录文件$ mkdir -p /etc/docker$ vim /etc/docker/daemon.json添加配置内容,配置内容在阿里云容器镜像服务中可以获取,每个阿里云账号都有自己的镜像加速器。{ “registry-mirrors”: [“https://这里的配置每个人都有.mirror.aliyuncs.com”]}然后就是重新加载文件和重启docker,就可以了$ systemctl daemon-reload$ systemctl restart docker列出镜像列出本地镜像的命令是:$ docker image ls或者$ docker images删除镜像删除本地镜像的命令:$ docker image rm [选项] <镜像1> [<镜像2> …]镜像可以是镜像短ID,长ID,镜像名或者镜像摘要。下面看$ docker images列出的镜像信息。$ docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEcentos latest 1e1148e4cc2c 2 months ago 202MBbusybox latest 59788edf1f3e 4 months ago 1.15MBdjango-compose_web latest cfd70f0cb009 5 months ago 969MBpostgres latest ac25c2bac3c4 5 months ago 228MBmy-compose_web latest 4867e7c35cc9 5 months ago 86.5MB其中REPOSITORY+TAG称为镜像名,IMAGE ID是镜像ID,取前几位就是镜像短ID。比如用镜像名删除centos镜像:$ docker image rm centos:latestUntagged: centos:latestUntagged: centos@sha256:184e5f35598e333bfa7de10d8fb1cebb5ee4df5bc0f970bf2b1e7c7345136426Deleted: sha256:1e1148e4cc2c148c6890a18e3b2d2dde41a6745ceb4e5fe94a923d811bf82ddbDeleted: sha256:071d8bd765171080d01682844524be57ac9883e53079b6ac66707e192ea25956使用镜像短ID删除镜像:$ docker image rm 59788edUntagged: busybox:latestUntagged: busybox@sha256:2a03a6059f21e150ae84b0973863609494aad70f0a80eaeb64bddd8d92465812Deleted: sha256:59788edf1f3e78cd0ebe6ce1446e9d10788225db3dedcfd1a59f764bad2b2690Deleted: sha256:8a788232037eaf17794408ff3df6b922a1aedf9ef8de36afdae3ed0b0381907b可以看到busybox这个镜像已经被删除。也可以类似管道一样,结合其他命令的结果来删除镜像,比如docker image ls -q,先看看这个命令的执行结果。$ docker image ls -q python449d3495be0e82514113452882514113452840792d8a2d6d这个命令执行返回本地镜像中所有python镜像的镜像ID,有了ID就可以结合docker image rm来删除了。docker image rm $(docker image ls -q)这条命令对想要成批删除镜像很有帮助。给镜像打标签给镜像打标签的命令是docker tag 原镜像 新镜像名:标签,注意,打标签会新生成一个镜像,而且这个新的镜像ID和原镜像一样。注意:镜像的唯一标识是其ID和摘要,一个镜像可以有多个标签。当删除镜像的时候,实际上是删除某个标签的镜像。$ docker tag busybox busybox:version1$ docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEbusybox latest d8233ab899d4 12 days ago 1.2MBbusybox version1 d8233ab899d4 12 days ago 1.2MB启动镜像为容器启动镜像为容器的命令,列举常用的一条命令:docker run -itd (镜像名/ID/镜像摘要)$ docker run -itd busyboxaa6ef78ae7b93704cbf9f99e184c2e2cb53924d693ca67c370fa74f52ff38d15上面示例启动了busybox镜像为容器,不添加标签说明默认启动busybox:latest。选项说明:-i表示让容器的标准输入打开,-t表示分配一个伪终端,-d表示后台启动。要把-i -t -d 放到镜像名字前面。查看运行状态的容器查看容器运行状态使用docker ps只能查看运行中的容器,-a选项查看全部容器,包括未运行的容器。$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESaa6ef78ae7b9 busybox “sh” 23 minutes ago Up 23 minutes thirsty_brattainee0034f44bc6 wordpress:latest “docker-entrypoint.s…” 5 months ago Up About an hour 0.0.0.0:8000->80/tcp wordpress-compose_wordpress_1cbcb7baa5b2f mysql:5.7 “docker-entrypoint.s…” 5 months ago Up About an hour 3306/tcp, 33060/tcp wordpress-compose_db_1$ docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESaa6ef78ae7b9 busybox “sh” 23 minutes ago Up 23 minutes thirsty_brattain341ea8ff6424 django-compose_web “python3 manage.py r…” 5 months ago Exited (137) 5 months ago django-compose_web_1bffde084f040 django-compose_web “django-admin.py sta…” 5 months ago Exited (0) 5 months ago django-compose_web_run_10f68cb4ccae0 postgres “docker-entrypoint.s…” 5 months ago Exited (0) 5 months ago django-compose_db_1ee0034f44bc6 wordpress:latest “docker-entrypoint.s…” 5 months ago Up About an hour 0.0.0.0:8000->80/tcp wordpress-compose_wordpress_1使用commit构建镜像镜像是容器的基础,每次执行 docker run 的时候都会指定哪个镜像作为容器运行的基础。镜像是多层存储,每一层是在前一层的基础上进行的修改;而容器同样也是多层存储,是在以镜像为基础层,在其基础上加一层作为容器运行时的存储层。因此,在运行的容器对容器进行添加修改操作,也就是修改容器的存储层,docker提供了commit命令可以将容器存储层保存下来称为镜像。用例子看一下吧:通过压缩包导入创建镜像镜像构建之Dockerfile