🐳

【docker-compose】Nest.jsとPostgresをローカルPC内で起動して接続する

2022/07/17に公開

この記事では、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ともに正常に動作していることが確認できました!

おわりに

今回使用したソースコードです。
https://github.com/orange-bp-dev/nest-pg-demo-app

Discussion