【コンテナ技術】第4回:Docker Compose入門(Web+DBを動かす)|現場で使うDocker実践入門

   夜空を飛ぶコンテナを背負ったdockerクジラ

はじめに(この記事でわかること)

第3回ではDockerfileを使い、**「1つのコンテナを作って起動する」**ところまで進みました。
ただ、業務で扱うシステムはたいてい「1つのコンテナ」では完結しません。

たとえばWebアプリなら、

  • Web(PHP / Node.js など)
  • DB(MySQL / MariaDB など)

のように、複数の要素が組み合わさります。そこで登場するのが Docker Compose です。

Docker Composeはひとことで言えば、
複数のコンテナをまとめて起動・停止できる仕組みです。

Docker Composeとは?

Docker Composeは、複数コンテナ構成を 1つの設定ファイルで管理できる仕組みです。
その設定ファイルが docker-compose.yml です。

つまり、

  • Dockerfile:1つのコンテナの設計図
  • docker-compose.yml:複数コンテナの組み合わせ設計図

という役割分担になります。

なぜComposeが必要なのか

もしComposeがないと、Web+DBを動かすために

  • DBコンテナを起動
  • Webコンテナを起動
  • ネットワーク設定を考える
  • DBの接続先を合わせる
  • 停止するときも順番に止める

といった作業が必要になります。

Composeがあると、基本的にこれだけです。

docker compose up -d

第4回のゴール

この記事のゴールはシンプルです。

  • WebとDBをComposeで起動できる
  • WebからDBへ接続できる
  • 停止・再起動・ログ確認ができる

この状態になれば、Dockerが「業務で使える道具」になってきます。

最小構成のdocker-compose.yml

まずは全体像です。以下は Web+DB の最小構成です。

services:
  db:
    image: mariadb:11
    environment:
      MARIADB_ROOT_PASSWORD: rootpass
      MARIADB_DATABASE: appdb
      MARIADB_USER: appuser
      MARIADB_PASSWORD: apppass
    ports:
      - "3306:3306"

  web:
    image: nginx:latest
    ports:
      - "8080:80"

この時点では、WebはただのNginxで、DBはMariaDBです。
ここから、「業務で使える形」にしていきます。

servicesとは何か

Composeでは services: の中に、コンテナを定義します。
つまり、

  • db: は「DB用コンテナ」
  • web: は「Web用コンテナ」

です。

ここで大事なのは、
Composeでは、サービス名がそのまま「コンテナ間通信の名前」になる
という点です。

DBコンテナの基本(MariaDB)

DBの定義で、初心者が最初に覚えるべきなのは次の3つです。

image:元になるイメージ

image: mariadb:11

MariaDBが入った「完成済みの箱」を使う、という意味です。

environment:初期設定

environment:
  MARIADB_ROOT_PASSWORD: rootpass
  MARIADB_DATABASE: appdb
  MARIADB_USER: appuser
  MARIADB_PASSWORD: apppass

これは「DBを起動するときに最初に作るユーザーやDB名」を指定しています。

ports:外部公開

ports:
- "3306:3306"

これは、

  • 左側:あなたのPC側のポート
  • 右側:コンテナ側のポート

という意味です。

Webコンテナの基本(Nginx)

Web側も同様に、まずは最低限です。

web:
  image: nginx:latest
  ports:
    - "8080:80"

これで、ブラウザから

http://localhost:8080

にアクセスすると、Nginxの画面が表示されます。

WebからDBへ接続する考え方

初心者が一番混乱するのがここです。

結論から言うと、Compose環境では
DBのホスト名は localhost ではなく、サービス名(例:db)
になります。

つまりWebコンテナからDBへ接続する場合、

  • ホスト:db
  • ポート:3306

です。

これはComposeが、サービス同士を自動でつなぐ仕組みを持っているためです。

データを消さないためのvolumes

ここは業務利用で非常に重要です。

DBコンテナは、何も設定しないと
コンテナを消すとデータも消える
可能性があります。

そのため、Composeでは ボリューム を使ってデータを残します。

services:
  db:
    image: mariadb:11
    environment:
      MARIADB_ROOT_PASSWORD: rootpass
    volumes:
      - dbdata:/var/lib/mysql

volumes:
  dbdata:

このように書くと、DBの中身(データ)がPC側に保存されるため、コンテナを作り直してもデータが残ります。

最低限覚えるComposeコマンド

起動(バックグラウンド)

docker compose up -d

停止(コンテナを削除)

docker compose down

※ボリュームは残るので、DBデータは基本的に消えません。

ログを見る

docker compose logs -f

稼働状況を見る

docker compose ps

初心者がよくハマるポイント

① ポートが被って起動できない

エラーで多いのはこれです。

  • すでにPCでMySQLが動いている
  • 3306が使われている

この場合は、PC側のポートを変えます。

ports:
  - "13306:3306"

② DB接続先をlocalhostにしてしまう

Compose環境の中では localhost は「そのコンテナ自身」です。

WebからDBへ接続するときは、

  • db

を使います。

③ downしたらデータが消えた

原因はほぼ100%「volumes設定がない」です。
DBには必ずボリュームを設定する、が基本です。

まとめ

Docker Composeを使うと、複数コンテナの構成を

  • 1つのファイルで定義し
  • 1つのコマンドで起動し
  • 1つのコマンドで停止できる

ようになります。

第4回のポイントは次の通りです。

  • Composeは「複数コンテナをまとめる仕組み」
  • サービス名(例:db)が接続先の名前になる
  • DBには必ずvolumesを設定する
  • up -d / down / logs / ps は必須コマンド

次回予告

次回(第5回)は、Dockerを業務利用する上で最初に押さえるべき
「失敗しない運用の型」
を扱います。

具体的には、

  • ボリュームの考え方(データを守る)
  • ログの考え方(調査できる)
  • バックアップの最初の一歩(事故に備える)

を、入門者向けに整理します。