web-dev-qa-db-ja.com

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に制限を認識させる方法を提案したりできますか?

17
orcaman

私はこの問題を次の設定で軽減することができました:

私はドッカーマシンとホストマシンにubuntu 14.04 linuxを使用しました。

Hostマシン上で:

  • /etc/security/limits.confを更新して:* - nofile 64000を含めます
  • /etc/sysctl.confに追加:fs.file-max = 64000
  • sysctlを再起動します。sudosysctl -p
10
Eran Chetzroni

コンテナの実行中に制限を引数として渡すことができます。そうすれば、ホストの制限を変更したり、コンテナーに過剰な力を与えたりする必要がなくなります。方法は次のとおりです。

docker run --ulimit nofile=5000:5000 <image-tag>
5
mtyurt

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

4
lvolmar