Docker File 与 Docker Compose:有什么区别?

我见过很多人对 Dockerfile 和 Compose 文件感到困惑。 这主要是因为两者都用于以某种方式修改 Docker 映像,尽管它在技术上并不正确。

这两个术语很容易混淆,但在与同事或您的(潜在)雇主进行对话时,也有必要了解它们的区别。

Dockerfile 用于创建容器映像,而 Compose 文件用于将该映像的实例部署为容器。

让我详细介绍一下,以便您正确理解 Docker Compose 和 Dockerfile.

什么是 Dockerfile?

我喜欢称 Dockerfile 为容器镜像的前身。 您从 Dockerfile 构建映像。 典型的 Dockerfile 包含特殊的构建指令,例如 RUN, ADD, COPY, ENTRYPOINT, ETC。

采取 example 以下:

FROM alpine:latest

RUN apk add --no-cache fortune

ENTRYPOINT ["fortune"]

每行都以构建组件的指令开始。 这些说明不一定必须用大写字母书写。 以下与前一个一样有效。

from alpine:latest

run apk add --no-cache fortune

entrypoint ["fortune"]

从此 Dockerfile,您现在可以构建容器映像(或 docker 映像)。 映像只是运行容器的模板,由多个只读层组成。 由于这不是关于容器映像的文章,因此我将避免过度解释该主题。

要从此 Dockerfile 构建映像,请使用 docker CLI,运行以下命令

docker build -t fortune:alpine .

这将构建一个标记的图像 fortune:alpine. 我不打算从这个图像创建一个容器,这是下一节的内容。

什么是 Compose 文件?

Compose 文件用于两种类型的部署:在非集群部署中使用 docker-compose 和集群部署 docker swarm.

为了区分这两种类型,我将把负责集群部署的 compose 文件称为堆栈文件。 稍后我将讨论堆栈文件。

撰写文件是一个名为的工具的一部分 docker-compose. 它是 docker 守护程序服务器的客户端应用程序,有点像 docker CLI 客户端,而不是输入整个 run 每次命令,用 docker-compose 您可以反复使用相同的 YAML 文件,并使用与第一次相同的配置部署相同的容器。

它更易读、更易维护、更直观。 一个 compose 文件可以包含多个容器部署配置。

撰写文件支持将成为用 Go 编写的默认 docker 客户端的一部分,作为命令行参数“docker compose”。 注意那里缺少的连字符。 它仍然是实验性的,所以在生产中使用 Python 版本,即 docker-compose 仍然被推荐。

让我们使用之前的图像,并使用 compose 文件部署该图像的一个实例。

version: "3.3"

services:
    fortune:
        image: "fortune:alpine"

Save 文件为 docker-compose.yml. 现在在同一目录中运行以下命令

docker-compose up

你不 不得不 将文件另存为 docker-compose.yml你可以随心所欲地保存它,但如果不是 docker-compose.yml 或者 docker-compose.yaml,请确保您使用 -f [FILENAME] 选项。

docker-compose -f docker-compose.yml up

等着看会发生什么。

知道是什么 fortune 是,阅读这篇文章关于 有趣的 Linux 命令.

什么是堆栈文件?

堆栈文件与具有相似语法和大多数内部选项的组合文件相同,但有一些例外。 堆栈文件用于将服务堆栈部署在一个 一群 簇。

您可以直接将以前的撰写文件重新用作堆栈文件。

首先,初始化集群。

docker swarm init

然后运行类似于以下的命令

docker stack deploy -c docker-compose.yml fortune

如果像这样部署,您需要通过查看服务日志来检查输出 docker service logs ....

包起来

Dockerfiles 和 Compose 文件有不同的用途。 如果我可以建立一个时间表,它看起来像这样

Dockerfile -> Docker Image -> Compose File -> Running Containers

初学者对这两个文件感到困惑还有另一个原因。 可以通过 Compose 文件指向一个 Dockerfile,然后就可以使用 docker-compose 构建图像。

为了 example你可以重写之前的 compose 文件,这样

version: "3.3"

services:
    fortune:
        build:
            context: '.'
            dockerfile: "./Dockerfile"
        image: "fortune:alpine"

现在你可以运行 docker-compose build 构建图像。 或者你也可以运行 docker-compose up --build 立即构建和运行容器。

在这里,Dockerfile 是通过 compose 文件传递​​的,乍一看,似乎是 compose 文件负责构建映像,但事实并非如此。

我希望这篇文章阐明了 Dockerfile 和 Compose 文件之间的区别。 如果您有任何疑问,请在下面的评论部分告诉我。