Dockerはlimits.confを無視します(「オープンしているファイルが多すぎます」エラーを解決しようとします)
何千もの同時Webソケット接続を処理するWebサーバーを実行しています。これを可能にするには、オープンファイルのデフォルト数が1000に設定されているDebian linux(私のベースイメージはgoogle/debian:wheezy、GCEで実行)で、通常はulimitを目的の数(64,000)に設定します。
アプリケーションがドッキングされてデプロイされたときを除いて、これはうまく機能します。Dockerが制限の定義を無視していることがわかりました。私は次のことを試しました(すべてコンテナではなくホストマシンで):
MAX=64000
Sudo bash -c "echo \"* soft nofile $MAX\" >> /etc/security/limits.conf"
Sudo bash -c "echo \"* hard nofile $MAX\" >> /etc/security/limits.conf"
Sudo bash -c "echo \"ulimit -c $MAX\" >> /etc/profile"
ulimit -c $MAX
いくつかの調査を行った後、私は人々がこれを行うことで同様の問題を解決できることがわかりました:
Sudo bash -c "echo \"limit nofile 262144 262144\" >> /etc/init/docker.conf"
そしてDockerサービスを再起動/再起動します。
ただし、上記のすべてが失敗します。コンテナー内でアプリを実行すると、「開いているファイルが多すぎます」というエラーが表示されます(Dockerを使用せずに以下を実行すると問題が解決します)。
実行しようとしましたulimit -a
コンテナ内でulimitの設定が機能しているかどうかを表示しますが、そうすると、ulimitがPATHの一部である実行可能ファイルではないというエラーがスローされます。
誰かがこれに遭遇したり、Dockerに制限を認識させる方法を提案したりできますか?
私はこの問題を次の設定で軽減することができました:
私はドッカーマシンとホストマシンにubuntu 14.04 linuxを使用しました。
Hostマシン上で:
- /etc/security/limits.confを更新して:
* - nofile 64000
を含めます - /etc/sysctl.confに追加:
fs.file-max = 64000
- sysctlを再起動します。sudosysctl -p
コンテナの実行中に制限を引数として渡すことができます。そうすれば、ホストの制限を変更したり、コンテナーに過剰な力を与えたりする必要がなくなります。方法は次のとおりです。
docker run --ulimit nofile=5000:5000 <image-tag>
Docker-composeを使用すると、ulimitsを構成できます。
https://docs.docker.com/compose/compose-file/#ulimits
ソフト/ハード制限をマッピングとして追加できます。
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
理想的ではありませんが、特権オプションを使用してコンテナーを実行できます(主に、Dev環境用の迅速で非最適なソリューションのため、セキュリティが懸念される場合はお勧めしません)。
docker run --privileged
見てください:
https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities