1. 简介

随着越来越多的应用迁移到云平台,一些术语也变得越来越复杂,容易让人混淆。

本文将深入讲解 Docker、Dockerfile 和 Docker Compose 三者之间的区别,帮助你理解它们各自的角色和使用场景。


2. Docker

Docker 是现代云平台中最核心的组件之一,它是一个容器引擎,可以让我们将应用程序与其运行的基础设施进行高效、安全的隔离。

换句话说,Docker 允许我们在一个虚拟化环境中运行任何应用,无论我们使用的是哪种硬件或操作系统。这意味着我们可以统一开发、测试和生产环境,从而减少“在我机器上能跑”的问题。

Docker 的核心组成部分包括:

  • Daemon:Docker 守护进程负责监听 API 请求,管理镜像、容器等资源
  • Client:Docker 客户端是我们与 Daemon 交互的命令行工具
  • Desktop:专为 Mac 和 Windows 提供的桌面版 Docker,简化了 Daemon 的操作

Docker 中还有一些关键对象需要了解:

  • Image(镜像):包含运行应用所需所有文件的自包含文件,镜像由多个层组成
  • Container(容器):镜像的可运行实例,通常彼此隔离,但可通过网络或卷进行通信
  • Registry(镜像仓库):用于存储镜像,可以是私有或公有仓库,支持认证
  • Volume(卷):一种文件系统,供一个或多个容器使用,支持持久化和临时存储
  • Network(网络):允许容器之间通过标准网络协议(如 TCP/IP)通信

了解完 Docker 的基本概念后,我们来看两个与之密切相关的工具:Dockerfile 和 Docker Compose。


3. Dockerfile

Dockerfile 是一个纯文本文件,用于定义如何构建 Docker 镜像。Docker 守护进程会根据 Dockerfile 中的指令一步步构建出镜像。

一个典型的 Dockerfile 通常以一个基础镜像开始,比如某个操作系统或 Java 环境,然后执行以下操作:

  • ✅ 从宿主机复制文件到容器中(如 JAR 包)
  • ✅ 执行任意命令(如修改权限、安装软件包)
  • ✅ 指定容器启动时运行的命令(如运行 Java 应用)

示例 Dockerfile

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

这个 Dockerfile 基于 openjdk:17-alpine 镜像构建,复制本地的 my-app.jar 文件,并指定容器启动时运行该 JAR 包。

⚠️ 注意:Dockerfile 只是构建镜像的一种方式,还可以使用 Buildpacks 等工具自动构建镜像,无需编写 Dockerfile。


4. 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 应用。同时定义了一个卷 db_data,供数据库容器使用,还暴露了相应的端口。

⚠️ 注意:Dockerfile 和 Docker Compose 并不互斥,可以一起使用。Docker Compose 支持在 build 字段中指定 Dockerfile,用于构建镜像后再启动容器。

此外,Docker Compose 主要用于本地开发或单主机部署。如果你需要管理更大规模的容器集群,可以考虑使用 Kubernetes、OpenShift 或 Apache Mesos。


5. 总结

Docker、Dockerfile 和 Docker Compose 虽然密切相关,但它们各自承担不同的职责:

工具 职责
✅ Docker 容器引擎,负责镜像和容器的运行与管理
✅ Dockerfile 定义如何构建镜像
✅ Docker Compose 编排多个容器,简化多服务应用的部署

理解它们之间的区别和协作方式,有助于你在云原生开发中做出更合理的技术选型。


原始标题:Difference Between Docker, Dockerfile, and Docker Compose

» 下一篇: Podman 简介