【TEN-DEV】Docker Composeでマルチコンテナアプリケーションを構築しよう! 🐳✨
はじめに
こんにちは!👋 この「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. 必要なものをそろえよう🔧
-
DockerとDocker Composeがインストールされているか確認しましょう。
docker --version docker-compose --version
⚠️Docker Desktop を起動する必要があります!
✅ 両方のバージョンが表示されれば準備完了です!
-
プロジェクトフォルダの作成
- 任意の場所にプロジェクトフォルダを作成します。
例:sample-docker-compose
- 以下のファイル構成を準備しましょう:
- 任意の場所にプロジェクトフォルダを作成します。
.
├── 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!"が表示されるか確認しましょう!
データを登録して確認する:
- データを登録:
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"
- 登録データを取得
http://localhost:8080/entries
にブラウザで接続し確認!
🌐 Chrome(JSON Formatter拡張機能を利用)
6. 環境をクリーンアップしよう🧹
作業が終わったら、以下のコマンドで環境を停止&削除します:
docker-compose down
🚨 注意: データベースのデータはボリュームとして残る場合があります。完全に削除する場合はボリュームも削除しましょう:
docker-compose down --volumes
7. まとめ 📝
お疲れさまでした!🎉 今回は以下の流れでDocker Composeを学びました👇
- Docker Composeの基本を理解
- Webサーバとデータベースの連携
- データベースの初期化
- データの登録・取得を確認
それでは、Happy Coding! 👨💻✨
Discussion