【Docker基礎】Docker ComposeとDockerfileの違い

 Dockerを効果的に活用するためには、Docker ComposeDockerfileという二つの重要なツールを理解することが不可欠です。これらは名前が似ているために混同されやすいですが、それぞれ異なる目的と機能を持っています。ここでは、Docker ComposeとDockerfileの違いについて詳しく解説し、どのような場面でどちらを使用すべきかを明確にします。

1.Docker Composeとは

1.1 Docker Composeの基本概念

 Docker Composeは、複数のDockerコンテナを一括で定義・管理・実行するためのツールです。YAML形式の定義ファイル(通常はdocker-compose.yml)に、必要なコンテナやその設定、ネットワーク、ボリュームなどを記述することで、複雑なマルチコンテナ環境をシンプルに構築・運用することが可能になります。

1.2 Docker Composeの利便性

  • 一括管理: 複数のコンテナを一つのコマンドで起動・停止・削除できます。
  • 再現性の確保: 定義ファイルにより、どの環境でも同じ設定でコンテナを展開できます。
  • 依存関係の管理: コンテナ間の依存関係を明確に定義し、順序通りに起動できます。
  • ネットワークとボリュームの統合管理: ネットワークやボリュームも一緒に定義・管理できます。

2.Dockerfileとは

2.1 Dockerfileの基本概念

 Dockerfileは、単一のDockerイメージをビルドするための設定ファイルです。テキストベースで、ベースとなるイメージの指定や、必要なパッケージのインストール、アプリケーションのコピー、実行コマンドの設定などを記述します。Dockerfileを基に、docker buildコマンドを使用してカスタマイズされたイメージを作成します。

2.2 Dockerfileの利便性

  • カスタムイメージの作成: 特定の要件に合わせたDockerイメージを簡単に作成できます。
  • バージョン管理: Dockerfileはコードとして管理できるため、変更履歴の追跡が容易です。
  • 自動化: CI/CDパイプラインと連携させて、自動的にイメージをビルド・テスト・デプロイすることが可能です。

3.Docker ComposeとDockerfileの違い

3.1 目的の違い

項目Docker ComposeDockerfile
主な目的複数のコンテナとその周辺環境(ネットワーク、ボリュームなど)を一括で管理・運用する単一のDockerイメージをビルド・カスタマイズする
使用する場面マルチコンテナアプリケーションのデプロイ、開発環境の構築アプリケーションの依存関係を含むカスタムイメージの作成

3.2 機能の違い

機能Docker ComposeDockerfile
コンテナの起動・停止一括で行える個別にdocker rundocker stopを使用する
ネットワークの設定YAMLファイル内で定義可能Dockerfileでは設定不可
ボリュームの設定YAMLファイル内で定義可能Dockerfileでは設定不可
イメージのビルドdocker-compose buildでビルド可能(Dockerfileに依存)docker buildで直接ビルド
依存関係の管理depends_onを使用してコンテナ間の依存関係を定義可能Dockerfileでは依存関係の管理が不可
定義ファイルの形式YAML形式各種Dockerコマンドを記述したテキストファイル

3.3 具体的な使用例

Docker Composeを使用した場合

version: '3'
services:
  db:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpressuser
      MYSQL_PASSWORD: userpass
  wordpress:
    image: wordpress:latest
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_NAME: wordpress
      WORDPRESS_DB_USER: wordpressuser
      WORDPRESS_DB_PASSWORD: userpass
    depends_on:
      - db
volumes:
  db_data:

Dockerfileを使用した場合

FROM ubuntu:20.04
COPY ./myapp /usr/src/myapp
RUN apt-get update && apt-get install -y python3
CMD ["python3", "/usr/src/myapp/app.py"]

3.4 Docker ComposeとKubernetesの違い

項目Docker ComposeKubernetes
主な目的ローカル環境や小規模なデプロイメント向けのマルチコンテナ管理大規模なクラスタ環境でのコンテナオーケストレーション
管理機能コンテナの起動・停止・ネットワーク・ボリューム管理のみ自動スケーリング、自己修復、ロードバランシングなど高度な管理機能
学習曲線比較的容易複雑で高度
使用規模開発環境、小規模な本番環境大規模な本番環境

図:Docker ComposeとKubernetesの比較

Docker Compose
   ├── コンテナ1
   ├── コンテナ2
   ├── ネットワーク
   └── ボリューム

Kubernetes
   ├── Pod
   │    ├── コンテナ1
   │    └── コンテナ2
   ├── Service
   ├── Deployment
   └── Volume

4.Docker ComposeとDockerfileの使い分け

4.1 使用シーンに応じた選択

シーン推奨ツール理由
単一アプリケーションのカスタムイメージ作成Dockerfileイメージのビルドとカスタマイズに特化しているため
マルチコンテナ環境の管理と運用Docker Compose複数のコンテナやその設定を一括で管理できるため
大規模なクラスタ環境のオーケストレーションKubernetes自動スケーリングや自己修復など高度な管理機能が必要な場合

4.2 実際の運用における組み合わせ

 多くのプロジェクトでは、DockerfileとDocker Composeを組み合わせて使用します。Dockerfileで各コンテナのカスタムイメージを作成し、Docker Composeでそれらのコンテナを一括で管理・運用します。これにより、個々のイメージのカスタマイズとマルチコンテナ環境の管理の両方を効率的に行うことができます。

Docker ComposeとDockerfileのまとめ

項目Docker ComposeDockerfile
目的マルチコンテナ環境の定義・管理・運用単一のカスタムDockerイメージのビルド・設定
定義ファイルの形式YAML形式 (docker-compose.yml)テキストファイル (Dockerfile)
主な機能コンテナの一括起動・停止、ネットワーク・ボリューム管理イメージのベース設定、パッケージのインストール、ファイルのコピー
依存関係の管理可能不可
使用するコマンドdocker-compose up, docker-compose downdocker build, docker run
適用範囲開発環境、小規模な本番環境イメージ作成時

 これらの違いを理解し、適切に使い分けることで、Dockerをより効果的に活用し、開発から本番環境へのデプロイまでのプロセスを効率化することができます。次章では、Docker Composeの具体的な使い方について詳しく解説し、実際のプロジェクトでの適用方法を学びます。引き続き、Dockerの学習を進めていきましょう。