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に応用するには二つのポイントが必要です. 環境変数の注入は、Herokuがアプリケーション管理インターフェース(コマンドラインインターフェースもある)に環境変数の配置を提供し、 一つのnodejsをDocker化する原理も似ています.環境変数と指定スタートスクリプトを提供するだけです.
まず、GitHub Comment全体のcodebaseをイメージに入れます.このステップは簡単で、プログラム全体にハードコードの外部依存性がないからです.
まずプロジェクトのルートディレクトリの下でDocerfileを作成します.イメージはどのように構築されますか?
この例では簡単です.npmを使ってインストールするために必要な依存にほかならないです.したがって、
次いで
最後の
その後、コマンド
構築に成功した後に
環境変数は起動時に注入し、次のshellコマンドを使えばいいです.
コンテナの5000ポートを宿泊ホストの5000ポートにマッピングしているのが見えます.そうすると、クライアントは呼び出し時にも5000ポートを書きます.しかし、私のvpsには他のサービスがあります.80ポートは一つだけです.
このような場合には、nginxというhttp serverを使って反世代を行うのが一般的な解決策です.
もうDockerを使いましたから、いっそ西元に届けて、nginxもdocker化しましょう.
まず、dockerの公式は直接にnginxの容器を提供して、直接運行します.
inxという文字を見たら起動が成功したと説明します.次は逆世代です.
ここは二つの知識点に関連しています.ファイルシステムをコンテナにマウントする 容器間の通信 まず最初に言ってください.イメージは読み取り専用で、Javaのクラスに相当します.containerはインスタンスオブジェクトのようです.
ホストのファイルシステムをコンテナにマウントすることは、オブジェクトを新規作成するときの構造方法のように異なる情報をそれぞれのインスタンスに伝えることです.
nginxのイメージについては、プロファイルを提供すれば、各nginxのインスタンスの挙動を変更することができます.
コマンドは以下の通りです
私達の目的は、コメントがGitHub Commentのある容器を指すことです.実は二つの容器をリンクさせて、コマンドを使います.
この時に
これで、Herokuに走っていたサービスがdockerに移されました.
vpsに他のウェブサービスがあれば、このような方式で逆世代を行うことができます.すべてのサービスはdocker化できます.移転と配置がとても便利です.
でも、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
を起動すればいいです..env.example
の3つの変数を定義しさえすれば、アプリケーションは構成を読み取り、正しく起動することができます.まず、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という文字を見たら起動が成功したと説明します.次は逆世代です.
ここは二つの知識点に関連しています.
ホストのファイルシステムをコンテナにマウントすることは、オブジェクトを新規作成するときの構造方法のように異なる情報をそれぞれのインスタンスに伝えることです.
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化できます.移転と配置がとても便利です.