DockerでNodejs開発を簡略化する1——開発環境

6999 ワード

Nodejsアプリケーションを開発するには通常複数のミドルウェアを使いますが、開発者はコードを実行するためには自分のマシンにミドルウェアをインストールし、手間がかかります.複数のプロジェクトを同時に開発するとさらに面倒になります.本論文では、Nodejs+MongoDBプロジェクトを例に、Dockerの基本的な使い方を示しながら、Dockerに対する友好的なコードを作成する方法を提供しています.
プロジェクトの説明
tms-app-gwはAPIゲートウェイプロジェクトであり、受信したhttp要求を業務規則に従って対応サービスに転送し、受信した要求ごとにログを記録してカウントし、結果はmonogodbに保存する.
Dockerを通じて以下の問題を解決したいです.
  • は、mongodbの配置を簡略化し、開発者が現地でアプリケーションを実行するのに便利である.
  • は、nodejsアプリケーションをパッケージ化し、全体的なリリースを実現し、オペレータの配置を容易にする.
  • Docker
    まず、公式サイトの説明に従って、Dockerをインストールしてください.
    参考:https://docs.docker.com/get-started/#install-docker-desktop
    Dockerを使用するには、まずimagecontainerの概念を理解する必要があり、簡単に言えば、imageは実行環境のモジュラスであり、containerはモジュラスに従って作成された例である.imageDockerfileで定義されており、Dockerfileはバッチ処理コマンドであると考えられ、コマンドを実行することにより、ミラー上にパケットをインストールし、ファイルをコピーし、パラメータを設定する.imageがあればrunコマンドでコンテナを生成でき、生成時に実行時のパラメータを指定できます.関連する複数のコンテナがあれば、docker-composeを介して全体管理が可能である.docker-composeは、管理されているコンテナを編成ファイルdocker-compose.ymlに基づいて説明し、docker-compose upコマンドで起動し、docker-compose downは、そのため、各コンテナに対してコマンドを個別に実行しなくてもよい.
    参考:https://docs.docker.com/reference/
    私たちが必要とするimageは基本バージョンがすでにあります.hub.docker.com上で検索できます.各ミラー像は通常バージョンの山がありますが、最も重要な違いはimageがどのlinuxバージョンで構築されているかということです.このバージョンが一番小さいので、alpineを使用することを勧めています.
    次はプロジェクトのニーズに合わせて、Dockerを具体的に走ります.
    モングDB
    ベースミラーを探します.
    docker search mongo
    鏡像を地元に引き寄せる.
    docker pull mono
    コンテナを生成して実行します.
    docker run--rm--name tms-api-gw-mono-p 27017:27017-d monto:latest--rmは、容器が終了すると自動的に削除される.--name tms-api-gw-mongoは容器の名前を指定し、後から容器を操作する時に使うものです.-p 27017:27017は、コンテナ内部の27017ポートをホストの27017ポートにマッピングする.-dは、バックグラウンドで動作するように指定されている.
    容器に入ってデータを確認します.
    docker exec-it tms-api-gw-mono/bin/bash
    容器内でexitコマンドで容器から退出します.
    この時、地元で使えるMongoDBの例があります.データは容器に保存されています.容器を削除するたびにデータが消去され、常に「清潔」なMongoDBで開発されます.
    MongoDBのデータを永続的に保持する必要がある場合は、コンテナにローカルディレクトリにデータを書き込むことができ、runコマンドを実行するときにパラメータを指定します.
    docker run--rm--name tms-appi-gw-mongo-p 27017:27017-v/PWD/storage/mongo db:/data/db-d monto:latest-v $PWD/db:/data/dbは、ホスト内の現在のディレクトリのdbをコンテナの/data/dbにマウントし、monoデータとしてディレクトリを格納する.
    容器を管理するためにはいくつかのコマンドが必要です.
    docker ps-a〓はすべての容器を調べて、-aパラメータをプラスしないで運行のだけを表示します.
    docker stop container_name〓〓停止指定の容器
    docker rm container_name〓〓指定の容器を削除します.
    Docker命令の参考:https://docs.docker.com/engine/reference/commandline/cli/
    Nodejs
    まず、Nodejs公式サイトのこの記事を見てください.https://nodejs.org/zh-cn/docs/guides/nodejs-docker-webapp/以下はこの文章をもとに調整します.
    dockerのイメージを作ります.
    プロジェクトのルートディレクトリにDockerfileファイルを新規作成しました.ファイルの内容は以下の通りです.Nodejs公式サイトの文章と一致しないところに注釈をつけました.
    FROM node:alpine
    
    #   cnpm
    RUN npm install cnpm -g 
    
    WORKDIR /usr/src/app
    
    COPY package*.json ./
    
    #    dependencies  ,   devDependencies  ;     。
    RUN cnpm install --production \
      && cnpm install log4js
    
    COPY . .
    
    #           
    RUN mkdir config
    
    #          
    ENV TMS_API_GW_ENV='docker'
    
    EXPOSE 3000
    
    CMD [ "node", "./app.js" ]
    
    COPY . .は、ローカル・カレント・ディレクトリの下のコンテンツをミラーにコピーしたワーク・ディレクトリの下の/usr/src/appであるが、node_modulesconfigは、これらのコンテンツはコピーする必要がないので、.dockerignoreファイルを作成し、コピーが不要なコンテンツを指定する.
    .*
    node_modules
    config
    example
    
    鏡像を作成します.一番後ろの点を失わないように注意してください.
    docker build-t tms-appi-gw-node.
    docker imagsで既存の鏡像を見ることができます.
    コンテナを実行
    docker run--rm--name tms-apps-gw-node-p 5678:3000-v/config:/usr/src/config-d tms-app-app-gw-node
    複数のプロジェクトを同時に開発すれば、ポート衝突の問題がよく発生します.-pパラメータを通してコンテナを起動する時にポートを指定することができます.
    同じコードは複数の環境で実行する必要があります.開発、テスト、生産などを含みます.私たちは通常構成ファイルを使ってコードと運行環境を結合させます.Dockerを利用して、コードとコードに依存する標準的な環境をイメージして、コンテナを生成する時に環境に関する配置ファイルを指定することができます.このようにDockerミラー像の全体はリリースユニットになります.したがって、Docker fileでは、空のconfigディレクトリを作成し、パラメータ-v $PWD/config:/usr/src/app/configを介して実行環境を使用したローカルなプロファイルを指定しました.
    前に紹介したプロジェクトの基本状況については、mongodbにapiアクセスデータを記憶する必要があります.アプリケーションとmongodbが容器の中で運行している時に問題が発生しました.mongodbの住所は何ですか?
    現地開発環境では、私たちは通常localhostと書きますが、容器の中のlocalhostはコンテナであり、ホストではなく、アプリケーションはmongodbにアクセスできません.この問題を解決するために、プロジェクトに環境変数を導入し、コードconfig/gateway.sample.jsを参照してください.
    let host, port
    if (process.env.TMS_API_GW_ENV === 'docker') {
      host = 'docker.for.mac.host.internal'
      port = 3000
    } else {
      host = 'localhost'
      port = 5678
    }
    module.exports = {
      ...
    }
    
    前のDockerfileに環境変数ENV TMS_API_GW_ENV='docker'が指定されていますが、コードはこの環境変数に応じて設定されてもよく、コンテナdocker.for.mac.host.internalはシンクホストのアドレスを表しています.そうでなければlocalhostを使って、指定ポートはDockerfileEXPOSEのポートと一致しています.
    コンテナがバックグラウンドで実行されている場合、Nodejsアプリケーション出力のログを確認したいです.以下のコマンドを使います.
    docker logs tms-appi-gw-node
    ミラーはalpineをベースに作られているので、コンテナに入るコマンドは調整が必要で、bashshに変更します.
    docker exec-it tms-appi-gw-node/bin/sh
    これで、私たちはすでに容器の中でNodejsアプリケーションを実行できます.
    参考:https://github.com/nodejs/docker-node/blob/master/README.md#how-to-use-this-mage
    参考:NodejsがDockerを使用するための最適な実践について、https://github.com/nodejs/docker-node/blob/master/docs/BestPractices.md
    docker-compose
    すでに容器でNodejsを応用して走ることができますが、まだ不便です.mongodbとnodejs容器はそれぞれ開けて止まって、命令はまだ長いです.もっと簡単にできますか?はい、docker-composeを使います.
    参考:https://docs.docker.com/compose/compose-file/
    Docker for MacはすでにComposeを含んでいますので、Macユーザーは単独でComposeをインストールする必要はありません.docker-compose.ymlファイルを作成します.
    version: '3.7'
    services:
      app:
        build: ./
        image: tms-api-gw-node:latest
        container_name: tms-api-gw-node
        ports:
          - '5678:3000'
        volumes:
          - ./config:/usr/src/app/config
        depends_on:
          - mongodb
    
      mongodb:
        image: mongo:latest
        container_name: tms-api-gw-mongo
        ports:
          - '27017:27017'
        logging:
          driver: none
    
    上のこのファイルで指定されたロジックと前のrunコマンドによってそれぞれコンテナを実行するのは完全に等価です.
    起動容器
    docker-compse up-d
    容器を閉じる
    docker-compose down
    ミラーを更新
    docker-compse build
    鏡像の更新を繰り返すと、無効な鏡像が発生し、これらの不要な鏡像は次のコマンドで削除されます.
    docker imags cb 7 a 87 c 0359 b 22 minutes ago 170 MB
    docker rmi $(docker images | grep "^" | awk "{print $3}")
    
    ヒント:実際に本マシンでコードを書く時、Nodejsアプリケーションをイメージして実行する必要はありません.このようにコードを修正するたびにbuildを更新します.時間もかかりますし、無駄なミラー像もたくさん発生します.ここでのデモNodejsアプリケーションミラーは主に次のリリースのために準備されています.
    締め括りをつける
    Dockerは全体的に複雑ですが、開発者として基本概念と常用命令を身につけるだけで、Dockerを走ることができます.現地開発環境の管理作業を大幅に簡略化できます.
    次の研究はどうやってDockerを利用してNodejsアプリケーションの展開を行いますか?
    このシリーズの他の文章
    DockerでNodejs開発を簡略化します.2、開発環境からテスト環境まで.
    DockerでNodejs開発を簡略化する3——webhookで自動更新を実現する.