2017-02-12 3 views
1

片側にhttps(http/2)インターフェイスを提供し、SQL Serverデータベースと通信するnodejsアプリケーションを開発しました。 SMTPメール送信者、およびhttpベースの郵便番号検索サービスを提供します。本質的には、Webベースの単一ページアプリケーションです。Dockerにファイルシステム内のどこに読み取り専用と読み書き可能な部分を置くことができますか

これは、LAN上のWindowsマシン上でデータベースに話しかけて、会社のLANに座っている小さなラズベリーパイ/ 2で動作します。他のサービスは外部です。アプリケーションをプライベートにすることは重要です。

これはこのアプリケーションの初期リリースであり、変更されることがあります。最も複雑なのは、長いダウンタイムなしに新しいバージョンのノードにアップグレードする方法です。

昨日私はDockerを見つけました。具体的には、ラズベリーパイにDockerを設定する方法についての記事です。これは私のアプリケーションをすばやく更新するための解決策であると私に感謝します。ノードとアプリケーションをDockerコンテナにパッケージ化すると、ノードとアプリケーションの最新バージョンのコンテナを事前にビルドしてテストして、非常に迅速にインストールできます。

現在、Raspberry Piのファイルシステム用のSDカードは4つのパーティションに構成されています。 1)はブートパーティション、2)はファイルシステムのルートです。これらの2つは両方とも読み込み専用、3)piユーザのホームのパーティション、4)は/ varです。後者の2つは読み書き可能です。

インストールされたソフトウェアは、ログ(/ varに入る)を除いてすべて読み取り専用です。電源オフ時のSDカード破損から保護する。私は、ログオンが再びログオフするまでログオンがファイルシステムrwに変わるように、読み取り専用領域にホームディレクトリを持つユーザーとそのセットを持っています。このユーザーは、最新の本番リリースをインストールするためのコマンドを実行します。一部のテストと開発はpiユーザーで実行される可能性があります。そのため、領域は読み書き可能です。

Debianを実行しているデスクトップ(amd64)マシンにDockerをインストールしました。私がDockerのすべてのファイルを/ var/lib/dockerの下に置くことができる限り、これには、ロードされたイメージを構成するすべてのファイルが含まれます。/etc/dockerディレクトリがありますが、そこには唯一の設定が鍵のように見えます。

私の質問は、そこにアカウントにログインしてログアウトしたときに再び読み取り専用になるときに、コンテナイメージが実際に読み取りと書き込みを切り替える領域に置かれるようにDockerを構成する方法しかし、書き込まれるコンテナの部分(おそらくnone - 次の段落を参照)は/ varです。

私のアプリケーションは実際にログをstdoutとstderrに書き込みます。現時点では、PM2によって管理されています。PM2は、終了時にPM2を再起動しますが、ログを回転するログファイルのペアに書き込みます。残念ながら、私はアプリケーションが失敗し、PM2がそれを再起動しなかった場合があります

私はDockerが自動的に失敗したコンテナを再起動するように設定されている可能性があります。また、stdoutとstderr Dockerコンテナの外部にあるファイルにリダイレクトされます。これにより、後で見るのがより簡単になります。これは可能ですか? Dockerコンテナの内部でpm2を使用し続けるのが良いかどうか、またはそれが可能であれば、

答えて

2

私はDockerをデスクトップ(amd64)マシンにインストールしたばかりです。私がDockerのすべてのファイルを/ var/lib/dockerの下に置くことができる限り、これには、ロードされたイメージを構成するすべてのファイルが含まれます。/etc/dockerディレクトリがありますが、そこには唯一の設定が鍵のように見えます。

は、だから私の質問は、コンテナの画像は実際に切り替えるエリアに座ることができるようにドッカーを設定する方法はあります、私はそこのアカウントにログインしたときに書き込みを読んで、私はログアウト時に読み取り専用に再びなりますしかし、書き込まれるコンテナの部分(おそらくnone - 次の段落を参照)は/ varです。

あなたは、デーモンの--graph(または短い-g)フラグを設定することにより、/var/lib/dockerから他のディレクトリにドッカールートディレクトリを変更することができます。 systemdにを使用するときは、簡単なドロップイン(例えば、/etc/systemd/system/docker.service.d中)を使用して、これを達成することができます

[Service] 
ExecStart= 
ExecStart=/usr/bin/dockerd --graph=/path/to/readonly/dir 

に正確な手順をごドッカー版とLinuxディストリビューションによって異なる場合があります。詳細については、the documentationを参照してください。

ただし、イメージとコンテナの両方のファイルシステムの格納に影響します。 1つの読み取り専用ともう1つを書き込み可能にすることは、この方法では不可能です。

私のアプリケーションは実際にログをstdoutとstderrに書き込みます。現時点では、PM2によって管理されています。PM2は、終了時にPM2を再起動しますが、ログを回転するログファイルのペアに書き込みます。残念ながら、私はアプリケーションが失敗し、PM2がそれを再起動しなかった場合があります

私はDockerが自動的に失敗したコンテナを再起動するように設定されている可能性があります。また、stdoutとstderr Dockerコンテナの外部にあるファイルにリダイレクトされます。これにより、後で見るのがより簡単になります。これは可能ですか?確かにそれが可能であればそれは良い習慣です、または私はドッカーコンテナ

内PM2を使用し続けた方が良いだろうあなたは(more on restart policiesを参照)--restart=on-failureを使用してコンテナを開始することができます。これにより、ゼロ以外の終了コードが存在する場合、Dockerエンジンによってコンテナが自動的に再起動されます。または、終了コードに関係なくコンテナを再起動するには、--restart=alwaysを使用します。個人的には、PM2の追加機能が必要な場合を除き、Docker内でPM2を使用することを推奨します。

ロギングについて:デフォルトでは、DockerはコンテナのメインプロセスのすべてのSTDOUTおよびSTDERR出力を取得し、独自のログファイル(デフォルトでは/var/lib/docker/containers/<CONTAINER-ID>/<CONTAINER-ID>-json.log)に格納します。 docker logs <CONTAINER-NAME>を使用して表示できます。

これが必要でない場合は、コンテナを起動するときに--log-driverフラグを設定することにより、ロギングメカニズムを変更できます(たとえば、--log-driver=syslog)。詳しくは、the documentationを参照してください。

関連する問題