docker-compose.yml
は、複数のDockerコンテナを一括で管理・起動・停止できる便利な構成ファイルです。特にWebアプリとDBなど複数のサービスが関わるシステムでは、個別にコマンドを打たずともまとめて動作させられるのが魅力です。この記事では、基本構文からサービスの連携方法、便利なコマンド、そしてトラブル対策まで、docker初心者にもやさしく解説します。
docker-compose.ymlの基本構成
docker-compose.yml
はYAML形式で記述され、複数のDockerコンテナ(サービス)を一つのファイルで定義・管理できる構成です。
主な構成要素は以下の通りです:
- version: Composeファイルのバージョン(例:
'3.8'
) - services: 実行する各コンテナ(Web・DBなど)の定義
- volumes: データの永続化に使うボリューム定義
- networks: サービス間通信を制御するネットワーク設定
以下は、Node.js(Express)とMySQLを連携させた基本構成の例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
version: '3.8' services: app: build: ./app ports: - "3000:3000" depends_on: - db environment: DB_HOST: db DB_USER: root DB_PASSWORD: example volumes: - ./app:/usr/src/app db: image: mysql:5.7 restart: always environment: MYSQL_ROOT_PASSWORD: example volumes: - db-data:/var/lib/mysql volumes: db-data: networks: default: driver: bridge |
サービス定義の書き方
servicesセクションでは、コンテナの設定を個別に定義します。
- image: 使用するDockerイメージ(例:nginxやmysql)
- build: Dockerfileを指定してローカルビルド
- ports: ホストとコンテナ間のポートマッピング
- volumes: ホスト↔コンテナのファイル共有
- environment: 環境変数の設定
- depends_on: 起動順の制御(例:app → db)
サービス名は自動的にコンテナ間のDNS名として使われるため、例えばdb
という名前のサービスにmysql://db:3306
のようにアクセスできます。
DNSについてはDocker Composeとネットワークの基礎を理解しようにわかりやすく記載しているため、参考にしてください。
ボリュームとネットワークの設定
volumesを使えば、コンテナを削除してもデータが保持されます。例えばMySQLのデータなど、消したくない情報はボリュームに保存するのが基本です。
networksは、コンテナ間の通信を制御する仮想ネットワークです。分離・制限・接続制御などを柔軟に行えるため、セキュアな環境を作りやすくなります。
特に開発と本番で構成を分けたい場合には、独立したネットワークを定義しておくことで、環境間の干渉を防ぐことができます。たとえば、フロントエンドとバックエンド、データベースをそれぞれ別ネットワークに分離し、必要最小限の接続のみ許可することで、セキュリティを高めつつ構成の見通しも良くなります。
よく使うdocker-composeコマンド
以下は、実務でよく使うdocker-composeコマンドの一覧です。
docker-compose up -d
:バックグラウンドで起動docker-compose down
:停止&ネットワーク・ボリュームも削除docker-compose ps
:稼働中のサービス確認docker-compose logs
:各サービスのログ表示docker-compose exec app bash
:指定したコンテナに入る
トラブル時の対処と注意点
通信できない・データが保存されないといったトラブルが起きた場合は、以下をチェックしてみましょう:
- ネットワークの接続設定:必要なサービス同士が同じネットワークに属しているか
- ボリュームのマウント:ホストのパスやパーミッションが正しいか
- 環境変数:
.env
の内容やYAMLでの記述ミスがないか - ログ確認:
docker-compose logs
でエラーを追う
また、depends_onだけでは起動完了を保証しないことにも注意が必要です。DBがまだ起動中なのにアプリ側が接続を試みて失敗するケースがあります。このような場合には、アプリ側でリトライ処理を実装したり、wait-for-it
や dockerize
といったツールを使うことで、サービス間の依存関係をより確実に制御することができます。
まとめ
- docker-compose.ymlは複数サービスを一括構成できる便利なツール
- サービス・ボリューム・ネットワークは基本として必ず定義
- トラブルは設定とログから原因を特定するのがポイント
次回は、.envファイルや複数環境構成を使った応用テクニックについて紹介予定です。
新着情報
ブログランキングに参加しています。クリックして応援していただけると嬉しいです。