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

为什么你需要Docker的基本图像?,docker,Docker,我已经浏览了该文件的每一页 我仍然不明白,为什么在安装/创建应用程序环境之前,需要“基本映像”(例如,Ubuntu基本映像)来提供容器 我的问题是: 什么是基础映像?为什么需要它 为什么不能像Python的virtualenv那样创建一个容器并将应用程序放入其中 事实上,它通过应用添加到基础图像的层来工作。由于您必须保持所有这些层之间的一致性,因此您不能将第一幅图像基于移动目标(即您的可写文件系统)。因此,您需要一个永远保持不变的只读映像 以下是关于以下内容的文档摘录: 由于Docker使用U

我已经浏览了该文件的每一页

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

我的问题是:

  • 什么是基础映像?为什么需要它
  • 为什么不能像Python的virtualenv那样创建一个容器并将应用程序放入其中
事实上,它通过应用添加到基础图像的层来工作。由于您必须保持所有这些层之间的一致性,因此您不能将第一幅图像基于移动目标(即您的可写文件系统)。因此,您需要一个永远保持不变的只读映像

以下是关于以下内容的文档摘录:

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


简单地说,我可以解释..当我们以类似的方式为应用程序使用某些库和节点包时,我们可以使用已经制作好的基本图像,并将其用于简单搜索。您还可以定义自己的基本图像并加以利用。

来源:

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

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


*信用:从

拍摄的图像图像只是文件系统和依赖项的快照,或者是特定应用程序/软件的特定目录集。我所说的快照,是指在容器环境中使用基本配置运行该软件(例如mysql、redis等)所需的文件的副本。当您使用映像创建容器时,系统中的一小部分资源在名称空间cgroups的帮助下被隔离,然后映像中的文件被复制到这个隔离的资源环境中

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

基本图像是我们最终要创建的图像的起点或初始步骤

假设您想要一个运行redis的图像(这是一个愚蠢的示例,您可以通过另一种方式实现它,但为了解释起见,您认为您不会在docker hub上找到该图像),您需要一个起点来创建该图像。所以,让我们把阿尔卑斯山的图像作为基础图像。 Alpine是最轻的图像,其中包含仅用于运行基本命令的文件(例如:ls、cd、apk add in the container)

使用以下命令创建Dockerfile:

现在,当您运行
docker build.
命令时,它会给出以下输出:

此输出显示,在步骤1/3中,它获取基本alpine图像,在步骤2/3中,向其添加一层redis,然后在启动容器时执行步骤3/3中的
redis server
命令。
RUN
命令仅在生成映像时执行

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


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

那么,基础映像是一个与Docker容器一起打包的OS映像吗?这是否意味着使用Ubuntu基本映像创建的容器将在基于RHEL的系统上运行?谢谢是的,你可以使用任何风格的基础形象,无论是你的主机。
FROM alpine
RUN apk add --update redis
CMD ["redis-server"]
    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