共计 4511 个字符,预计需要花费 12 分钟才能阅读完成。
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