HerokuからNodejsに移行してDockerに適用します.

4816 ワード

GitHub Commentのv 0.0.1版では、Herokuを配置プラットフォームとして使用しています.それは配置が便利で、開発者がコードに集中して生産力を解放します.
でも、Dockerを勉強しているうちに、このツールは本当に配置の効率を高めることができます.PaaSプラットフォームの機能制限もありません.
これはHerokuのようなPaaSプラットフォームを使うより生産性を高めるためにもたらしました.
今回のv 1.00版のリリースを機に、公式のHostをHerokuから自分のvps上のDocker容器に移しました.
このように、カスタムドメイン名や他のインフラストラクチャ(今後使うかもしれないデータベース、キャッシュなど)も使いやすく、これらのものはHerokuでお金が必要です.
じゃ、始めましょう.
GitHub CommentのServer端は簡単なnodejsアプリケーションです.
一つのnodejsを展開してHerokuに応用するには二つのポイントが必要です.
  • Procfileファイルは起動スクリプトを定義しています.内容は一行web: node app.jsだけです.ここにはウェブサーバが一つしかありません.nodeでエントリファイルapp.jsを起動すればいいです.
  • 環境変数の注入は、Herokuがアプリケーション管理インターフェース(コマンドラインインターフェースもある)に環境変数の配置を提供し、.env.exampleの3つの変数を定義しさえすれば、アプリケーションは構成を読み取り、正しく起動することができます.
  • 一つのnodejsをDocker化する原理も似ています.環境変数と指定スタートスクリプトを提供するだけです.
    まず、GitHub Comment全体のcodebaseをイメージに入れます.このステップは簡単で、プログラム全体にハードコードの外部依存性がないからです.
    まずプロジェクトのルートディレクトリの下でDocerfileを作成します.イメージはどのように構築されますか?
    #    image    image   docker     node image
    #    [GitHub Comment](http://www.songofcode.com/github-comment/)    nodejs        ,            
    FROM node:latest
    
    #                   /src   
    COPY . /src
    
    #       npm  
    RUN cd /src; npm install
    
    #    5000   
    EXPOSE 5000
    
    #     
    CMD ["node", "/src/app.js"]
    
    Docerfileを書くのは思ったより難しいです.考えてみれば、普段はどうやってプロジェクトを構築していますか?
    この例では簡単です.npmを使ってインストールするために必要な依存にほかならないです.したがって、Dockerfile全体における構築スクリプトはRUNキーワードの一つしかない.
    次いでEXPOSEのキーワードは、宿主または他の容器と対話するためのポートであるコンテナが内部に露出するポート番号を指定する.
    最後のCMDコマンドはProcfileとして機能しました.先ほど述べた起動スクリプトです.
    その後、コマンドdocker build -t mlc880926/github-comment .を使用して、自分のイメージを構築する.
    構築に成功した後にdocker imagesを実行すると、先ほど構築されたミラーが見えます.
    REPOSITORY                                   TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
    mlc880926/github-comment                     latest              e7b657ad5ce1        3 days ago          655.4 MB
    
    これでまず第一点は解決しました.次は環境変数の注入です.Dockerの中にはそれぞれの容器にコンテキストがあります.
    環境変数は起動時に注入し、次のshellコマンドを使えばいいです.
    docker run -d -p 5000:5000 --name github-comment \
      -e CLIENT_ID=xxxxxxxxxxx \
      -e CLIENT_SECRET=xxxxxxxxxxx \
      -e PERSON_TOKEN=xxxxxxxxxxx \
      mlc880926/github-comment
    
    こうしてGitHub Commentの容器が正式に起動されました.
    コンテナの5000ポートを宿泊ホストの5000ポートにマッピングしているのが見えます.そうすると、クライアントは呼び出し時にも5000ポートを書きます.しかし、私のvpsには他のサービスがあります.80ポートは一つだけです.
    このような場合には、nginxというhttp serverを使って反世代を行うのが一般的な解決策です.
    もうDockerを使いましたから、いっそ西元に届けて、nginxもdocker化しましょう.
    まず、dockerの公式は直接にnginxの容器を提供して、直接運行します.
    docker run -it -p 80:80 nginx
    
    dockerは公式からnginxの容器をダウンロードして起動します.vpsのドメイン名やipアドレスを訪問してみます.
    inxという文字を見たら起動が成功したと説明します.次は逆世代です.
    ここは二つの知識点に関連しています.
  • ファイルシステムをコンテナにマウントする
  • 容器間の通信
  • まず最初に言ってください.イメージは読み取り専用で、Javaのクラスに相当します.containerはインスタンスオブジェクトのようです.
    ホストのファイルシステムをコンテナにマウントすることは、オブジェクトを新規作成するときの構造方法のように異なる情報をそれぞれのインスタンスに伝えることです.
    nginxのイメージについては、プロファイルを提供すれば、各nginxのインスタンスの挙動を変更することができます.
    コマンドは以下の通りです
    docker run --name nginx -v `pwd`/config/server.conf:/etc/nginx/conf.d/default.conf:ro -d nginx
    
    上の行のコマンドの意味は、現在のディレクトリのconfig/server.com nfファイルをコンテナに入れる/etc/nginx/cnof.d/default.com f位置です.それはinxが配置ファイルを読み込むルートです.すると、コンテナの中のnginxは私が書いた配置ファイルによって逆世代になります.内容は以下の通りです.
    server {
        listen       80;
        server_name  github-comment.songofcode.com;
    
          location / {
            proxy_pass  http://comment:5000;
        }
    }
    
    今このように容器を起動すると、エラーが発生します.容器にコメントというドメイン名が見つからないからです.
    私達の目的は、コメントがGitHub Commentのある容器を指すことです.実は二つの容器をリンクさせて、コマンドを使います.
    docker run -it -d -p 80:80  --link github-comment:comment \
      -v `pwd`/config/server.conf:/etc/nginx/conf.d/default.conf \
      nginx
    
    上の命令で--link github-comment:commentとは、nginx容器を起動する際に、github-commentというコンテナ(この名前はGitHub Comment容器を起動する時に--nameで指定されている)を接続し、nginx容器にcommentと命名し、起動後、構成によって説明されているように、github-comment.songofcode.comにアクセスすれば、GitHub Commentのサービスに逆世代されます.
    この時にdocker psを入力してdockerのプロセスを確認すると、2つがあります.
    12dc30ffffce        nginx                                        "nginx -g 'daemon off"   29 hours ago        Up 29 hours         0.0.0.0:80->80/tcp, 443/tcp   evil_galileo
    c00847854896        mlc880926/github-comment                     "node /src/app.js"       45 hours ago        Up 45 hours         0.0.0.0:5000->5000/tcp        github-comment
    
    コマンドdocker exec -i -t 12dc30ffffce bashを使用して、現在nginx容器の内部に入ってホームスティス記録を確認すると、172.17.0.5 commentのような内容が見られます.これはコンテナ間通信の原理です.
    これで、Herokuに走っていたサービスがdockerに移されました.
    vpsに他のウェブサービスがあれば、このような方式で逆世代を行うことができます.すべてのサービスはdocker化できます.移転と配置がとても便利です.