1. 概要

コンテナ化されたアプリケーションを扱う場合、このコンテキストでDockerComposeとKubernetesが果たす役割を知りたい場合があります。

このチュートリアルでは、2つの違いを確認するために、最も一般的な使用例のいくつかについて説明します。

2. DockerCompose

Docker Compose は、YAMLテンプレート定義を使用して複数のDockerコンテナーを実行するためのコマンドラインツールです。 既存のイメージまたは特定のコンテキストからコンテナーを構築できます。

作成ファイル形式のバージョンと少なくとも1つのサービスを追加できます。 オプションで、追加できますボリュームネットワーク。 また、依存関係と環境変数を定義できます。

2.1. DockerComposeテンプレート

PostgreSQLデータベースに接続するAPI用のdocker-compose.ymlファイルを作成しましょう。

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

2.2. DockerComposeの一般的なユースケース

通常、Docker Composeを使用して、ネットワークを介してさまざまなサービスをリンクするマイクロサービスインフラストラクチャ環境を作成します。

さらに、Docker Composeは、テストスイートの分離されたテスト環境を作成および破棄するために広く使用されています。

さらに、スケーラビリティに関心がある場合は、 Docker Swarm —Kubernetesのようなオーケストレーションレベルで動作するようにDockerによって作成されたプロジェクトを見ることができます。

ただし、Kubernetesと比較すると、DockerSwarmのサービスは限られています。

3. Kubernetes

Kubernetes (K8sとも呼ばれます)を使用すると、コンテナ化およびクラスター化された環境でのアプリケーションのデプロイと管理が自動化されます。 GoogleのK8に関する最初の作業は、オープンソースから Linux Foundation への寄付、そして最終的には Cloud Native Computing Foundation(CNCF)を開始するためのシードテクノロジーとして行われました。

コンテナの時代に、Kubernetesは、現在最も人気のある分散システムオーケストレーターであるという点で大きな注目を集めました。

完全なAPIを使用して、Kubernetesのオブジェクトの仕様とステータスを説明できます。 また、サードパーティのソフトウェアとの統合も可能です。

Kubernetesでは、異なるコンポーネントと呼ばれる一連のワーカーマシンで構成されるクラスターの一部ですノード。 The ノードコンテナ化されたアプリケーションを内部で実行していますポッド

Kubernetesは、仮想マシンまたはノードポッドにデプロイされたアーティファクトを管理することを目的としています。 ノードとそれらが実行するコンテナーはすべてクラスターとしてグループ化され、各コンテナーにはエンドポイント、DNS、ストレージ、およびスケーラビリティーがあります。

ポッドは非永続的なリソースです。 たとえば、 Deployment は、それらを動的に作成および破棄できます。 通常、アプリケーションを Services として公開して、常に同じエンドポイントで利用できるようにすることができます。

3.1. Kubernetesテンプレート

Kubernetesは宣言型または命令型のアプローチを提供するため、テンプレートを使用してオブジェクトを作成、更新、削除、さらにはスケーリングすることができます。 例として、Deploymentのテンプレートを定義しましょう。

-- 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 コマンドラインを使用して、ネットワーク経由でオブジェクトを使用できます。

3.2. Kubernetesとクラウドプロバイダー

Kubernetesは、Infrastructure-as-Code(IaC)自体ではありません。 ただし、AmazonのECSまたはEKS、GoogleのGKE、RedHatのOpenShiftなどのクラウドプロバイダーのコンテナーサービスと統合されます。

または、たとえば、Helmなどのツールで使用できます。

パブリッククラウドインフラストラクチャでKubernetesをよく目にします。 ただし、MinikubeまたはローカルKubeadmクラスターをセットアップできます。

また、CNCFによって承認されており、K8sの軽量バージョンであるK3sをチェックアウトできます。

4. KubernetesとDockerComposeの違い

Docker Composeは、1つまたは複数のコンテナーを作成して開始することを目的としていますが、Kubernetesは、コンテナーをオーケストレーションできるネットワークを作成するためのプラットフォームとしての役割を果たします。

Kubernetesは、アプリケーション管理における多くの重大な問題を促進することができました。

  • リソースの最適化
  • コンテナの自己修復
  • アプリケーションの再デプロイ中のダウンタイム
  • 自動スケーリング

最後に、Kubernetesは、複数の分離されたコンテナを、潜在的な最適な分散でリソースが常に利用できる段階に移行します。

ただし、開発に関しては、Docker Composeは、自動テストなどを開始するために、アプリケーションのすべてのサービス依存関係を構成できます。 したがって、これはローカル開発のための強力なツールです。

5. 結論

この記事では、DockerComposeとKubernetesの違いについて説明しました。 Docker Composeは、マルチコンテナーDockerアプリケーションを定義して実行する必要がある場合に役立ちます。

Kubernetesは、クラスター化された環境でコンテナー化されたアプリケーションを管理するための強力でありながら複雑なフレームワークです。