欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 明星 > Docker 镜像

Docker 镜像

2024/10/24 5:19:48 来源:https://blog.csdn.net/weixin_43344151/article/details/141784022  浏览:    关键词:Docker 镜像

Docker 镜像

  • Docker 镜像的分层
    • 分层结构概述
    • UnionFS 技术
    • 分层特点
    • 分层优势
    • 示例
  • Docker 镜像的特点
  • Docker 镜像的组成
  • Docker 镜像的获取
  • Docker 镜像的构建
  • Docker 镜像的操作
  • `docker commit`
    • 基本用法
    • 选项(OPTIONS)
    • 示例
    • 注意事项
  • Docker 镜像的存储路径
  • 总结

在这里插入图片描述

Docker 镜像是一种轻量级、独立的可执行软件包,它包含了运行某个软件所需的所有内容,包括代码、运行时环境、系统工具、库文件等。Docker 镜像为应用程序提供了一个独立的、可移植的运行环境,使得应用程序与其运行时环境解耦,从而简化了应用程序的部署和分发过程。

Docker 镜像的分层

Docker 镜像的分层是其核心特性之一,这种分层结构使得 Docker 镜像在构建、部署和更新过程中非常灵活,同时节省存储空间和下载时间。以下是 Docker 镜像分层的详细解释:

分层结构概述

Docker 镜像由多个只读层(read-only layer)组成,每一层都包含了文件系统的一部分。这些层按照从底部到顶部的顺序叠加在一起,形成了一个完整的镜像。底部的层通常包含基础操作系统和依赖库,而顶部的层则包含应用程序代码和配置等信息。

UnionFS 技术

Docker 镜像的分层存储机制是通过使用 UnionFS(Union File System)技术来实现的。UnionFS 是一种将不同目录挂载到同一个目录下的文件系统,它可以将多个文件系统(或目录)联合挂载到同一个目录下,形成一个整体的文件系统。在 Docker 中,UnionFS 使得多个只读层在逻辑上看起来像一个整体,但实际上并没有复制文件内容,从而节省了存储空间。

分层特点

  1. 只读层:Docker 镜像的每一层都是只读的,这意味着在构建后,镜像层的内容不会再改变。这种设计有助于镜像的高效性和可复用性。如果需要修改镜像,Docker 将在现有层之上创建新的镜像层,保持原有层的完整性。
  2. 可读写层:当基于镜像创建一个容器时,Docker 会在镜像的顶部添加一个可读写的容器层(writable layer)。这个容器层允许容器在运行时对文件系统进行写操作,例如应用程序的日志输出、数据库文件等。容器层是临时的,只在容器运行时存在,当容器停止时,对容器层的修改也会被丢弃,保持镜像的不可变性。
  3. Copy-on-Write(写时复制):Docker 使用了 Copy-on-Write(写时复制)的特性来优化存储和性能。当容器需要修改一个层中的文件时,Docker 不会直接修改原始层,而是创建一个新的层,并在新层中存储修改后的文件。这样,只有发生更改的文件会在新层中存在,而其他文件仍然链接到原始层,节省了存储空间。

分层优势

  1. 节省存储空间:由于镜像层是共享的,多个镜像可以共享相同的基础层,从而节省存储空间。
  2. 加快部署速度:在构建新镜像或启动新容器时,Docker 只需下载或加载发生更改的层,而无需重新下载整个镜像,从而加快了部署速度。
  3. 提高镜像的可复用性:Docker 镜像的分层结构使得镜像可以轻松地复用和共享,降低了构建新镜像的复杂性和成本。

示例

以一个简单的 Dockerfile 为例,说明 Docker 镜像的分层构建过程:

FROM ubuntu:20.04  # 基础镜像层,包含 Ubuntu 20.04 的根文件系统
COPY ./app /app    # 应用程序层,将本地 app 目录复制到镜像的 /app 目录
RUN make /app      # 构建层,在镜像中执行 make 命令编译应用程序
CMD python /app/app.py  # 入口点层,指定容器启动时执行的命令

在这个例子中,每个 Dockerfile 指令都会创建一个新的只读层。当容器启动时,Docker 会在这些只读层之上添加一个可读写的容器层,用于存储容器运行时的更改。

综上所述,Docker 镜像的分层结构是一种高效、灵活和可复用的设计,它使得 Docker 容器化应用程序在不同的环境中可以轻松部署和运行,同时节省了存储空间和提高了构建和下载速度。

