docker-compose で Docker コンテナを迅速にデプロイする方法

DockerBeginner
オンラインで実践に進む

はじめに

この包括的なチュートリアルでは、強力な docker-compose ツールを使用して Docker コンテナを迅速にデプロイする方法を学習します。Docker アーキテクチャの理解、Docker のインストールと設定、Docker Compose の開始手順を段階的に解説します。このチュートリアル終了までに、マルチコンテナアプリケーションを定義および設定し、Compose を使用して Docker コンテナをデプロイおよび管理し、Docker 環境を容易にスケールおよびネットワーク化できるようになります。「docker-compose up -d」の力を活用して、アプリケーションを迅速に起動させましょう!

Docker とコンテナ化の概要

Docker は、コンテナ化された環境内でアプリケーションの開発、デプロイ、管理を可能にする、人気のオープンソースプラットフォームです。コンテナ化は、アプリケーションとその依存関係を、コンテナと呼ばれる隔離された自己完結型の単位にパッケージ化および配布する方法です。

Docker とは何か?

Docker は、コンテナ内でアプリケーションを構築、デプロイ、実行するためのソフトウェアプラットフォームです。コンテナは、コード、ランタイム、システムツール、ライブラリなど、アプリケーションの実行に必要なすべてのものを含む、軽量で移植性があり、自己完結型の環境です。このアプローチにより、開発者のラップトップから本番サーバーまで、さまざまなコンピューティング環境でアプリケーションが同じように動作することを保証します。

Docker とコンテナ化の利点

  • 一貫性: コンテナは、基盤となるインフラストラクチャに関係なく、アプリケーションが同じように動作することを保証します。
  • スケーラビリティ: コンテナは、変化する需要に対応するために、容易にスケールアップまたはスケールダウンできます。
  • 効率性: コンテナは軽量であり、従来の仮想マシンよりもリソースを効率的に使用します。
  • 移植性: コンテナは、開発者のマシンから本番サーバーなど、さまざまなコンピューティング環境間で移動できます。
  • 隔離性: コンテナは高い隔離性を提供し、あるコンテナのプロセスが別のコンテナのプロセスに干渉しないようにします。

Docker アーキテクチャとコンポーネント

Docker のアーキテクチャは、いくつかの重要なコンポーネントで構成されています。

  • Docker エンジン: コンテナを管理するコアランタイム。
  • Docker イメージ: コンテナを作成するための設計図で、必要なファイル、ライブラリ、依存関係を含みます。
  • Docker コンテナ: アプリケーションを実行する Docker イメージのインスタンス。
  • Docker レジストリ: Docker イメージを保存および配布するためのリポジトリ。
graph TD
    A[Docker エンジン] --> B[Docker イメージ]
    A --> C[Docker コンテナ]
    A --> D[Docker レジストリ]

Docker のユースケース

Docker は、さまざまな業界やシナリオで広く使用されています。

  • Web アプリケーション: さまざまな環境で Web アプリケーションをデプロイおよびスケールする。
  • マイクロサービス: 小さく独立したサービスから構成される複雑で分散型のアプリケーションを構築および管理する。
  • 継続的インテグレーションとデプロイ: アプリケーションのビルド、テスト、デプロイを自動化する。
  • 機械学習とデータサイエンス: 機械学習モデルとデータ処理パイプラインをパッケージ化およびデプロイする。
  • IoT とエッジコンピューティング: ネットワークのエッジでアプリケーションとサービスをデプロイする。

Docker とコンテナ化の基本を理解することで、これらの強力なツールを活用して、アプリケーションの開発、デプロイ、管理プロセスを効率化できます。

Docker アーキテクチャとコンポーネントの理解

Docker エンジン

Docker エンジンは、Docker エコシステム全体を動かすコアランタイムです。Docker コンテナのライフサイクル(構築、実行、監視など)を管理する役割を担っています。Docker エンジンは、以下の主要なコンポーネントで構成されています。

  • Docker デーモン: イメージ、コンテナ、ネットワーク、ボリュームなどの Docker オブジェクトを管理するバックグラウンドプロセス。
  • Docker API: プログラムやツールが Docker デーモンとやり取りするために使用する API。
  • Docker CLI: ユーザーが Docker デーモンとやり取りするためのコマンドラインインターフェース。

Docker イメージ

Docker イメージは、Docker コンテナを作成するための設計図です。アプリケーションを実行するために必要なファイル、ライブラリ、依存関係を含んでいます。Docker イメージは、イメージを作成する手順を定義するテキストベースのスクリプトである Dockerfile を使用して構築されます。

