こんにちは!花木です。「ゼロから始めるDocker+Kubernetes実践」シリーズ第2回目は、複数のコンテナをまとめて管理する便利なツール、 docker-compose
について解説します。
1. なぜdocker-compose
を使うのか?
前回の記事では、docker run
コマンドを使ってNginxコンテナを動かしました。
しかし、もしWebサイトのバックエンドにデータベース(例:MySQL)が必要になったらどうでしょう?
- まずNginxコンテナを起動し
- 次にMySQLコンテナを起動し
- 最後にそれぞれのコンテナ同士が通信できるように設定する…
というように、手動で複数のコンテナを管理するのは非常に手間がかかります。
また、コマンドが複雑になり、チームでの共有も難しくなります。
docker-compose
は、これらの問題を解決するために生まれました。
YAML(ヤムル)形式の定義ファイルを一つ作成するだけで、複数のコンテナの起動、停止、通信設定などを一括で管理できるようになります。
これにより、アプリケーション全体を単一のコマンドで簡単に立ち上げられるようになります。
2. YAML形式の定義ファイルdocker-compose.yml
の定義項目一覧
docker-compose.yml
ファイルは、主に以下の3つのキーで構成されます。
-
version
Composeファイルのフォーマットバージョンを指定します -
services
実際に起動するコンテナ群の定義を行います -
volumes / networks
コンテナ間で共有するデータやネットワークの設定を行います
ここでは、各キーに含まれる主要な定義項目を解説します。
version
version
キーには、Docker Composeのバージョンを指定します。バージョンによって利用できる機能が異なるため、適切なバージョン(例: '3.8'
)を選びます。
services
services
キーには、起動したいコンテナをサービスとして定義します。各サービスは、**image
やports
**などの設定を持ちます。
-
build
: Dockerfileからイメージをビルドする場合に、そのパスを指定します。context
(Dockerfileの場所)やdockerfile
(Dockerfileのファイル名)を詳細に指定することも可能です -
image
: コンテナのベースとなるDockerイメージ名を指定します。Docker Hubから自動でダウンロードされます -
container_name
: コンテナに任意の名前を付けます。指定しない場合は自動で生成されます -
ports
: ホストOS(サーバー)のポートとコンテナのポートを紐づけます。書式は"ホストポート:コンテナポート"
です -
volumes
: コンテナとホストOSのファイルシステムを共有(マウント)します。書式は"ホストパス:コンテナパス"
です
コンテナは一時的な環境として設計されているため、一度停止したり削除したりすると、その内部に保存されたデータは消えてしまいます
しかし、データベースのデータや、WEBアプリケーションのソースコードなど、永続的に保存したいデータも当然あります
volumes
を使うことで、ホストOS(サーバー)上の特定のディレクトリと、コンテナ内のディレクトリを紐付け、コンテナが削除されても、データはホストOS上に残り続けるため、何度でも同じデータを新しいコンテナで利用できます -
environment
: コンテナ内で使用する環境変数を設定します。パスワードなどの機密情報を渡す際によく利用されます -
env_file
: 環境変数をenv
ファイルから読み込みます。複数の環境変数を管理する場合に便利です -
networks
: サービスが参加するネットワークを指定します。同じネットワークに所属するコンテナは、互いに名前で通信できます -
depends_on
: コンテナの起動順序を指定します。例えば、Webサーバーが起動する前にデータベースが起動するように設定できます -
command
: コンテナ起動時に実行するコマンドを上書きします -
entrypoint
: コンテナのデフォルトの実行コマンドを上書きします -
restart
: コンテナが停止した際の再起動ポリシーを指定します-
no
: 再起動しない(デフォルト) -
always
: 常に再起動する -
on-failure
: エラーで終了した場合のみ再起動する -
unless-stopped
: ユーザーが手動で停止した場合を除き、常に再起動する
-
-
secrets
: コンテナに機密情報(APIキー、パスワードなど)を安全に渡すための仕組みです -
labels
: コンテナにメタデータ(ラベル)を追加します。コンテナの分類や管理に役立ちます
volumes
volumes
キーでは、データを永続化するためのボリュームを名前付きで定義します
networks
networks
キーでは、コンテナ間の通信を可能にするためのネットワークを定義します
networks
とvolumes
の「定義」と「利用」
docker-compose.yml
ファイルには、**トップレベル(ファイル全体)にvolumes
とnetworks
のセクションがあり、その一方で、各services
の中にも同じ名前の項目があります。この違いは、「定義」と「利用」**という概念で理解すると非常に分かりやすくなります。
-
トップレベルの
volumes
とnetworks
:
これは、プロジェクト全体で使う共通の「リソース」を定義する場所です。例えるなら、家を建てるときに、家全体で使える「水道管」や「電気配線」を敷設する作業にあたります -
サービス内の
volumes
とnetworks
:
これは、トップレベルで定義した「リソース」を、個々のコンテナ(サービス)がどのように利用するかを指定する場所です。先ほどの例で言えば、「キッチン」や「お風呂場」といった個々の部屋に、敷設した「水道管」から蛇口を繋いだり、コンセントを設置したりする作業にあたります
この分業によって、設定ファイルがすっきりし、どのリソースが複数のサービスで共有されているかが一目でわかるようになります。
3. 演習:WordPressを動かしてみよう
WordPressはWebアプリケーションとデータベースが連携して初めて動作します。docker-compose
を使ってこの構成を簡単に立ち上げてみましょう。
手順
① docker-compose.yml
ファイルの作成
プロジェクトのディレクトリを作成し、その中にdocker-compose.yml
というファイルを作成します。
mkdir my-web-app
cd my-web-app
vim docker-compose.yml
vim
で開いたdocker-compose.yml
に以下の内容を書き込みます。
version: '3.8'
services:
db:
image: mysql:8.0
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: wordpress
volumes:
- db_data:/var/lib/mysql
wordpress:
image: wordpress:latest
restart: always
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: root
WORDPRESS_DB_PASSWORD: password
WORDPRESS_DB_NAME: wordpress
volumes:
- wordpress_data:/var/www/html
depends_on:
- db
volumes:
db_data:
wordpress_data:
この設定ファイルでは、db
とwordpress
という2つのサービスを定義しています。wordpress
は、WORDPRESS_DB_HOST
という環境変数で、データベースであるdb
コンテナにアクセスするよう設定しています。
YAMLファイルの主な設定項目解説:
-
services
:- このセクションには、アプリケーションを構成する個々のサービス(コンテナ)を定義します。今回は、
db
とwordpress
という2つのサービスがあります
- このセクションには、アプリケーションを構成する個々のサービス(コンテナ)を定義します。今回は、
-
db
サービス:-
image: mysql:8.0
: MySQLのバージョン8.0イメージをベースとして使用します -
restart: always
: データベースは常に稼働しているべきサービスなので、コンテナが停止したら常に自動で再起動するように設定します -
environment
: コンテナ内の環境変数を設定します。ここでは、WordPressがデータベースに接続するために必要な、ルートパスワードやデータベース名などを指定しています -
volumes
: トップレベルで定義したdb_data
という名前のボリュームを、コンテナ内の/var/lib/mysql
というディレクトリにマウントしています。これにより、データベースのデータがコンテナから削除されても永続的に保存されます
-
-
wordpress
サービス:-
image: wordpress:latest
: WordPressの最新版イメージを使用します -
restart: always
: ウェブアプリケーションも常に稼働しているべきなので、db
サービスと同様に自動再起動を設定します -
ports: "8080:80"
: ホストOSの8080番ポートへのアクセスを、コンテナ内の80番ポートに転送します -
environment
: WordPressアプリケーションがデータベースに接続するための設定を環境変数で渡します-
WORDPRESS_DB_HOST: db:3306
: ここが最も重要なポイントです。**db
**は、docker-compose
が自動的に作成するネットワーク内で、データベースコンテナの名前として機能します。これにより、WordPressコンテナはIPアドレスを気にすることなく、db
という名前でデータベースにアクセスできます。3306
はMySQLのデフォルトポートです
-
-
volumes
: トップレベルで定義したwordpress_data
ボリュームを、コンテナ内の/var/www/html
にマウントしています。WordPressのアップロードファイルやプラグインはこの場所に保存されます -
depends_on: - db
:wordpress
サービスはdb
サービスが起動してからでないと動作できないため、起動の依存関係を定義しています
-
-
volumes
:-
db_data:
とwordpress_data:
という、名前付きのボリュームを定義しています。これらのボリュームは、ホストOS上にボリューム名と同じ名前のディレクトリが作成され、コンテナが削除されてもデータが消えないようにします
-
② コンテナの起動
docker-compose.yml
を保存したら、以下のコマンドを実行します。
sudo docker compose up -d
-
up
:docker-compose.yml
に定義されたすべてのサービスを起動します -
-d
: コンテナをバックグラウンドで実行(detached mode)します
③ 動作確認
起動したコンテナの状態を確認します。
sudo docker compose ps
State
がrunning
になっていれば成功です。
Webブラウザから http://[あなたのサーバーのIPアドレス]:8080
にアクセスしてみてください。WordPressの初期設定画面が表示されるはずです。この時点で、wordpress
コンテナがdb
コンテナに接続して動作していることが確認できます。
停止と削除
コンテナを停止して削除するには、以下のコマンドを実行します。
sudo docker compose down
4. まとめと次のステップ
今回は、docker-compose
を使って複数のコンテナをまとめて管理する方法を学びました。複雑なコマンドを何度も打つ必要がなくなり、チームでの開発・運用が格段に効率化されることを実感できたのではないでしょうか。
次回は、このシリーズの最終章として、Kubernetesを導入し、docker-compose
では管理しきれない大規模なシステムを、より高度な方法で管理する方法を解説します。Dockerで作成したコンテナを、Kubernetesという強力なオーケストレーションツールで管理する方法を学びましょう。お楽しみに!
👤 プロフィール
![]() |
セントラルソフト株式会社
|