バックエンド開発のためのDockerによるNESTJSプロジェクトの設定


NESTJSは、私たちのNodeJsのAPI開発のためのバックエンドのフレームワークは、現在のNODEJS +エクスプレスアプリケーションを設定することができますどのように迷惑を発見した後、かなりの間、それはあなたがTypesScriptのサポートをしたい場合、それは非常に多くの設定が必要です.
また、開発のためにDockerを実装することを信じています(そして、確実に、生産のために)、それは展開を非常に簡単にして、どんなサービスでも展開することができないので、私のバックエンドアプリケーションのすべてでものを持たなければなりません.

必要条件
このチュートリアルの主な焦点がDockerでNESTJSアプリ環境を走らせることになっているので、私はNESTJSかDockerにあまり深く行きません.私はNESTJSとDockerについて別々のシリーズを作ります.
完全に次のコードがどのように動作するかを理解するためには、次の科目の基本的な理解が必要です.
  • 端末の操作
  • ジャバスクリプト
  • Dockerの仕組み

  • 始めましょう!

    新しいNESTJSアプリケーションの作成
    を使用して起動します.npm マシンで新しいプロジェクトを作成します.
    $ npm i -g @nestjs/cli
    $ nest new nestjs-docker
    
    新しいプロジェクトを作るとき、NESTJSはあなたに尋ねるでしょう

    Which package manager would you ❤️ to use?


    私は選ぶつもりですnpm このチュートリアルではyarn あなたが本当にしたいならば.
    インストール終了後cd あなたの新しいアプリケーションディレクトリにアプリケーションを実行します.
    $ cd nestjs-docker
    $ npm run start:dev
    
    次に、アドレスを使用してブラウザで新しく作成されたアプリケーションを開きますhttp://localhost:3000 ためには、すべてがスムーズに実行を確認します.

    新規APIサービスの作成
    Dockerでそれをコンテナ化した後にAPIをテストするために使うことができるハードコードされた配列の映画を返す新しいAPIサービスを作成しましょう.
    新しく作成したプロジェクトディレクトリをお気に入りのテキスト/コードエディタで開きますVisual Studio Code ).
    ワークスペースは次のようになります.

    そして、src ディレクトリ.ここでは、我々の開発を開始するために、アプリケーションのソースファイルを見つけることができます
    ファイルを開くapp.service.ts ファイルの内容を次のコードに置き換えます.
    import { Injectable } from '@nestjs/common';
    
    export interface Movie {
      id: number;
      name: string;
      year: number;
    }
    
    @Injectable()
    export class AppService {
      private movies: Movie[] = [
        { id: 1, name: 'Star Wars: The Force Awakens', year: 2015 },
        { id: 2, name: 'Star Wars: The Last Jedi', year: 2017 },
        { id: 3, name: 'Star Wars: The Rise of Skywalker', year: 2019 },
      ];
    
      getMovies(): Movie[] {
        return this.movies;
      }
    }
    
    注:移植性の高いモデルを追加します.Movie ) サービスクラスファイルには間違いなく良い練習ではありません.デモ目的のためだけです.あなたのアプリケーションのための別のモデルファイルを使用します.
    次に、ファイルを開きますapp.controller.ts ファイルの内容を次のコードに置き換えます.
    import { Controller, Get } from '@nestjs/common';
    import { AppService, Movie } from './app.service';
    
    @Controller()
    export class AppController {
      constructor(private readonly appService: AppService) {}
    
      @Get()
      getMovies(): Movie[] {
        return this.appService.getMovies();
      }
    }
    
    プロジェクトを再び実行するnpm run start:dev ブラウザでアプリを開くhttp://localhost:3000 または使用することができますPostman と新しいGET よりフォーマットの意味のワークフローを要求します.
    最終的な結果は次のようになります.


    これをDockerizeしましょう!
    今私たちのバックエンドAPIアプリケーションを実行している、開発のためのDockerを使用してそれを格納しましょう.
    プロジェクトのルートディレクトリに次のファイルを作成します.
  • Dockerfile - このファイルはDocker画像のインポートに責任がありますdevelopment and production すべてのファイルをコピーしてインストールする環境npm 依存
  • docker-compose.yml - このファイルは、アプリケーションの他のサービス、ストレージボリューム、環境変数などのコンテナ、必要なイメージを定義する責任があります.
  • 開けるDockerfile 次のコードを追加します.
    FROM node:12.19.0-alpine3.9 AS development
    
    WORKDIR /usr/src/app
    
    COPY package*.json ./
    
    RUN npm install glob rimraf
    
    RUN npm install --only=development
    
    COPY . .
    
    RUN npm run build
    
    FROM node:12.19.0-alpine3.9 as production
    
    ARG NODE_ENV=production
    ENV NODE_ENV=${NODE_ENV}
    
    WORKDIR /usr/src/app
    
    COPY package*.json ./
    
    RUN npm install --only=production
    
    COPY . .
    
    COPY --from=development /usr/src/app/dist ./dist
    
    CMD ["node", "dist/main"]
    
    開けるdocker-compose.yml ファイルを追加し、次のコードを追加します
    version: '3.8'
    
    services:
        dev:
            container_name: nestjs_api_dev
            image: nestjs-api-dev:1.0.0
            build:
                context: .
                target: development
                dockerfile: ./Dockerfile
            command: npm run start:debug
            ports:
                - 3000:3000
                - 9229:9229
            networks:
                - nesjs-network
            volumes:
                - .:/usr/src/app
                - /usr/src/app/node_modules
            restart: unless-stopped
        prod:
            container_name: nestjs_api_prod
            image: nestjs-api-prod:1.0.0
            build:
                context: .
                target: production
                dockerfile: ./Dockerfile
            command: npm run start:prod
            ports:
                - 3000:3000
                - 9229:9229
            networks:
                - nesjs-network
            volumes:
                - .:/usr/src/app
                - /usr/src/app/node_modules
            restart: unless-stopped
    
    networks:
        nesjs-network:
    

    Dockerコンテナの実行
    私たちは私たちのDockerファイルを定義しているので、我々は単独でdockerに我々のアプリを実行することができます.
    アプリケーションを起動するには、次のコマンドを端末で書きます.
    docker-compose up dev
    
    これは開発モードで起動します.私たちも私たちのファイルを保存するときに我々は変更を行うたびに再実行する必要はありませんファイルを保存する😍.
    そして、生産モードで我々のアプリを起動するには、それを推測…!次のコマンドを端末で実行します.
    docker-compose up prod
    
    メイクするGET 再び要求するhttp://localhost:3000 そしてベール!期待通りに動作するはずです.
    P . S :端末ログを溝に入れたい場合は、コンテナを別のデーモンに実行します-d フラグ:
    docker-compose up -d prod
    

    完了!
    あなたは完全なソースコードを見つけることができますhere .
    あなたがコメントで何を考えて、あなたが持っているかもしれないどんな質問でも遠慮なく私に知らせてください✌️