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 centos
Using default tag: latest
latest: Pulling from library/centos
a02a4930cb5d: Pull complete
Digest: sha256:184e5f35598e333bfa7de10d8fb1cebb5ee4df5bc0f970bf2b1e7c7345136426
Status: Downloaded newer image for centos:latest
这条命令没有给出镜像仓库地址,默认从Docker Hub上获取。而镜像名称是centos,因此会获取官方镜像library/centos中标签为latest的镜像
配置镜像加速器因为docker hub地址是在国外,从国内拉取镜像仓库中的镜像会比较慢,此时可以配置镜像加速器。目前Docker官方和国内的云服务商都有提供国内加速服务。
Docker官方提供的中国加速器
阿里云加速器
配置阿里云加速器为例:环境说明
系统环境:centos7
docker版本: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 images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 1e1148e4cc2c 2 months ago 202MB
busybox latest 59788edf1f3e 4 months ago 1.15MB
django-compose_web latest cfd70f0cb009 5 months ago 969MB
postgres latest ac25c2bac3c4 5 months ago 228MB
my-compose_web latest 4867e7c35cc9 5 months ago 86.5MB
其中REPOSITORY+TAG称为镜像名,IMAGE ID是镜像ID,取前几位就是镜像短ID。比如用镜像名删除centos镜像:
$ docker image rm centos:latest
Untagged: centos:latest
Untagged: centos@sha256:184e5f35598e333bfa7de10d8fb1cebb5ee4df5bc0f970bf2b1e7c7345136426
Deleted: sha256:1e1148e4cc2c148c6890a18e3b2d2dde41a6745ceb4e5fe94a923d811bf82ddb
Deleted: sha256:071d8bd765171080d01682844524be57ac9883e53079b6ac66707e192ea25956
使用镜像短ID删除镜像:
$ docker image rm 59788ed
Untagged: busybox:latest
Untagged: busybox@sha256:2a03a6059f21e150ae84b0973863609494aad70f0a80eaeb64bddd8d92465812
Deleted: sha256:59788edf1f3e78cd0ebe6ce1446e9d10788225db3dedcfd1a59f764bad2b2690
Deleted: sha256:8a788232037eaf17794408ff3df6b922a1aedf9ef8de36afdae3ed0b0381907b
可以看到busybox这个镜像已经被删除。
也可以类似管道一样,结合其他命令的结果来删除镜像,比如docker image ls -q,先看看这个命令的执行结果。
$ docker image ls -q python
449d3495be0e
825141134528
825141134528
40792d8a2d6d
这个命令执行返回本地镜像中所有python镜像的镜像ID,有了ID就可以结合docker image rm来删除了。
docker image rm $(docker image ls -q)
这条命令对想要成批删除镜像很有帮助。给镜像打标签给镜像打标签的命令是docker tag 原镜像 新镜像名:标签,注意,打标签会新生成一个镜像,而且这个新的镜像ID和原镜像一样。注意:镜像的唯一标识是其ID和摘要,一个镜像可以有多个标签。当删除镜像的时候,实际上是删除某个标签的镜像。
$ docker tag busybox busybox:version1
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest d8233ab899d4 12 days ago 1.2MB
busybox version1 d8233ab899d4 12 days ago 1.2MB
启动镜像为容器启动镜像为容器的命令,列举常用的一条命令:docker run -itd (镜像名/ID/镜像摘要)
$ docker run -itd busybox
aa6ef78ae7b93704cbf9f99e184c2e2cb53924d693ca67c370fa74f52ff38d15
上面示例启动了busybox镜像为容器,不添加标签说明默认启动busybox:latest。选项说明:
-i表示让容器的标准输入打开,
-t表示分配一个伪终端,
-d表示后台启动。
要把-i -t -d 放到镜像名字前面。查看运行状态的容器查看容器运行状态使用docker ps只能查看运行中的容器,-a选项查看全部容器,包括未运行的容器。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
aa6ef78ae7b9 busybox “sh” 23 minutes ago Up 23 minutes thirsty_brattain
ee0034f44bc6 wordpress:latest “docker-entrypoint.s…” 5 months ago Up About an hour 0.0.0.0:8000->80/tcp wordpress-compose_wordpress_1
cbcb7baa5b2f mysql:5.7 “docker-entrypoint.s…” 5 months ago Up About an hour 3306/tcp, 33060/tcp wordpress-compose_db_1
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
aa6ef78ae7b9 busybox “sh” 23 minutes ago Up 23 minutes thirsty_brattain
341ea8ff6424 django-compose_web “python3 manage.py r…” 5 months ago Exited (137) 5 months ago django-compose_web_1
bffde084f040 django-compose_web “django-admin.py sta…” 5 months ago Exited (0) 5 months ago django-compose_web_run_1
0f68cb4ccae0 postgres “docker-entrypoint.s…” 5 months ago Exited (0) 5 months ago django-compose_db_1
ee0034f44bc6 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
发表回复