概述

在处理容器化应用程序时,我们可能想知道Docker Compose和Kubernetes在这方面的角色是什么。

在本教程中,我们将讨论一些最常见的用例,以便观察两者之间的差异。

1. Docker Compose

Docker Compose 是一个命令行工具,用于使用 YAML 模板定义运行多个 Docker 容器。我们可以从现有镜像或特定上下文构建容器。

我们可以添加 compose 文件格式的版本 和至少一个 服务。可选地,我们可以添加 网络。此外,我们可以定义依赖关系和环境变量。

1.1 Docker Compose 模板

让我们创建一个 docker-compose.yml 文件来连接到 Postgres 数据库的 API:

version: '3.8'
services:
  db:
    image: postgres:latest
    restart: always
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    ports:
      - '5432:5432'
    volumes: 
      - db:/var/lib/postgresql/data
    networks:
      - mynet

  api:
    container_name: my-api
    build:
      context: ./
    image: my-api
    depends_on:
      - db
    networks:
      - mynet
    ports:
      - 8080:8080
    environment:
      DB_HOST: db
      DB_PORT: 5432
      DB_USER: postgres
      DB_PASSWORD: postgres
      DB_NAME: postgres

networks:
  mynet:
    driver: bridge

volumes:
  db:
    driver: local

最后,我们可以通过运行以下内容在当地或生产环境中开始工作:

docker-compose up

1.2 Docker Compose 常见用例

我们通常使用 Docker Compose 创建微服务基础设施环境,其中不同的服务通过网络链接在一起。

此外,Docker Compose 广泛用于为测试套件创建和销毁隔离的测试环境。

此外,如果我们对可扩展性感兴趣,可以看看 Docker Swarm - Docker 创建的一个项目,用于在 Kubernetes 类似级别的编排。

然而,与 Kubernetes 相比,Docker Swarm 的功能有限。

2. Kubernetes

Kubernetes(也称为 K8s)自动化了在容器化和集群环境中部署和管理应用程序。Google 初始的工作从开源发展到 Linux 基金会捐赠,并最终作为种子技术开始云原生计算基金会 (CNCF) 的一部分。

在容器时代,Kubernetes 获得了相当大的关注,以至于它现在是最流行的分布式系统编排器。

提供了一个 API 来描述 Kubernetes 对象的规范和状态。它还允许与第三方软件集成。

在 Kubernetes 中,不同 组件 是集群的一部分,集群由一组称为 节点 的工作机器组成。节点在名为 Pods 的容器中运行我们的容器化应用程序。

Kubernetes 关于管理部署在 Pods 上的虚拟机或 节点 的艺术品。节点及其运行的容器都被分组为一个集群,每个容器都有端点、DNS、存储和可扩展性。

Pods 是非永久资源。例如,部署 可以动态地创建和销毁它们。通常,我们可以将应用暴露为 服务 在相同的端点上始终可用。

2.1 Kubernetes 模板

Kubernetes 提供了 声明式或命令式 方法,因此我们可以使用模板来创建、更新、删除甚至缩放对象。例如,让我们定义一个 部署 的模板:

-- Postgres Database
apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgresql
  namespace: Database
spec:
  selector:
    matchLabels:
      app: postgresql
  replicas: 1
  template:
    metadata:
      labels:
        app: postgresql
    spec:
      containers:
        - name: postgresql
          image: postgresql:latest
          ports:
            - name: tcp
              containerPort: 5432
          env:
            - name: POSTGRES_USER
              value: postgres
            - name: POSTGRES_PASSWORD
              value: postgres
            - name: POSTGRES_DB
              value: postgres
          volumeMounts:
        - mountPath: /var/lib/postgresql/data
          name: postgredb
      volumes:
        - name: postgredb
          persistentVolumeClaim:
            claimName: postgres-data

-- My Api
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-api
  namespace: Api
spec:
  selector:
    matchLabels:
      app: my-api
  replicas: 1
  template:
    metadata:
      labels:
        app: my-api
    spec:
      containers:
        - name: my-api
          image: my-api:latest
          ports:
            - containerPort: 8080
              name: "http"
          volumeMounts:
            - mountPath: "/app"
              name: my-app-storage
          env:
            - name: POSTGRES_DB
              value: postgres
            - name: POSTGRES_USER
              value: postgres
            - name: POSTGRES_PASSWORD
              value: password
          resources:
            limits:
              memory: 2Gi
              cpu: "1"
      volumes:
        - name: my-app-storage
          persistentVolumeClaim:
            claimName: my-app-data

然后,我们可以使用 kubectl 命令行在网络上的对象进行操作。

2.2 Kubernetes 和云提供商

Kubernetes 不是基础设施即代码 (IaC) 本身。但它与云提供商的容器服务集成 - 例如,亚马逊的 ECS 或 EKS、Google 的 GKE 和 RedHat 的 OpenShift

或者,我们可以使用诸如 Helm 这样的工具。

我们通常在公共云基础设施中看到 Kubernetes。但是,我们可以设置 Minikube 或本地 Kubeadm 集群。

CNCF 批准的 K3s 也是轻量级的 K8s 版本。

3. Docker Compose 与 Kubernetes 的差异

虽然 Docker Compose 关于创建和启动一个或多个容器,但 Kubernetes 更像是一个平台,用于创建可以编排容器的网络。

Kubernetes 已经能够解决应用程序管理中的许多关键问题:

  • 资源优化
  • 容器的自我恢复
  • 应用程序重部署期间的停机时间
  • 自动缩放

最后,Kubernetes 将多个孤立的容器提升到一个资源始终可用且具有潜在最优分布的阶段。

然而,在开发过程中,Docker Compose 可以配置所有应用程序服务的依赖项以开始,例如我们的自动化测试。因此,它是本地开发的强大工具。

4. 结论

在本文中,我们看到了 Docker Compose 和 Kubernetes 之间的差异。Docker Compose 可以帮助我们需要定义并运行多容器 Docker 应用程序时。

Kubernetes 是一个强大的且复杂的框架,用于在集群环境中管理容器化应用程序。