以下の Dockerfile が例です。

FROM ubuntu:22.04
RUN apt-get update && apt-get install -y nginx
COPY index.html /var/www/html/
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

この Dockerfile は、Ubuntu 22.04 ベースイメージに基づいて新しいイメージを作成し、Nginx Web サーバーをインストールし、index.html ファイルをコンテナ内にコピーし、ポート 80 を公開し、Nginx サーバーの起動をデフォルトコマンドとして設定します。

Docker コンテナ

Docker コンテナは、Docker イメージのインスタンスです。アプリケーションを実行する、実行中の隔離された環境です。コンテナは軽量で移植性があり、アプリケーションとその依存関係を単一の自己完結型の単位にパッケージ化します。

docker run コマンドを使用して新しいコンテナを作成および実行できます。

docker run -d -p 80:80 --name my-nginx nginx

このコマンドは、Nginx イメージに基づいて新しいコンテナを作成し、ホストのポート 80 をコンテナのポート 80 にマッピングし、コンテナをデタッチモードで起動します。

Docker レジストリ

Docker レジストリは、Docker イメージを保存および配布するためのリポジトリです。Docker イメージをアップロード、ダウンロード、共有できます。最も一般的なパブリック Docker レジストリは Docker Hub です。プライベートレジストリも設定できます。

Docker アーキテクチャの主要なコンポーネントを理解することで、コンテナ化されたアプリケーションを効果的に構築、デプロイ、管理できます。

Docker のシステムへのインストールと設定

Ubuntu 22.04 への Docker インストール

Ubuntu 22.04 システムに Docker をインストールするには、以下の手順に従います。

  1. パッケージインデックスを更新し、必要な依存関係をインストールします。

    sudo apt-get update
    sudo apt-get install -y \
        ca-certificates \
        curl \
        gnupg \
        lsb-release
    
  2. 公式 Docker GPG キーを追加し、Docker リポジトリを追加します。

    sudo mkdir -p /etc/apt/keyrings
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
    echo \
      "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
      $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    
  3. Docker エンジン、containerd、Docker Compose パッケージをインストールします。

    sudo apt-get update
    sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
    
  4. docker version コマンドを実行してインストールを確認します。

    sudo docker version
    

Docker の設定

Docker のインストール後、ニーズに合わせて設定できます。一般的な設定タスクを以下に示します。

非ルートユーザーによる Docker の管理

デフォルトでは、Docker デーモンはルートユーザーとして実行されます。非ルートユーザーが Docker コマンドを実行できるようにするには、docker グループに追加できます。

sudo usermod -aG docker $USER
newgrp docker

Docker デーモンオプションの設定

/etc/docker/daemon.json ファイルを編集することで、Docker デーモンの動作をカスタマイズできます。たとえば、デフォルトのログドライバを変更するには:

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "5"
  }
}

Docker Compose の有効化

Docker Compose は、マルチコンテナアプリケーションを定義および実行するためのツールです。Docker のインストールの一部としてインストールされますが、手動で有効にする必要がある場合があります。

sudo systemctl enable docker-compose-plugin

これらの手順に従うことで、Ubuntu 22.04 システムに Docker を正常にインストールおよび設定し、Docker と Docker Compose を使用するための基盤を築くことができます。

Docker Compose の概要

Docker Compose とは?

Docker Compose は、マルチコンテナ Docker アプリケーションを定義および実行するためのツールです。アプリケーションを構成するサービス、ネットワーク、ボリュームを記述した YAML ファイルを作成し、単一の命令ですべてのサービスを起動、停止、管理できます。

Docker Compose のインストール

Docker Compose は、Ubuntu 22.04 上の Docker インストールの一部としてインストールされます。以下のコマンドを実行してインストールを確認できます。

docker-compose version

Docker Compose ファイルの作成

Docker Compose ファイルは、アプリケーションを構成するサービス、ネットワーク、ボリュームを定義する YAML ファイルです。以下は、Nginx Web サーバーと MySQL データベースを持つシンプルな Web アプリケーションを定義する例 docker-compose.yml ファイルです。

version: "3"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: password
    volumes:
      - mysql-data:/var/lib/mysql
volumes:
  mysql-data:

このファイルは、webdb の 2 つのサービスを定義しています。web サービスは最新の Nginx イメージを使用し、ポート 80 を公開し、ローカルの html ディレクトリを Nginx のドキュメントルートにマウントします。db サービスは MySQL 5.7 イメージを使用し、ルートパスワードを設定し、MySQL データ用の名前付きボリュームをマウントします。

Docker Compose アプリケーションの管理

