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

Phi*_*hil 11 docker

我已经浏览了Docker文档的每一页.

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

我的问题:

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

per*_*ror 11

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

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

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

在此输入图像描述


ary*_*eer 5

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

让我们了解一下什么是基础镜像:

基础镜像是我们最终想要创建的镜像的起点或初始步骤。

假设你想要一个运行 redis 的镜像(这是一个愚蠢的例子,你可以通过另一种方式实现它,但为了解释起见,你不会在 docker hub 上找到该镜像)你需要一个起点来创建镜像为了那个原因。因此,让我们以 Alpine 图像作为基础图像。Alpine 是最轻的映像,包含仅用于运行基本命令的文件(例如:在容器内添加 ls、cd、apk)。

使用以下命令创建 Dockerfile:

FROM alpine
RUN apk add --update redis
CMD ["redis-server"]
Run Code Online (Sandbox Code Playgroud)

现在,当您运行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
Run Code Online (Sandbox Code Playgroud)

此输出显示,在步骤 1/3 中,它采用了基础 alpine 镜像,在步骤 2/3 中,向其中添加了一层 redis,然后redis-server在容器启动时执行步骤 3/3 中的命令。RUN命令仅在镜像构建过程中执行。

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

因此,当您从 docker hub 拉取镜像时,它只具有运行基本要求的配置。当您需要向镜像添加自己的需求和配置时,您可以Dockerfile在基础镜像上创建并逐层添加依赖项,以根据您的需要运行它。