はじめに(この記事でわかること)
第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:11MariaDBが入った「完成済みの箱」を使う、という意味です。
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を業務利用する上で最初に押さえるべき
「失敗しない運用の型」
を扱います。
具体的には、
- ボリュームの考え方(データを守る)
- ログの考え方(調査できる)
- バックアップの最初の一歩(事故に備える)
を、入門者向けに整理します。