🌴

【TEN-DEV】Docker Composeでマルチコンテナアプリケーションを構築しよう! 🐳✨

2025/01/26に公開

はじめに

こんにちは!👋 この「TEN-DEV」シリーズでは、たった10分で実践できるエンジニアリングのチュートリアルをお届けします!🎉

今回のテーマは 「Docker Compose」 です!

Docker Composeを使えば、複数のコンテナを簡単に管理できます。このチュートリアルでは、Webサーバとデータベースを連携させたマルチコンテナアプリケーションを構築してみましょう!⏰✨


目標 🥅

この記事を読めば、次のことができるようになります!💪

  • Docker Composeを使った環境構築
  • Webサーバとデータベースの連携
  • データベースにデータを登録・取得する

1. Docker Composeって何?🤔

「複数のDockerコンテナをまとめて管理したい!」と思ったことはありませんか?
Docker Composeを使えば、1つの設定ファイル(docker-compose.yml)で複数のサービスを構築・実行できます。

このチュートリアルでは、Webサーバ(Node.js)とデータベース(MySQL)を使って簡単な環境を構築します。


2. 必要なものをそろえよう🔧

  • DockerDocker Composeがインストールされているか確認しましょう。

    docker --version
    docker-compose --version
    

    ⚠️Docker Desktop を起動する必要があります!

    ✅ 両方のバージョンが表示されれば準備完了です!

  • プロジェクトフォルダの作成

    1. 任意の場所にプロジェクトフォルダを作成します。
      例: sample-docker-compose
    2. 以下のファイル構成を準備しましょう:
.
├── docker-compose.yml
├── db-init.sql
├── web
│   ├── Dockerfile
│   ├── app.js
│   └── package.json

3. Docker Composeファイルを書いてみよう✍️

以下は、docker-compose.ymlの内容です。

version: '3.8'
services:
  web:
    build: ./web
    ports:
      - "8080:3000"
    depends_on:
      db:
        condition: service_healthy
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: testdb
      MYSQL_USER: user
      MYSQL_PASSWORD: password
    volumes:
      - db_data:/var/lib/mysql
      - ./db-init.sql:/docker-entrypoint-initdb.d/init.sql
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 5
volumes:
  db_data:

4. Webアプリケーションを作成しよう 🌐

web/Dockerfileの内容:

FROM node:18-alpine
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
CMD ["node", "app.js"]

web/package.jsonの内容:

{
  "name": "docker-node-example",
  "version": "1.0.0",
  "main": "app.js",
  "dependencies": {
    "express": "^4.18.2",
    "mysql": "^2.18.1"
  }
}

web/app.jsの内容:

const express = require('express');
const mysql = require('mysql');

const app = express();
app.use(express.json());

const db = mysql.createConnection({
  host: 'db',
  user: 'user',
  password: 'password',
  database: 'testdb'
});

db.connect(err => {
  if (err) {
    console.error('Database connection failed:', err.stack);
    return;
  }
  console.log('Connected to database.');
});

app.get('/', (req, res) => {
  res.send('Hello, Node.js with Docker Compose!');
});

app.post('/add', (req, res) => {
  const { name } = req.body;
  db.query('INSERT INTO entries (name) VALUES (?)', [name], (err, result) => {
    if (err) {
      res.status(500).send(err);
      return;
    }
    res.send({ message: 'Entry added!', id: result.insertId });
  });
});

app.get('/entries', (req, res) => {
  db.query('SELECT * FROM entries', (err, results) => {
    if (err) {
      res.status(500).send(err);
      return;
    }
    res.send(results);
  });
});

const PORT = 3000;
app.listen(PORT, () => {
  console.log(`Server running on http://localhost:${PORT}`);
});

データベースの初期化:

以下のように初期化用SQLファイルを作成してデータベースを設定します:

db-init.sqlの内容:

CREATE TABLE entries (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL
);

docker-compose.yml内でdb-init.sqlをマウントしているため、コンテナ起動時にこのSQLが自動実行されます。


5. アプリを起動しよう🚀

以下のコマンドでアプリを起動します:

docker-compose up -d

🎉 起動完了!以下のコマンドでコンテナの状態を確認できます:

docker-compose ps

🌐 ブラウザで確認
http://localhost:8080にアクセスして、"Hello, Node.js with Docker Compose!"が表示されるか確認しましょう!

データを登録して確認する:

  1. データを登録:
curl -X POST -H "Content-Type: application/json" -d '{"name": "Sample Entry"}' http://localhost:8080/add

※curlコマンドが使用できない場合

Invoke-RestMethod -Uri "http://localhost:8080/add" -Method POST -Body '{"name": "Sample Entry"}' -ContentType "application/json"
  1. 登録データを取得

http://localhost:8080/entriesにブラウザで接続し確認!

🌐 Chrome(JSON Formatter拡張機能を利用)


6. 環境をクリーンアップしよう🧹

作業が終わったら、以下のコマンドで環境を停止&削除します:

docker-compose down

🚨 注意: データベースのデータはボリュームとして残る場合があります。完全に削除する場合はボリュームも削除しましょう:

docker-compose down --volumes

7. まとめ 📝

お疲れさまでした!🎉 今回は以下の流れでDocker Composeを学びました👇

  1. Docker Composeの基本を理解
  2. Webサーバとデータベースの連携
  3. データベースの初期化
  4. データの登録・取得を確認

それでは、Happy Coding! 👨‍💻✨

Discussion