Docker 镜像的特点

  1. 轻量级:Docker 镜像采用了分层的文件系统(如 UnionFS),使得镜像的构建、存储和传输变得高效和灵活。每个层都代表了镜像的一个修改或操作,这种分层的结构使得镜像的构建过程可以复用之前的层,从而减少了存储和传输的成本。
  2. 独立性:Docker 镜像为应用程序提供了一个独立的运行环境,使得应用程序可以在任何支持 Docker 的环境中运行,而无需担心环境配置的问题。
  3. 可移植性:由于 Docker 镜像包含了运行应用程序所需的所有内容,因此它可以在不同的操作系统和硬件平台上运行,提高了应用程序的可移植性。

Docker 镜像的组成

Docker 镜像由多个层(Layers)组成,每个层都代表了镜像的一个修改或者操作。当我们构建一个新的镜像时,Docker 会按照指令逐步执行,并且每个指令都会生成一个新的层。这种分层的结构使得镜像的构建、存储和传输变得高效和灵活。

Docker 镜像的获取

用户可以通过 Docker 命令行工具从 Docker Hub 或其他镜像仓库中拉取(pull)所需的镜像。Docker Hub 是一个公共的云端镜像库,提供了大量的官方镜像和用户镜像供用户选择。

Docker 镜像的构建

Docker 提供了多种方式来构建镜像,包括使用 Dockerfile、commit 命令、API 等。其中,Dockerfile 是 Docker 官方提供的一种用来自动化构建镜像的脚本工具,它通过一系列的指令来生成一个镜像。使用 Dockerfile 构建镜像的优点是易于维护和分享,且可通过版本控制工具进行管理。

Docker 镜像的操作

Docker 提供了丰富的命令来管理镜像,包括查看镜像(docker images)、拉取镜像(docker pull)、删除镜像(docker rmi)、保存镜像(docker save)、加载镜像(docker load)等。这些命令使得用户可以方便地管理本地的 Docker 镜像。

docker commit

docker commit 命令在 Docker 中用于从正在运行的容器创建一个新的镜像。这个命令非常有用,尤其是当你对容器做了一些修改(比如安装了额外的软件包、修改了配置文件等),并希望将这些更改保存为一个新的镜像时。

基本用法

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
  • CONTAINER:指定要从中创建新镜像的容器的 ID 或名称。
  • REPOSITORY[:TAG]:指定新镜像的仓库名和(可选的)标签。如果省略标签,Docker 会使用默认标签 latest

选项(OPTIONS)

  • -a, --author="":设置新镜像的作者。
  • -c, --change=[]:在提交镜像时应用 Dockerfile 指令,比如添加环境变量或文件。
  • -m, --message="":设置提交时的消息,类似于 git commit 消息。
  • -p, --pause=true:在提交前暂停容器(默认为 true)。如果容器已经暂停,这个选项不会生效。

示例

假设你有一个正在运行的容器 my_container,你想将它保存为一个新的镜像,名为 my_image,标签为 v1,并设置作者信息。

docker commit -a "John Doe <john.doe@example.com>" -m "Added new feature X" my_container my_image:v1

这个命令会创建一个新的镜像 my_image,标签为 v1,并设置作者为 “John Doe john.doe@example.com”,提交消息为 “Added new feature X”。

注意事项

  • 使用 docker commit 可能会使镜像的层数增加,从而可能导致镜像体积增大和构建时间变长。因此,在可能的情况下,建议通过 Dockerfile 来构建镜像,以便更好地管理和重用镜像层。
  • docker commit 提交的是容器的当前状态,包括所有已做的更改和未持久化的数据。如果容器中有未写入磁盘的数据(如缓存或临时文件),这些数据也会被包含在生成的镜像中。
  • 提交镜像时,最好提供一个明确的标签,以便于管理和识别不同版本的镜像。

Docker 镜像的存储路径

Docker 默认的镜像存储路径是 /var/lib/docker,但用户也可以自定义镜像的存储路径。通过修改 Docker 守护进程的配置文件(如 daemon.json),用户可以指定新的镜像存储路径,并重新加载 Docker 服务以应用更改。

总结

Docker 镜像作为 Docker 技术的核心组件之一,为容器化应用程序的部署、分发和管理提供了强大的支持。通过构建、管理和共享 Docker 镜像,开发者可以更加轻松地实现应用程序的持续交付和扩展,从而加速应用开发和部署的过程。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com