開発環境の構築は地味に時間がかかる作業です。Docker Composeを使えば、Node.jsアプリケーションとPostgreSQLデータベースを含む開発環境を、たった1コマンドで立ち上げることができます。
前提条件
- Docker Desktop がインストール済み
- docker compose コマンドが使える状態
プロジェクト構成
my-app/
├── docker-compose.yml
├── Dockerfile
├── package.json
├── src/
│ └── index.js
└── .env
docker-compose.yml
version: "3.8"
services:
app:
build: .
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgresql://myuser:mypass@db:5432/mydb
- NODE_ENV=development
volumes:
- ./src:/app/src
depends_on:
db:
condition: service_healthy
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: myuser
POSTGRES_PASSWORD: mypass
POSTGRES_DB: mydb
ports:
- "5432:5432"
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U myuser -d mydb"]
interval: 5s
timeout: 5s
retries: 5
volumes:
pgdata:
Dockerfile
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY src/ ./src/
EXPOSE 3000
CMD ["node", "src/index.js"]
Node.jsアプリケーション
// src/index.js
const { Pool } = require("pg");
const http = require("http");
const pool = new Pool({
connectionString: process.env.DATABASE_URL,
});
const server = http.createServer(async (req, res) => {
try {
const result = await pool.query("SELECT NOW() as current_time");
res.writeHead(200, { "Content-Type": "application/json" });
res.end(JSON.stringify({
message: "Hello from Docker!",
db_time: result.rows[0].current_time,
}));
} catch (err) {
res.writeHead(500);
res.end(JSON.stringify({ error: err.message }));
}
});
server.listen(3000, () => {
console.log("Server running on port 3000");
});
起動と確認
# ビルド&起動
docker compose up -d
# ログ確認
docker compose logs -f app
# 動作確認
curl http://localhost:3000
開発時のTips
- volumesでsrcディレクトリをマウントしておけば、ファイル変更が即座に反映されます(nodemonと組み合わせると便利)
- healthcheckを設定しておくと、DBが起動する前にアプリが接続しようとするエラーを防げます
- PostgreSQLのデータはnamed volumeに保存されるので、コンテナを再作成してもデータは消えません
まとめ
Docker Composeを使えば、チームメンバー全員が同じ環境で開発できます。新メンバーのオンボーディングも「git cloneしてdocker compose up」だけで完了。環境差異によるトラブルから解放されます。