你为什么需要Docker的基本图像?

时间:2013-11-28 20:16:47

标签: docker

我已浏览Docker文档的每一页。

我还不明白为什么在安装/创建应用程序环境之前需要“基本映像”(例如,Ubuntu Base Image)来提供容器。

我的问题:

  • 什么是基本图像?为什么需要它?
  • 为什么不能只创建容器并将应用程序放在其中类似于Python的virtualenv?

4 个答案:

答案 0 :(得分:8)

实际上,Docker通过应用添加到基本图像的图层来工作。由于必须保持所有这些层之间的一致性,因此不能将第一个图像基于移动目标(即可写文件系统)。因此,您需要一个永远保持不变的只读图像。

以下是Docker关于images的文档的摘录:

  

由于Docker使用Union File System,因此进程认为整个文件系统是以读写方式挂载的。但所有更改都转到最顶层的可写层,而在下面,只读图像中的原始文件不变。由于图像不会改变,因此图像没有状态。

enter image description here

答案 1 :(得分:4)

映像只是文件系统和相关性的快照,或特定应用程序/软件的特定目录集。快照是指容器环境中具有基本配置的运行该软件(例如mysql,redis等)所需的那些文件的副本。使用图像创建容器时,借助于 namespacing cgroups 隔离系统中的一小部分资源,然后复制图像中的文件在这种孤立的资源环境中。

让我们了解什么是基本图片:

基本图像是我们最终要创建的图像的起点或起点。

假设您需要一个运行redis的映像(这是一个愚蠢的示例,您可以通过其他方式实现它,但是仅出于解释的目的,您认为在docker hub上找不到该映像),您需要一个起点为此创建图像。因此,让我们以“高山”图像作为基本图像。 阿尔卑斯山是最轻的图像,其中包含仅用于运行基本命令的文件(例如,在容器内部添加ls,cd,apk)。

使用以下命令创建Dockerfile:

FROM alpine
RUN apk add --update redis
CMD ["redis-server"]

现在,当您运行docker build .命令时,它将提供以下输出:

    Sending build context to Docker daemon  2.048kB
    Step 1/3 : FROM alpine
     ---> a24bb4013296
    Step 2/3 : RUN apk add --update redis
     ---> Running in 535bfd2d1ff1
    fetch http://dl-cdn.alpinelinux.org/alpine/v3.12/main/x86_64/APKINDEX.tar.gz
    fetch http://dl- 
    cdn.alpinelinux.org/alpine/v3.12/community/x86_64/APKINDEX.tar.gz
    (1/1) Installing redis (5.0.9-r0)
    Executing redis-5.0.9-r0.pre-install
    Executing redis-5.0.9-r0.post-install
    Executing busybox-1.31.1-r16.trigger
    OK: 7 MiB in 15 packages
    Removing intermediate container 535bfd2d1ff1
     ---> 4c288890433b
    Step 3/3 : CMD ["redis-server"]
     ---> Running in 7f01a4da3209
    Removing intermediate container 7f01a4da3209
     ---> fc26d7967402
    Successfully built fc26d7967402

此输出表明,在步骤1/3中,它获取了基本的高山图像,在步骤2/3中,向其添加了一层redis,然后在第3/3步中,无论何时容器都执行了redis-server命令开始。 RUN命令仅在映像正在构建过程中执行。

对输出的进一步解释超出了此问题的范围。

因此,当您从Docker中心提取映像时,它仅具有运行基本要求的配置。当您需要向映像添加自己的要求和配置时,可以创建一个Dockerfile并在基础映像上逐层添加依赖项以根据需要运行它。

答案 2 :(得分:1)

简单来说,我可以解释一下......我们以类似的方式为我们的应用程序使用某些库和节点包,我们可以使用已经制作的基本图像并使用它们进行简单搜索。你也可以定义自己的基本图像并使用它。

答案 3 :(得分:1)

enter image description here来自Docker docs

“容器不过是一个正在运行的进程,已对其应用了一些添加的封装功能,以使其与主机和其他容器隔离。

容器隔离最重要的方面之一是*每个容器都与自己的私有文件系统交互;此文件系统由Docker映像(任何Linux操作系统的映像-也是 Base映像 )提供。”最终映像可能包括多层,这些层只是一些其他文件系统更改。就像运行Java应用程序一样,您可以在基本Linux映像的顶部放置一个JDK层。

*积分:图片取自Educative.io