⑥Docker・コンテナ

Docker Composeで複数コンテナを管理する【yaml設定ファイルの書き方】

⑥Docker・コンテナ
記事内に広告が含まれています。

前の記事でDockerfileを使った1つのイメージ作りを学びました。しかし実際のWebアプリは、Webサーバー・アプリサーバー・データベースなど複数のコンテナが連携して動くことがほとんどです。Docker Composeはこれらを1つのYAMLファイルとコマンド1つでまとめて管理するツールです。

Docker Composeがないとどうなる?

Docker Composeがない場合、データベースとWebサーバーの2つのコンテナを起動するには、お互いのコマンドを複数回実行し、ネットワーク設定も手動で行う必要があります。Docker Composeを使うと、これらの設定を全てdocker-compose.ymlファイルに書いておけば、docker compose upの一発で完了します。

docker-compose.ymlの基本構造

YAMLファイルはインデント(スペースによる山括り)で構造を表現します。タブではなく必ずスペース2つでインデントしてください(YAMLの基本です)。

services:
  サービス名1:
    image: 使うイメージ
    ports:
      - "ホストポート:コンテナポート"
  サービス名2:
    image: 使うイメージ
    environment:
      - KEY=VALUE

実践例:WordPress + MySQLを起動する

具体的な例として、WordPresstoMySQLをDocker Composeで起動してみます。作業用ディレクトリを作成しdocker-compose.ymlを作成します。

services:
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wpuser
      MYSQL_PASSWORD: wppassword
    volumes:
      - db_data:/var/lib/mysql
    restart: always

  wordpress:
    image: wordpress:latest
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_NAME: wordpress
      WORDPRESS_DB_USER: wpuser
      WORDPRESS_DB_PASSWORD: wppassword
    depends_on:
      - db
    restart: always

volumes:
  db_data:

各設定の意味を説明します。

  • image:使用するイメージ名。Docker Hubから自動でダウンロードされます
  • environment:コンテナに渡す環境変数。パスワードなどの設定値を渡すことができます
  • ports:「ホストのポート:コンテナのポート」の形式。8080:80は「http://localhost:8080でコンテナの80ポートにアクセス」という意味
  • volumes:データをコンテナの外に保存する設定(詳しくは次の記事で)
  • depends_on:依存順序の指定。dbが起動してからwordpressを起動する

起動・停止・確認のコマンド

コマンド何をするか
docker compose up全コンテナを起動(フォアグラウンド)
docker compose up -dバックグラウンドで起動(実務でよく使う)
docker compose down全コンテナを停止・削除
docker compose psコンテナの状態を確認
docker compose logs全コンテナのログを表示
docker compose logs -fリアルタイムでログを表示
docker compose exec db bashdbコンテナに入って操作
docker compose up --buildイメージを再ビルドして起動

つまずきやすいポイント

YAMLのインデントエラー

YAMLはインデント(山括り)のミスでエラーになることが多いです。必ずスペース2つでインデントし、タブキーは使わないようにしてください。エラーメッセージにyaml: line XX: ...と出たらその行のインデントを確認してください。

portがコンフリクトする

Bind for 0.0.0.0:8080 failed: port is already allocatedと出る場合、ホストの8080ポートが別のプロセスに占有されています。docker-compose.ymlのportsの最初の数字(ホスト側)を別の番号(例:8181:80)に変更してください。

まとめ

  • Docker Composeは複数コンテナをYAMLで定義しコマンド1つで管理するツール
  • docker compose up -dでバックグラウンド起動、docker compose downで停止
  • YAMLはスペーサ2つインデントが基本。タブは使わない
  • depends_onでコンテナの起動順序を制御できる

次の記事ではボリュームとネットワークを学びます。データをコンテナ削除後も残す方法と、コンテナ同士が通信する仕組みを理解しましょう。

コメント

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