【超便利】docker-composeの基本|実例付きで丁寧に解説

※本サイトにはプロモーション・広告が含まれています。

(最終更新日:2023年8月)

✔当記事が対象とする読者

「Docker Composeの機能について詳しく知りたい」
「Docker Composeの具体的な使い方を学びたい」
「Docker Composeを用いた実際の事件を参照したい」

✔当記事を通じてお伝えする内容

  • Docker Composeの基本知識
  • Docker Composeの適用方法とその進行
  • Docker Composeを利用した具体的な事例

当記事では、Docker Composeの基本概念から、さらなるオプションによる効果的な使い方まで、実際のサンプルを交えて詳細に解説して参ります。

ぜひ最後までご覧いただき、docker composeの基礎をマスターしましょう。

筆者プロフィール

筆者プロフィールアイコン

【現職】プロダクトマネージャー

【副業】ブログ(月間20万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。現在はプロダクトマネージャーとして、さまざまな関係者の間に入り奮闘してます。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

Docker Composeとは

まずは、Docker Composeの基本的な概念を理会しましょう。

基本を理解のうえ、先の使い方へと進んでいきます。

  • 独自のイメージと既存のイメージの使い方
  • Docker Composeの基本概念
  • Docker Composeの主要な特性

独自のイメージと既存のイメージの使い方

Docker Composeを使用すると、独自のイメージを作成したり、Docker Hubなどのレジストリから既存のイメージを取得したりが可能です。

  • build:独自イメージ(Dockerfile)による作成
  • image:既存イメージによる作成

それぞれの例をご覧ください。

独自イメージでの作成例

以下に独自のイメージを作成する例を示します。

version: '3'
services:
  webapp:
    build: .

build: .の命令により、Dockerfileがカレントディレクトリにあると仮定して、DockerはそのDockerfileを使用して新しいイメージを作成します。

既存イメージでの作成例

一方、以下の例では既存のイメージを使用しています。

version: '3'
services:
  webapp:
    image: nginx:latest

ここでは、nginx:latestイメージを直接使用しています。

このimageディレクティブを使用することで、すでに存在するイメージをコンテナで使用可能です。

Docker Composeの基本概念

Docker Composeは、複数のコンテナ化されたアプリケーションを定義し、実行するためのツールです。

その定義はYAMLファイル(通常はdocker-compose.yml)に記述されます。

例】

version: '3.8'
services:
  web:
    image: node:14
    volumes:
      - .:/app
    working_dir: /app
    command: npm start
    ports:
      - "3000:3000"
    depends_on:
      - db
    environment:
      - DATABASE_URL=postgres://user:password@db:5432/mydatabase

  db:
    image: postgres:13
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
      POSTGRES_DB: mydatabase

volumes:
  postgres_data:

各サービス(コンテナ)はそのファイル内に定義され、それぞれのサービスが必要とする設定や依存関係が明記されます。

Docker Composeの主要な特性

Docker Composeの主要な特性として、以下のものが挙げられます。

  1. 複数コンテナの一元的な管理
    Docker Composeは、複数のサービス(コンテナ)をひとつのYAMLファイルで定義できます。それぞれのコンテナを個別に管理する必要がなくなります。
  2. 便利なコマンド
    Docker Composeでは、一連の指示をひとつのコマンドで実行できます。例えば、docker-compose upコマンドひとつで、YAMLファイル内に定義されたすべてのサービスを開始できます。
  3. 開発環境と本番環境の一致
    Docker Composeを使用すると、開発環境と本番環境が一致します。「私のマシンでは動作する」問題を回避できます。
  4. 依存関係の管理
    Docker Composeでは、サービス間の依存関係を容易に管理できます。サービスの起動順序を定義したり、あるサービスがほかのサービスに依存する場合にそれを保証したりすることが可能です。

DockerとDocker Composeの関連性と違い

ここでは、DockerとDocker Composeがどのように関連しているのか、そしてそれらの違いについて深く掘り下げていきます。

  • DockerとDocker Composeの共通点
  • DockerとDocker Composeの違い
  • Docker Composeが選ばれる理由

DockerとDocker Composeの共通点

DockerとDocker Composeの共通点として、その目的が挙げられます。

どちらもアプリケーションとその依存関係をコンテナとしてパッケージ化し、アプリケーションの実行環境を標準化することを目指している、という点です。

その結果、開発者は環境に依存せずにアプリケーションを開発やテスト、デプロイが可能になります。

DockerとDocker Composeの違い

一方、DockerとDocker Composeの主な違いは、その管理レベルとスコープです。

Dockerの主な役割は、個々のコンテナの作成と管理。

一方でDocker Composeは、複数のコンテナから成るアプリケーションの定義と管理を容易にします。

以下は単一のDockerコンテナを実行する例です。

docker run -d -p 8080:80 nginx

対して複数の関連するコンテナを一緒に管理する場合、Docker Composeを使用するとより効率的です。

version: '3'
services:
  web:
    image: nginx
    ports:
      - 8080:80
  db:
    image: mysql

上記のdocker-compose.ymlファイルは、nginxmysqlの2つのサービス(コンテナ)を定義しています。

ひとつのdocker-compose upコマンドで両方のコンテナを同時に起動できます。

Docker Composeが選ばれる理由

以上の違いから、Docker Composeは以下のようなシチュエーションで特に役立ちます。

  • アプリケーションが複数の関連するコンテナから構成されている場合
  • コンテナ間のネットワーク接続やデータ共有が必要な場合
  • 同じ設定を再利用して複数の環境(開発、テスト、ステージング、本番など)を構築したい場合

Docker Composeはアプリケーションのコンテナ化における新たな可能性を開くツールです。

以下でより具体的な使い方やそのメリットを見ていきましょう。

Docker Composeを活用するメリット

ここでは、Docker Composeを活用するとどのようなメリットがあるのかを具体的に見ていきます。

  • 複数コンテナの管理と実行
  • コンテナ運用におけるミスの軽減
  • コンテナ間ネットワーク設定の簡便性
  • 開発チーム間での環境共有の容易さ

複数コンテナの管理と実行

複数のコンテナを含むアプリケーションを管理する場合、Docker Composeが迚も便利です。

なぜならDocker Composeにより、ひとつのコマンドで複数のコンテナを同時に管理できるから。

例えば以下のコマンドで、定義したすべてのコンテナを同時に起動できます。

docker-compose up

同様に、すべてのコンテナを停止するには以下のコマンドを使います。

docker-compose down

コンテナ運用におけるミスの軽減

Docker Composeを使用すれば、アプリケーションの設定をコード(docker-compose.yml)で管理可能です。

これにより、コンテナの起動オプションを間違えるといった人為的なミスを軽減できます。

version: '3.8'
services:
  web:
    image: django:3.2
    volumes:
      - .:/app
    working_dir: /app
    command: ["python", "manage.py", "runserver", "0.0.0.0:8000"]
    ports:
      - "8000:8000"
    depends_on:
      - redis
    environment:
      - REDIS_URL=redis://redis:6379/0

  redis:
    image: redis:6

コンテナ間ネットワーク設定の簡便性

Docker Composeは、定義された各サービス間で自動的にネットワークを構築します。

手動での複雑なネットワーク設定を避けられるのです。

例えば、以下のdocker-compose.ymlでは、webサービスがdbサービスに自動的に接続できます。

version: '3'
services:
  web:
    image: nginx
    ports:
      - 8080:80
  db:
    image: mysql

開発チーム間での環境共有の容易さ

docker-compose.ymlファイルを共有することで、開発チーム全体で一貫した開発環境を簡単に構築できます。

“私のPCでは動いたのに、、、”という問題を避け、開発チーム全体の生産性を向上させることができます。

とくにデータベースなども絡んだ複雑なアプリケーションでは、この長所を実感できるはずです。

Docker Composeのインストールガイドライン

Docker Composeのインストール方法について見ていきましょう。

Docker Composeを使い始めるためには、まずインストールする必要があります。

  • インストール前の環境確認
  • Docker Composeのインストール手順
  • Docker Composeのバージョン確認方法
  • トラブルシューティング: インストールの問題を解決する

インストール前の環境確認

Docker Composeをインストールする前に、まずDockerが既にインストールされ、正常に動作していることを確認しましょう。

以下のコマンドでDockerのバージョン情報を表示できます。

docker version

OSがDocker Composeをサポートしているか確認することも重要です。

基本的には、Linuxや、macOS、Windowsなどの主要なOSをサポートしています。

Docker Composeのインストール手順

Docker Composeのインストールは、基本的には公式のドキュメンテーションに従うことが推奨されます。

以下に、一般的なLinux環境でのインストール手順を示します。

まず、最新のDocker Composeのバイナリをダウンロードします。

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

次に、ダウンロードしたバイナリに実行権限を与えます。

sudo chmod +x /usr/local/bin/docker-compose

以上でインストールは完了です。

Docker Composeのバージョン確認方法

インストールが正しく行われたか確認するために、Docker Composeのバージョンを確認します。

以下のコマンドを実行することで確認できます。

docker-compose version

トラブルシューティング: インストールの問題を解決する

もしインストール中に問題が発生した場合は、エラーメッセージをよく読みましょう。

多くの場合、そこに問題の解決策が示されているからです。

それでも解決しない場合は、公式のドキュメンテーションや、コミュニティのフォーラム、Stack Overflowなどで同様の問題を抱える人々の解決策を探すのがおすすめです。

実践!Docker Composeの使い方

インストールが完了したら、次にDocker Composeをどのように使用するのかを学びましょう。

  • YMLファイルの作成方法
  • 基本コマンドの使い方
  • プロキシ環境でのDockerイメージ作成方法
  • Docker Composeでのデータベース接続

YMLファイルの作成方法

Docker Composeを使用するためには、まず docker-compose.yaml という設定ファイルを作成する必要があります。

以下はその基本的な書き方です。

version: '3'
services:
  web:
    build: .
    ports:
      - "5000:5000"

上記の設定では、web というサービスを定義し、カレントディレクトリにある Dockerfile を使用してビルドし、5000番ポートを公開するように指定しています。

基本コマンドの使い方

Docker Composeの基本的なコマンドを紹介します。

最もよく使うコマンドは updown です。

docker-compose up    # Docker Composeの設定に基づいてコンテナを起動
docker-compose down  # 起動しているコンテナを停止して削除

また、ps コマンドで現在稼働中のコンテナの状態を確認できます。

docker-compose ps

プロキシ環境でのDockerイメージ作成方法

プロキシ環境下でDockerイメージを作成するには、ビルド時にプロキシの設定を追加する必要があります。

その設定は docker-compose.yaml ファイル内で行います。

version: '3'
services:
  web:
    build:
      context: .
      args:
        http_proxy: http://proxy.example.com:8080/
        https_proxy: http://proxy.example.com:8080/
    ports:
      - "5000:5000"

この設定では、ビルド時にHTTPとHTTPSのプロキシを設定しています。

Docker Composeでのデータベース接続

Docker Composeを使用してデータベースと接続する例を見てみましょう。

ここではPostgreSQLを使用した例を示します。

version: '3'
services:
  db:
    image: postgres
    environment:
      POSTGRES_PASSWORD: example
  web:
    build: .
    ports:
      - "5000:5000"
    depends_on:
      - db

上記の設定では、db というサービスとしてPostgreSQLのコンテナを起動し、その後 web サービスを起動しています。

web サービスは db サービスに依存しているため、db サービスが起動した後に web サービスが起動します。

注意点とトラブルシューティング

Docker Composeの活用により開発が円滑になりますが、その一方で知っておくべき注意点や、一般的な問題が発生したときの対処方法もあります。

  • コンテナの状態確認とデバッグ
  • Docker Composeでのログ管理
  • サービス間の依存関係の管理
  • ネットワークとボリュームの扱い

コンテナの状態確認とデバッグ

Docker Composeでは、ps コマンドを使うことで現在稼働しているコンテナの一覧とその状態を確認できます。

logs コマンドを使えば、コンテナのログ表記も可能。

これにより、何か問題が起こったときに詳細な情報を取得しデバッグが可能です。

docker-compose ps
docker-compose logs [service]

上記のコマンドでは、[service] の部分に表示したいサービス名を指定します。

Docker Composeでのログ管理

Docker Composeは、管理している全コンテナのログを一元的に表示可能です。

logs コマンドでは、特定のサービス名を指定しなければ全サービスのログが表示されます。

docker-compose logs

また、-f オプションを付けることでログのリアルタイム表示もできます。

docker-compose logs -f

サービス間の依存関係の管理

Docker Composeでは、depends_on オプションを使うことでサービス間の依存関係を定義できます。

このオプションを設定することで、指定したサービスが起動した後に依存しているサービスが起動します。

version: '3'
services:
  db:
    image: postgres
  web:
    build: .
    depends_on:
      - db

web サービスは db サービスに依存しているため、db サービスが起動した後に web サービスが起動します。

ネットワークとボリュームの扱い

Docker Composeでは、networksvolumes といったリソースを設定ファイル内で定義し、それらをサービス間で共有が可能。

これにより、サービス間でネットワークを共有したり、永続的なデータを保存したりすることが容易になります。

version: '3'
services:
  db:
    image: postgres
    volumes:
      - db-data:/var/lib/postgresql/data
networks:
  webnet:
volumes:
  db-data:

上記の設定では、ボリューム db-data を作成し、それを db サービスで利用しています。

また、ネットワーク webnet を作成しています。

Dockerのネットワークやボリュームについて、詳しく知りたい方はこちらをご覧ください

まとめ

当記事でお伝えしてきたkとをまとめます。

  • Docker Composeは、複数のコンテナを一元的に管理し、それらを一緒に起動・停止できるメリットがある
  • Docker Composeを使うことで、Dockerfileやdocker runコマンドの長いオプションを指定する手間が省ける
  • YAMLファイルに環境設定を明記することで、チーム内での環境共有が容易になる

Docker Composeはオープンソースプロジェクトであり、コミュニティからのフィードバックにより日々改善されています。

そのため、新しい機能の追加やパフォーマンスの改善を期待して良いでしょう。

とくにマイクロサービスアーキテクチャが一般的になるにつれて、その価値はますます高まるはず。

これらの知識を活かし、開発効率の向上を図っていきましょう。

タイトルとURLをコピーしました