Docker镜像深入理解

到目前为止,您已经看到Docker镜像是从 Dockerfile 构建的。一个镜像由多个层组成,它包含Docker容器中执行的代码。您可以构建自定义镜像,将其定制为最适合您的需求,或者您可以使用 docker pull image_name 将镜像从 docker hub 下载到您的主机,然后使用 docker run 运行它,就像您在 hello-world 示例中所做的那样。现在我们将深入研究 Docker 镜像的各个方面。
使用Docker镜像
Docker运行前需要在本地有对应的镜像。如果镜像不存在,docker 将尝试从镜像存储库(docker 注册表)下载它。
1、 从 Docker 注册中心获取镜像
使用 docker pull 命令从 docker hub 下载镜像。
docker pull nginx:latest

由于没有指定任何注册表 url,它将从 Docker Hub 中提取。但是,如果您将自定义注册表用作 docker pull myregistry.local:5000/testing/test-image
之前解释过,一个镜像是由多层存储组成的。您还可以在上面的控制台日志中看到 docker 正在逐层下载,而不是作为单个镜像文件。这优化了 docker 存储并能够在本地重用已经可用的层。
2、运行Dcoker镜像
从技术上讲,您运行一个使用 docker run 从镜像创建的容器。执行以下命令以在 bash shell 中以交互模式运行它。
docker run -it --rm nginx:latest bash

现在您正在运行 Nginx:latest 容器,并且 bash 会话已在交互模式下为您启动。
-it
:这就像将 -i 和 -t 一起写。
-i :以交互模式启用/运行容器
-t :在 bash 中启动终端会话
--rm
:这确保容器在退出后被删除。默认情况下,不会立即删除容器。我们仅出于学习目的启用此功能,在生产中谨慎使用。
nginx:latest
:这是用于说明容器的镜像
bash
:与正在运行的容器一起使用的交互式 bash shell。
此外,您可以添加 -p 80:80 以将 Nginx 绑定到端口 80。
cat /etc/os-release
打印出有关 nginx 映像中使用的操作系统的信息。现在,在终端中键入 exit 以退出容器,正如您猜对的那样,一旦您键入 exit,容器将被删除。
管理 docker 镜像(列出和删除镜像)
当您不想再使用特定镜像或释放磁盘空间时,docker 允许您删除不必要的镜像。
1、列出docker镜像
docker image ls

REPOSITORY – 是镜像名称。
TAG – 是一个标签,通常是版本号或内部版本号。
IMAGE ID – 唯一标识下载的镜像(镜像图像)。
SIZE – 机器上镜像的大小。这可能与 docker hub 上显示的实际大小不同,因为它以压缩形式发布在 docker-hub 上。
2、列出悬空图像
当您输入 docker image ls 时,您可能会发现一些没有名称和标签的镜像,如下所示

具体列出悬空镜像
docker image ls -f dangling=true

专门删除悬空镜像 docker image prune
3、列出所有镜像——包括悬空层和中间层
使用以下命令列出本地 docker 存储库中的所有镜像
docker image ls -a
4、列出相似的图像
在某些情况下,您可能拥有多个不同版本或构建在不同操作系统上的 Nginx 镜像。下面你可以看到带有不同标签的 alpine linux。
docker image ls alpine
删除Docker镜像
要从本地机器/主机中删除 docker 镜像,请使用以下命令。
docker image rm [OPTIONS] IMAGE [IMAGE...]
或者,我更喜欢使用下面的
docker rmi [OPTIONS] IMAGE [IMAGE...]
您可以使用名称(存储库)、镜像ID 和摘要删除镜像。 image-id 可能会变得很长,因此您可以传递前几个字符,只要它足以将镜像与其他镜像区分开来。
同样,您也可以使用 name:tag 删除镜像。
docker image rm centos:latest
未标记镜像与已删除镜像
观察删除镜像命令 docker rmi 或 docker image rm 的输出,你会注意到删除消息基本上有两种类型,未标记和已删除。请记住,镜像的唯一标识符是其 ID。但是,它可以有多个标签或标签。
当我们运行删除命令时,我们要求删除标签的镜像。Docker 检查是否还有其他镜像被标记到该镜像,或者是否有镜像将其用作基本镜像,那么它只会执行未标记并且不会删除。
如果 docker 没有找到指向相同的依赖镜像,那么它将执行删除并指示为已删除。
镜像多层实现如何工作?
在 docker 中,每个镜像都由多个层组成。 Docker 使用 Union FS 将这些层组合成一个最终镜像。
Union Fs 有 2 个用途,(i) 多个磁盘可以链接到同一个目录,(ii) Unionfs 允许任意混合只读和读写分支,以及在扇出的任何位置插入和删除分支.