🐳
【docker-compose】Nest.jsとPostgresをローカルPC内で起動して接続する
この記事では、Nest.jsで作成したローカルAPIと、Postgresで作成されたローカルDBを接続するまでの手順を解説していきます。
--- Version ---
node: v16.0.0
nest: v7.6.0
docker: v20.10.17
image: node:14-alpine3.12
Nest.jsを起動する
nodeやDocker等のセットアップ等は既に済ませている前提で進めていきます。
今回は解説記事なので順を追って説明しますが、結論だけ知りたいよって方は、「docker-composeを使って起動」まで飛んでもらってOKです。
Nest.js プロジェクトの作成
nestコマンドを使って新しいプロジェクトを作成します。
$ nest new nest_demo_prj
npmとyarnどちらを使うかを聞かれるので、今回はnpmを選択します。
? Which package manager would you ❤️ to use? npm
✔ Installation in progress... ☕
この表示が出たら成功です!
🚀 Successfully created project nest-demo-app
ローカルPCでAPI起動
まずはローカル内で起動してみましょう。
$ npm run start
> nest-demo-app@0.0.1 start
> nest start
[Nest] 34946 - 07/11/2022, 9:33:24 AM [NestFactory] Starting Nest application...
[Nest] 34946 - 07/11/2022, 9:33:24 AM [InstanceLoader] AppModule dependencies initialized +44ms
[Nest] 34946 - 07/11/2022, 9:33:24 AM [RoutesResolver] AppController {}: +4ms
[Nest] 34946 - 07/11/2022, 9:33:24 AM [RouterExplorer] Mapped {, GET} route +2ms
[Nest] 34946 - 07/11/2022, 9:33:24 AM [NestApplication] Nest application successfully started +1ms
エントリのmain.tsを見てみると3000番ポートを開いていることが確認できるので、
main.ts
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(3000);
}
bootstrap();
curlコマンドを使って表示を確認してみましょう
$ curl localhost:3000
Hello World!%
これでローカル内での正常な動きが確認できました。
Dockerを使ってAPI起動
次に、さっきの一連の作業をDockerfileに記述して、Dockerコンテナ内でAPIを起動します。
Dockerfileの作成
Dockerfile
FROM node:14-alpine3.12
WORKDIR /app
COPY package*.json ./
RUN npm ci
RUN npm i @nestjs/cli@7.6.0 -g
COPY . .
EXPOSE 3001
CMD ["npm", "run", "start:dev"]
docker-compose.ymlの作成
docker-compose.yml
version: '3'
services:
api:
build:
context: .
dockerfile: Dockerfile.local
ports:
- 3000:3000
restart: always
volumes:
- ./src:/app/src
postgres:
image: postgres:14.0
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
POSTGRES_DB: postgres
TZ: 'Asia/Tokyo'
ports:
- 5432:5432
volumes:
- ./postgres/data:/var/lib/postgresql/data
volumes部分でコンテナ内のDBの内容をローカルにマウントしています。
このようにすることで、DBの変更内容がローカルに保存されるため、次回以降コンテナ起動時もデータを保持した状態でDBを起動することが出来ます。
API起動
$ docker-compose up --build
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
522378c23339 postgres:14.0 "docker-entrypoint.s…" 4 seconds ago Up 3 seconds 0.0.0.0:5432->5432/tcp nest-demo-app-postgres-1
48aace1b9677 nest-demo-app_api "docker-entrypoint.s…" 4 seconds ago Up 3 seconds 0.0.0.0:3000->3000/tcp, 3001/tcp nest-demo-app-api-1
curlでAPIが実行できるか確かめてみます
$ curl localhost:3000
Hello World!%
TablePlusなどのDB可視化ツールから接続できるか確認してみます。
これでAPI・DBともに正常に動作していることが確認できました!
おわりに
今回使用したソースコードです。
Discussion