我已浏览Docker文档的每一页。
我还不明白为什么在安装/创建应用程序环境之前需要“基本映像”(例如,Ubuntu Base Image)来提供容器。
我的问题:
答案 0 :(得分:8)
实际上,Docker通过应用添加到基本图像的图层来工作。由于必须保持所有这些层之间的一致性,因此不能将第一个图像基于移动目标(即可写文件系统)。因此,您需要一个永远保持不变的只读图像。
由于Docker使用Union File System,因此进程认为整个文件系统是以读写方式挂载的。但所有更改都转到最顶层的可写层,而在下面,只读图像中的原始文件不变。由于图像不会改变,因此图像没有状态。
答案 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)
来自Docker docs,
“容器不过是一个正在运行的进程,已对其应用了一些添加的封装功能,以使其与主机和其他容器隔离。
容器隔离最重要的方面之一是*每个容器都与自己的私有文件系统交互;此文件系统由Docker映像(任何Linux操作系统的映像-也是 Base映像 )提供。”最终映像可能包括多层,这些层只是一些其他文件系统更改。就像运行Java应用程序一样,您可以在基本Linux映像的顶部放置一个JDK层。
*积分:图片取自Educative.io