ITや趣味など気軽に投稿しています。

【Docker】Docker Composeを用いたコンテナ操作

Docker Composeは、複数のDockerコンテナを定義・管理し、コマンド1つでまとめて起動するためのツールです。実際のアプリケーション開発では、Webサーバ・データベース・キャッシュサーバなど、複数のコンテナを組み合わせて利用するケースが一般的です。

この記事では、Docker Composeの基本概念と、Nginx+MySQLのマルチコンテナ環境を構築する実践例を解説します。

Docker Composeとは

Docker Composeは、複数のDockerコンテナの構成をYAMLファイルdocker-compose.yml)に定義し、docker compose upコマンド1つでまとめて起動できるツールです。

単一コンテナの起動はdocker runで行えますが、実用的なシステムでは複数のコンテナを連携させる構成が主流です。Docker Composeを使うことで、以下のメリットが得られます。

  • 一括操作: 複数コンテナの起動・停止をコマンド1つで実行できる
  • 構成の可視化: コンテナ間の関係をdocker-compose.ymlで一元管理できる
  • 環境変数の管理: データベースのパスワードなどの設定値をファイル内に定義できる
  • ネットワーク管理: コンテナ間のネットワーク接続を簡潔に定義できる

Docker Compose実践

動作確認

Docker Composeは、Docker Desktopをインストールした際に同梱されています。以下のコマンドでヘルプが表示されることを確認します。

docker compose
Usage: docker compose [OPTIONS] COMMAND
Define and run multi-container applications with Docker
Options:
  --all-resources   Include all resources, even those not
                    used by services
  ....

構築する環境

今回は、Nginx(Webサーバ)+MySQL(データベース)で構成された簡易Webサーバ環境を構築します。

必要ファイルの準備

以下のディレクトリ構成でファイルを準備します。

demo-compose/
├── docker-compose.yml
└── nginx/
    └── index.html

docker-compose.yml

docker-compose.ymlに起動するコンテナの構成を定義します。

version: '3.8'
services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"
    volumes:
      - ./nginx:/usr/share/nginx/html:ro
    depends_on:
      - db
    networks:
      - demo-net
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: demo_db
      MYSQL_USER: demo_user
      MYSQL_PASSWORD: demopass
    ports:
      - "3306:3306"
    networks:
      - demo-net
networks:
  demo-net:
    driver: bridge

各設定項目の説明は以下の通りです。

項目説明
services起動するコンテナの定義。今回はweb(Nginx)とdb(MySQL)を定義
image使用するDockerイメージ。Docker Hubから自動的にPullされる
portsホストとコンテナのポートマッピング
volumesホストのディレクトリをコンテナにマウント
depends_onコンテナの起動順序を制御(dbが先に起動してからwebを起動)
networksコンテナ間で通信するためのネットワーク定義
environmentコンテナ内の環境変数を設定

今回はdemo-netというブリッジネットワークを定義し、NginxコンテナとMySQLコンテナ間の通信を可能にしています。

index.html

Nginxで表示するHTMLファイルをnginx/ディレクトリに配置します。

<!DOCTYPE html>
<html>
<head>
  <title>Docker Compose Demo</title>
</head>
<body>
  <h1>Hello, Docker Compose with Nginx and MySQL!</h1>
</body>
</html>

起動

docker-compose.ymlが存在するディレクトリで以下のコマンドを実行します。-dオプションにより、バックグラウンドで起動されます。

docker compose up -d

作成されたイメージを確認します。

docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
mysql        8.0       bfeba808a667   11 days ago    1.07GB
nginx        latest    84ec966e61a8   2 weeks ago    279MB

起動中のコンテナを確認します。

docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED        STATUS         PORTS                               NAMES
eba54eeefc46   nginx:latest   "/docker-entrypoint.…"   16 hours ago   Up 10 seconds  0.0.0.0:8080->80/tcp                docker_compose-web-1
670d149771c8   mysql:8.0      "docker-entrypoint.s…"   16 hours ago   Up 10 seconds  0.0.0.0:3306->3306/tcp, 33060/tcp   docker_compose-db-1

NginxとMySQLの両コンテナが起動していることが確認できます。

ブラウザでhttp://localhost:8080にアクセスすると、index.htmlの内容が表示されます。

http://localhost:8080

このように、複数コンテナの起動をコマンド1つで実行できるのがDocker Composeの大きなメリットです。

Docker Composeを使わない場合との比較

同じ構成をDocker Composeを使わずに構築する場合、以下の3つのコマンドが必要になります。

# 1. ネットワークの作成

docker network create demo-net

# 2. MySQLコンテナの起動

docker run -d --name demo-mysql --network demo-net \
  -e MYSQL_ROOT_PASSWORD=rootpass \
  -e MYSQL_DATABASE=demo_db \
  -e MYSQL_USER=demo_user \
  -e MYSQL_PASSWORD=demopass \
  -p 3306:3306 mysql:8.0

# 3. Nginxコンテナの起動

docker run -d --name demo-nginx --network demo-net \
  -p 8080:80 \
  -v "$(pwd)/nginx:/usr/share/nginx/html:ro" \
  nginx:latest

Docker Composeとの比較をまとめると、以下の通りです。

観点Docker Composedocker runの個別実行
コマンド数1コマンド構成要素ごとに個別コマンドが必要
構成管理YAMLファイルで一元管理コマンド履歴に依存しがち
環境変数ファイル内に記述コマンドライン引数で指定
再現性同一のYAMLファイルで再現可能コマンドの再実行が必要

まとめ

この記事では、Docker Composeの基本概念と実践的な使い方を解説しました。

  • Docker Composeは複数コンテナをdocker-compose.ymlで一元管理するツール
  • servicesでコンテナ定義、networksでコンテナ間通信、volumesでファイル共有を設定する
  • docker compose up -dでバックグラウンド起動、docker compose downで一括停止が可能
  • 個別のdocker runと比較して、構成の可視化・再現性・運用効率が大幅に向上する

複数コンテナを組み合わせたシステム構築では、Docker Composeは必須ともいえるツールです。ぜひ積極的に活用してください。