docker-compose コマンドを使用して、Docker Compose アプリケーションを管理できます。一般的なコマンドを以下に示します。

  • docker-compose up -d: アプリケーションをデタッチモードで起動します。
  • docker-compose down: アプリケーションを停止および削除します。
  • docker-compose ps: 実行中のサービスを一覧表示します。
  • docker-compose logs: アプリケーションのログを表示します。
  • docker-compose scale web=3: web サービスを 3 つのインスタンスにスケールします。

Docker Compose を使用することで、マルチコンテナアプリケーションを簡単に定義、デプロイ、管理できます。これにより、Docker ワークフローを効率化するための強力なツールとなります。

マルチコンテナアプリケーションの定義と設定

Docker Compose でのサービス定義

Docker Compose ファイルでは、アプリケーションを構成する個々のコンテナを表す、アプリケーションのサービスを定義します。各サービスには、使用する Docker イメージ、環境変数、公開するポート、マウントするボリュームなどの独自の構成があります。

マルチサービスの Docker Compose ファイルの例を次に示します。

version: "3"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: password
    volumes:
      - mysql-data:/var/lib/mysql
  redis:
    image: redis:latest
    ports:
      - "6379:6379"
volumes:
  mysql-data:

このファイルは、webdbredis の 3 つのサービスを定義しています。各サービスには、使用する Docker イメージ、公開するポート、マウントするボリュームなどの独自の構成があります。

サービス間の依存関係の設定

Docker Compose ファイルで depends_on ディレクティブを使用して、サービス間の依存関係を定義できます。これにより、サービスが正しい順序で起動され、依存関係が満たされるまでサービスが起動されないようにします。

version: "3"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html
    depends_on:
      - db
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: password
    volumes:
      - mysql-data:/var/lib/mysql
volumes:
  mysql-data:

この例では、web サービスは db サービスに依存するため、Web サーバーが起動する前にデータベースが起動されます。

ネットワークとボリュームの設定

サービスの定義に加えて、Docker Compose ファイルでネットワークとボリュームを設定することもできます。ネットワークは、サービスが相互に通信できるようにし、ボリュームはアプリケーションデータの永続的なストレージを提供します。

version: "3"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html
    networks:
      - frontend
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: password
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - backend
volumes:
  mysql-data:
networks:
  frontend:
  backend:

この例では、web サービスは frontend ネットワークに接続され、db サービスは backend ネットワークに接続されます。これにより、Web サーバーはデータベースを直接パブリックインターネットに公開することなく、データベースと通信できます。

Docker Compose を使用してマルチコンテナアプリケーションを定義および設定する方法を理解することで、複雑でスケーラブルで保守可能なアプリケーションを容易に構築できます。

Docker Compose を使用した Docker コンテナのデプロイと管理

Docker Compose アプリケーションのデプロイ

Docker Compose アプリケーションをデプロイするには、docker-compose up コマンドを使用します。このコマンドは Docker Compose ファイルを読み込み、必要なネットワークとボリュームを作成し、指定されたサービスを起動します。

docker-compose up -d

-d フラグは、コンテナをバックグラウンドで実行するデタッチモードで実行します。

Docker Compose コンテナの管理

Docker Compose アプリケーションが実行されている場合、以下のコマンドを使用してコンテナを管理できます。

  • docker-compose ps: 実行中のコンテナを一覧表示します。
  • docker-compose logs: コンテナのログを表示します。
  • docker-compose stop: 実行中のコンテナを停止します。
  • docker-compose start: 停止したコンテナを起動します。
  • docker-compose down: コンテナ、ネットワーク、ボリュームを停止および削除します。

たとえば、web サービスのログを表示するには、以下のコマンドを使用します。

docker-compose logs web

Docker Compose サービスのスケーリング

Docker Compose は、サービスのスケーリングを容易にします。docker-compose scale コマンドを使用して、特定のサービスのインスタンス数を変更できます。

docker-compose scale web=3

このコマンドは、web サービスを 3 つのインスタンスにスケールします。

Docker Compose アプリケーションの更新

Docker Compose アプリケーションを更新する必要がある場合は、Docker Compose ファイルを変更し、docker-compose up コマンドを使用して変更を適用できます。

## Docker Compose ファイルを更新
vim docker-compose.yml

## 変更を適用
docker-compose up -d

Docker Compose は、新しいイメージを自動的にプルし、新しいコンテナを作成し、実行中のアプリケーションを更新します。

Docker Compose の力を活用することで、マルチコンテナアプリケーションを簡単にデプロイ、管理、スケーリングでき、開発およびデプロイプロセスをより効率的で信頼性の高いものにすることができます。

