Docker, Dockerfile, 和Docker Compose区别 | Baeldung


随着越来越多的应用程序转移到云计算,术语有时会变得很混乱。

在这篇文章中,我们将谈论Docker、Dockerfile和Docker Compose之间的区别。

Docker
让我们先看看Docker,任何云计算平台的核心组件之一。Docker是一个容器引擎,它允许我们有效和安全地将我们的应用程序与它们所运行的基础设施分开。

这到底是什么意思?Docker允许我们在虚拟化环境中运行任何应用程序,使用我们想要的任何硬件或操作系统。这意味着我们可以在开发、测试和生产中为我们的应用程序使用相同的环境。

组成Docker的有几个关键组件。

  • 守护程序:Docker守护进程监听Docker API请求并管理对象,如图像/镜像image和容器。
  • 客户端:Docker客户端是向守护进程发布命令的主要界面。
  • 桌面:Docker桌面是适用于Mac和Windows的Docker专门版本,简化了与守护进程的互动。

此外,还有几个我们应该熟悉的Docker对象。
  • 镜像:镜像是一个独立的文件,包括运行一个应用程序的所有必要文件(包括操作系统和应用程序代码)。镜像有很多层,每一层都贡献了一组或多组文件和目录。
  • 容器:容器是图像的一个可运行的实例。容器通常是相互隔离的,尽管卷和网络可以让它们相互作用。
  • 注册表:注册表存储映像。它可以是私有的或公共的,并可选择要求认证。
  • 卷:卷是一个文件系统,可以提供给一个或多个容器使用。卷可以是持久性的,也可以是短暂性的(只在一个容器处于活动状态时持续存在)。
  • 网络:网络允许容器使用标准网络协议(TCP/IP)进行通信。

现在我们了解了Docker本身的基本概念,我们可以看看其他两个直接相关的技术。

Dockerfile
Dockerfile是一个纯文本文件,包含构建Docker镜像的指令。有一个Dockerfile标准,它们遵循的是Docker守护进程,而Docker守护进程最终负责执行Dockerfile并生成镜像。

一个典型的Dockerfile通常以包括另一个镜像开始。例如,它可能建立在一个特定的操作系统或Java分布。

从那里,Dockerfile可以执行各种操作来构建一个镜像。

  • 将文件从主机系统复制到容器中。例如,我们可能想复制一个包含我们的应用程序代码的JAR文件。
  • 运行相对于镜像的任意命令。例如,我们可能想运行典型的Unix命令来改变文件权限或使用包管理器安装新的包。
  • 定义创建容器时应该执行的命令。例如,一个java命令可以加载我们的JAR文件并启动所需的main方法。

案例:
FROM openjdk:17-alpine
ARG JAR_FILE=target/my-app.jar
COPY ${JAR_FILE} my-app.jar
ENTRYPOINT ["java","-jar","/my-app.jar"]

这个例子基于现有的OpenJDK 17 Alpine镜像创建了一个Docker镜像。然后,它将一个编译好的JAR文件复制到镜像中,并将启动命令定义为带有-jar选项的java命令以及我们编译好的JAR文件。

值得注意的是,Dockerfile只是创建Docker镜像的一种方式。其他工具,如Buildpacks,可以帮助我们自动将代码编译成Docker镜像的过程,而不需要使用Dockerfiles。

Docker Compose
Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。使用YAML配置文件,Docker Compose允许我们在一个地方配置多个容器。然后,我们可以用一条命令一次性启动和停止所有这些容器。

此外,Docker Compose允许我们定义容器共享的共同对象。例如,我们可以一次性定义一个卷,然后把它挂在每个容器里,这样它们就可以共享一个共同的文件系统。或者,我们可以定义一个或多个容器用来通信的网络。
案例:

version: "3.9"
services:
  database:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
    ports:
      - "3306:3306"
  web:
    image: my-application:latest
    ports:
      - "80:5000"
volumes:
  db_data: {}

这将启动两个容器:一个MySQL数据库服务器和一个Web应用程序。它定义了一个由数据库容器使用的卷。此外,它还定义了每个容器应该暴露哪些端口,以便网络流量可以到达它们。

Dockerfiles和Docker Compose并不相互排斥。事实上,它们在一起工作得相当好。Docker Compose提供了一个构建指令,我们可以在启动容器之前使用它来构建我们的Dockerfiles。

最后,请记住,Docker Compose只是一个协调多个容器的工具。其他选择包括Kubernetes、Openshift和Apache Mesos。