为什么使用Docker时需要基础镜像?

24

我已经阅读了Docker的所有文档页面。

但我仍然不理解为什么需要提供"基础镜像"(例如Ubuntu Base Image)来在容器中安装/创建应用环境。

我的问题:

  • 什么是基础镜像,它为什么是必须的?
  • 为什么不能像Python的virtualenv一样直接创建容器并将应用程序放入其中?
4个回答

14
实际上,Docker 通过应用添加到基础镜像的层来工作。由于您必须在所有这些层之间保持一致性,因此您不能将第一个镜像基于移动目标(即可写文件系统)。因此,您需要一个只读镜像,它将永远保持不变。
以下是 Docker 关于 images 的文档摘录:
“由于 Docker 使用联合文件系统,进程认为整个文件系统都已挂载为可读写。但是,所有更改都会进入最顶层的可写层,并且在其下方,只读镜像中的原始文件未更改。由于镜像不会更改,因此镜像没有状态。”

enter image description here


1
所以基础镜像是一个带有Docker容器的操作系统镜像?这是否意味着使用Ubuntu基础镜像创建的容器可以在基于RHEL的系统上运行?谢谢! - Phil
1
是的,您可以使用任何基础镜像版本,无论您的主机是什么。 - perror

5

一张图片只是文件系统和依赖项的快照,或者是特定应用程序/软件的一组目录。所谓快照,是指在容器环境中仅复制运行该软件所需的那些文件(例如mysql、redis等)及基本配置。当您使用图像创建容器时,系统的一小部分资源将通过命名空间和cgroups被隔离,然后将图像内的文件复制到这个隔离的资源环境中。

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

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

假设您想要一个运行redis的映像(这是一个愚蠢的例子,您可以通过其他方式达到相同的效果,但只是为了说明,请认为您在docker hub上找不到该映像)。您需要一个起点来创建该映像。因此,我们以Alpine镜像作为基础图像。

Alpine是最轻的镜像,仅包含运行基本命令的文件(例如:ls、cd、apk add在容器内)。

使用以下命令创建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

该输出显示在Step 1/3中,它使用基本的alpine镜像,在Step 2/3中,增加了一层redis,并在每次启动容器时在Step 3/3中执行redis-server命令。RUN命令仅在构建镜像过程中执行。

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

因此,当您从Docker Hub下载一个镜像时,它只有运行基本要求的配置。 当您需要向镜像添加自己的要求和配置时,您需要创建一个Dockerfile并逐层添加依赖项到基本镜像上,以根据您的需求运行它。


1
简单来说,就是我们在应用程序中使用某些库和节点软件包的方式类似,我们可以使用已经制作好的基础镜像,并通过简单的搜索来使用它们。您还可以定义自己的基础镜像并加以利用。

1

这里输入图片描述来自Docker文档,

"容器只是一个运行的进程,通过添加一些封装特性对其进行隔离,以使其与主机和其他容器隔离开来。

容器隔离最重要的方面之一是*每个容器都与其自己的私有文件系统交互;这个文件系统是由Docker镜像(像任何Linux操作系统的镜像一样——也是基础镜像)提供的。" 最终镜像可能包括多个层,这些层仅仅是一些其他文件系统更改。例如,运行Java应用程序时,您可以在基础Linux镜像上放置JDK层。

*鸣谢:图片来自Educative.io


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接