🐈

Dockerを利用してNestJS+TypeORM+MySQLの環境構築する

6 min read

こんにちは、新人エンジニアのtakuです。
わかりやすさだけを追求して記事を書いていきます。

この記事では、NestJSを使って開発したいという方に向けて記事を作成しています。

最低限でしかないので、各自カスタマイズしてご利用してください。

Githubを載せておくので、ご自由にご利用ください。

https://github.com/takuya-mashimo/nest-sample

目次

  1. NestJSとはなにか?
  2. docker上でNestJSを起動する
  3. TypeORMを利用してMySQLと接続する

NestJSとはなにか?


Nest (NestJS) は効率的でスケーラブルなNode.jsサーバーサイドアプリケーションを構築する為のフレームワークです。

最新のJavascriptで構築され、Typescriptを完全にサポートしています。

中身を見れば、Nestは(デフォルトでは)Expressのような堅牢なHTTPサーバーフレームワークを利用していて、オプションでFastifyを使用する事も可能です。

もし、NestJSのアーキテクチャの全体感を掴みたい方はpotato4dさんの以下の記事が参考になると思います
触って覚えるNestJSのアーキテクチャ


また、公式ドキュメント等は以下です


docker上でNestJSを起動する

ファイル構成

project-path
    |- docker-compose.yml
    |- Dockerfile
    |- .dockerignore
    |- nestのmodule達

Dockerfileとdocker-compose.ymlの作成



それぞれのファイルを作成して、以下の内容を追記します。

Dockerfile
FROM node:latest

RUN npm i -g @nestjs/cli

WORKDIR /api
docker-compose.yml
version: "3.7"
services:
  api:
    container_name: api
    build: .
    tty: true
    ports:
      - "3000:3000"
    volumes:
      - type: bind
        source: .
        target: /api
.dockerignore
node_modules

nodeイメージをベースにして、nestjs/cliをインストールをしています。


イメージを構築し、コンテナを起動するために以下のコマンドを入力します。

docker compose up -d --build

コンテナが起動しているか、確認します。

docker compose ps


こんな表示になっていればOKです。

NAME                COMMAND                  SERVICE             STATUS              PORTS
api                 "docker-entrypoint.s…"   api                 running             0.0.0.0:3000->3000/tcp

以下のコマンドを入力して、Nestプロジェクトをdockerコンテナ内のカレントディレクトリに作成します。

docker compose exec api nest new .

どのパッケージマネージャーを使用しますか?

と聞かれるので、npmを選択します。

これで、サーバーを起動する準備はできました。
以下のコマンドを入力して、サーバーを起動しましょう。

docker compose exec api npm run start:dev

にアクセスすると、Hello World!と表示されたら、起動成功です!

毎回、npm run start:devと打つのはめんどくさいので、Dockerfileに以下を追記しておきましょう。

Dockerfile
FROM node:latest

RUN npm i -g @nestjs/cli

WORKDIR /api
+ CMD ["npm", "run", "start:dev"]

イメージの構築をし直して、コンテナを立ち上げ直します

docker compose up -d --build


APIサーバーなので、質素な見た目ですが、
これで、NestJS単体での開発環境の構築は完了しましたー!🙌

TypeORMを利用してMySQLと接続する

やることの流れ、

  1. docker-compose.ymlに追記して、MySQLコンテナを立ち上げる
  2. TypeORMをインストールして、NestJS内でTypeORMを有効化する

docker-compose.ymlに追記して、MySQLコンテナを立ち上げる

以下のように、追記します

docker-compose.yml
version: "3.7"
services:
  api:
    container_name: api
    build: .
    tty: true
    ports:
      - "3000:3000"
    volumes:
      - type: bind
        source: .
        target: /api
+   depends_on:
+     - db
+ db:
+   container_name: db
+   image: mysql:5.7
+   ports:
+     - '3306:3306'
+   environment:
+     MYSQL_ROOT_PASSWORD: password
+     MYSQL_DATABASE: develop
+     MYSQL_USER: user
+     MYSQL_PASSWORD: password

typeORMはMySQLの5系しか対応していなかったはずです。。。

では、コンテナを立ち上げ直しましょう。

docker compose up -d

正常に立ち上がっているかの確認です。

docker compose ps

以下のようになっていればOKです

NAME                COMMAND                  SERVICE             STATUS              PORTS
api                 "docker-entrypoint.s…"   api                 running             0.0.0.0:3000->3000/tcp
db                  "docker-entrypoint.s…"   db                  running             0.0.0.0:3306->3306/tcp

これでコンテナの立ち上げは終了です。

TypeORMをインストールして、NestJS内でTypeORMを有効化する

参照先はこちら

以下のコマンドを入力して、TypeORMをインストールします。

docker compose exec api npm install --save @nestjs/typeorm typeorm mysql2

もし、エラーみたいなものがでても大丈夫です。(npmのバージョンによるものです。)
気になるようでしたら、以下のコマンドを入力し、再度TypeORMをインストールしていただければ大丈夫です。参照先

docker compose exec api npm i -g npm@6

次に、ルートモジュールと呼ばれるapp.module.tsに以下を追記します。

app.module.ts
import { Module } from '@nestjs/common';
+ import { TypeOrmModule } from '@nestjs/typeorm';
import { AppController } from './app.controller';
import { AppService } from './app.service';

@Module({
  imports: [
+   TypeOrmModule.forRoot(),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

さらに、ルートディレクトリにormconfig.jsonファイルを追加し、以下の内容を加えます。

ormconfig.json
[
  {
    "type": "mysql",
    "host": "db",
    "port": 3306,
    "username": "user",
    "password": "password",
    "database": "develop",
    "synchronize": true,
    "entities": ["src/entity/*.entity.{ts,js}"],
    "migrations": ["src/migration/*.ts"],
    "cli": {
      "migrationsDir": "src/migration/"
    }
  }
]


追記:上記のormconfig.jsonだと上手にDBに接続できない問題が後に発生したので以下のようにapp.module.tsormconfig.jsonに変更を加えました。
さらに、app.service.tsapp.controller.tsは使用しないので削除しました。


ormconfig.ts
import { MysqlConnectionOptions } from 'typeorm/driver/mysql/MysqlConnectionOptions';

const options: MysqlConnectionOptions = {
  type: 'mysql',
  host: 'db',
  port: 3306,
  username: 'user',
  password: 'password',
  database: 'develop',
  entities: [__dirname + '/**/*.entity{.ts,.js}'],
  migrations: ['migration/*.migration{.ts,.js}'],
  cli: {
    migrationsDir: 'migration',
  },
};

module.exports = options;


app.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import * as ormConfig from '../ormconfig';
import { PostsModule } from './posts/posts.module';

@Module({
  imports: [TypeOrmModule.forRoot(ormConfig), PostsModule],
  controllers: [],
  providers: [],
})
export class AppModule {}

これで、環境構築は終了です! お疲れ様でした!!😄

Discussion

ログインするとコメントできます