Docker コンテナのスケーリングとネットワーク

Docker コンテナのスケーリング

Docker を使用する主な利点の 1 つは、アプリケーションのスケーリングを容易に調整できることです。Docker Compose は scale コマンドを提供することで、このプロセスをさらに簡素化します。

Docker Compose アプリケーションでサービスをスケールするには、次のコマンドを使用します。

docker-compose scale web=3

これにより、web サービスが 3 つのインスタンスにスケールされます。スケールするサービスの名前を web の代わりに置き換えることで、アプリケーション内の任意のサービスをスケールできます。

Docker コンテナのネットワーク

Docker Compose は、アプリケーションのデフォルトネットワークを自動的に作成しますが、サービス間の通信方法を制御するためにカスタムネットワークを定義することもできます。

カスタムネットワーク frontendbackend を定義する Docker Compose ファイルの例を次に示します。

version: "3"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    networks:
      - frontend
  app:
    image: myapp:latest
    networks:
      - frontend
      - backend
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: password
    networks:
      - backend
networks:
  frontend:
  backend:

この例では、web サービスと app サービスは frontend ネットワークに接続され、app サービスと db サービスは backend ネットワークに接続されます。これにより、Web サーバーはアプリケーションと通信し、アプリケーションはデータベースと通信できます。データベースを直接パブリックインターネットに公開する必要はありません。

ネットワークレベルの設定(IP アドレス範囲や DNS 設定など)は、Docker Compose ファイルの networks セクションを使用して構成できます。

Docker コンテナのスケーリングとネットワーク化の方法を理解することで、変化する需要や要件に対応できる、高可用性、スケーラブル、安全なアプリケーションを構築できます。

Docker デプロイと保守のためのベストプラクティス

Docker イメージの最適化

  • イメージサイズと攻撃対象領域を削減するために、最小限のベースイメージ(例:alpine または scratch)を使用する。
  • 最終イメージサイズを最適化するために、マルチステージビルドを活用する。
  • ベースイメージと依存関係を定期的に更新することで、イメージを最新の状態に保つ。
  • dive などのツールを使用して、Docker イメージを分析および最適化する。

セキュアなプラクティスの実装

  • イメージのプルに信頼性の高い公式 Docker レジストリ(例:Docker Hub)を使用する。
  • Snyk や Trivy などのツールを使用して、イメージの脆弱性をスキャンする。
  • コンテナを非ルートユーザーとして実行することで、最小特権の原則を適用する。
  • Docker Content Trust を有効にして、イメージの整合性と真正性を検証する。
  • Docker デーモンとコンテナのセキュリティ設定をベストプラクティスに従って構成する。

ビルドとデプロイプロセスの自動化

  • LabEx などの継続的インテグレーション (CI) ツールを使用して、Docker アプリケーションのビルド、テスト、デプロイを自動化する。
  • Docker Compose ファイルをバージョン管理システムに格納することで、GitOps ワークフローを実装する。
  • 環境固有の構成ファイルまたは環境変数を使用して、異なるデプロイ環境を管理する。

Docker 環境の監視と保守

  • Docker コンテナとホストのログと監視を設定する。
  • Prometheus、Grafana、または LabEx などのツールを使用して、コンテナとシステムのメトリクスを監視する。
  • Docker Compose ファイルとコンテナ構成を定期的に確認および更新する。
  • コンテナの障害と再起動を適切に処理するためのプロセスを実装する。

Docker エコシステムツールの活用

  • Docker Swarm または Kubernetes を使用して、大規模な Docker コンテナのオーケストレーションと管理を行う。
  • Docker Secrets、Docker Volumes、Docker Networks などのツールを調査して、Docker デプロイを強化する。
  • LabEx やその他の DevOps プラットフォームを統合して、Docker ベースのワークフローを効率化する。

これらのベストプラクティスに従うことで、Docker デプロイを安全、効率的、かつ保守可能なものにすることができ、Docker プラットフォームを最大限に活用できます。

まとめ

このチュートリアルでは、docker-compose ツールを使用して Docker コンテナを迅速にデプロイする方法を学びました。Docker アーキテクチャを探索し、Docker をインストールおよび構成し、マルチコンテナアプリケーションの定義と構成をマスターしました。"docker-compose up -d" の力を活用することで、Docker 環境を簡単にデプロイおよび管理し、アプリケーションをスケールし、最適なネットワークを確保できるようになりました。このチュートリアルで得られた知識があれば、Docker デプロイプロセスを効率化し、コンテナ化の取り組みを新たな高みに引き上げることができます。