静下心来的个人专栏
上一篇

Docker镜像深入理解

广告
选中文字可对指定文章内容进行评论啦,→和←可快速切换按钮,绿色背景文字可以点击查看评论额。
大纲

Docker镜像深入理解

Docker architecture

到目前为止,您已经看到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 允许任意混合只读和读写分支,以及在扇出的任何位置插入和删除分支.

版权声明:著作权归作者所有。

X

欢迎加群学习交流

联系我们