(最終更新日:2023年8月)
✔当記事が対象とする読者
「Docker Composeの機能について詳しく知りたい」
「Docker Composeの具体的な使い方を学びたい」
「Docker Composeを用いた実際の事件を参照したい」
✔当記事を通じてお伝えする内容
- Docker Composeの基本知識
- Docker Composeの適用方法とその進行
- Docker Composeを利用した具体的な事例
当記事では、Docker Composeの基本概念から、さらなるオプションによる効果的な使い方まで、実際のサンプルを交えて詳細に解説して参ります。
ぜひ最後までご覧いただき、docker composeの基礎をマスターしましょう。
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の主要な特性として、以下のものが挙げられます。
- 複数コンテナの一元的な管理
Docker Composeは、複数のサービス(コンテナ)をひとつのYAMLファイルで定義できます。それぞれのコンテナを個別に管理する必要がなくなります。 - 便利なコマンド
Docker Composeでは、一連の指示をひとつのコマンドで実行できます。例えば、docker-compose up
コマンドひとつで、YAMLファイル内に定義されたすべてのサービスを開始できます。 - 開発環境と本番環境の一致
Docker Composeを使用すると、開発環境と本番環境が一致します。「私のマシンでは動作する」問題を回避できます。 - 依存関係の管理
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
ファイルは、nginx
とmysql
の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の基本的なコマンドを紹介します。
最もよく使うコマンドは up
と down
です。
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では、networks
や volumes
といったリソースを設定ファイル内で定義し、それらをサービス間で共有が可能。
これにより、サービス間でネットワークを共有したり、永続的なデータを保存したりすることが容易になります。
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はオープンソースプロジェクトであり、コミュニティからのフィードバックにより日々改善されています。
そのため、新しい機能の追加やパフォーマンスの改善を期待して良いでしょう。
とくにマイクロサービスアーキテクチャが一般的になるにつれて、その価値はますます高まるはず。
これらの知識を活かし、開発効率の向上を図っていきましょう。