21

net.core.somaxconnWeb アプリケーションのリクエストのキューを大きくできるように、docker コンテナーを変更しようとしています。

OS では、docker の外部で、最初にプロパティを正常に変更します。

$ cat /proc/sys/net/core/somaxconn
128
$ sudo sysctl -w net.core.somaxconn=1024
net.core.somaxconn = 1024
$ cat /proc/sys/net/core/somaxconn
1024

しかし、その変更をdockerに反映する方法がわかりません。私はもう試した:

  • また、編集/etc/sysctl.conf中 (コンテナーの起動時にドッカーがそのファイルを読み取ることを期待)
  • コンテナの再起動sudo docker stopsudo docker run再起動
  • docker サービス全体を再起動するsudo service docker restart

しかし、コンテナ内では、cat /proc/sys/net/core/somaxconn常に表示されます128

私は docker 1.2 を実行しています (したがって、デフォルトでは/procコンテナ内の属性を変更することはできません) および Elastic Beanstalk で (--privilegedモードを使用しないと、変更できるようになります/proc)。

sysctl の変更を docker に反映するにはどうすればよいですか?

4

7 に答える 7

39

「net/core」サブシステムは、ネットワーク名前空間ごとに登録されます。また、somaxconn の初期値は 128 に設定されています。

ホストシステムで sysctl を実行すると、 initが所有するネットワーク名前空間コアパラメーターが設定されます。(基本的に、これはデフォルトの名前空間です)。これは、他のネットワーク名前空間には影響しません。

Docker コンテナーが開始されると、そのコンテナーの仮想ネットワーク インターフェイス (ホスト上でvethXXXとして表示される) は独自の名前空間にアタッチされますが、最初のsomaxconn値は 128 のままです。したがって、技術的には、この値を2 つのネットワーク名前空間がコンテナを共有していないためです。

ただし、コンテナーを特権モードで実行する以外に、この値を調整する方法が 2 つあります。

  1. コンテナの実行時に「--net host」を使用すると、ホストのネットワーク インターフェイスが使用され、同じネットワーク名前空間が共有されます。

  2. Docker のボリューム マッピング サポートを使用して、proc ファイル システムを読み書き可能としてマウントできます。秘訣は、「/proc」という名前ではないボリュームにマップすることです。これは、Docker が/proc/sys などを非特権コンテナーの読み取り専用として再マウントするためです。これには、ホストが /proc を rw としてマウントする必要があり、これはほとんどのシステムに当てはまります。

    docker run -it --rm -v /proc:/writable-proc ubuntu:14.04 /bin/bash
    root@edbee3de0761:/# echo 1024 > /writable-proc/sys/net/core/somaxconn
    root@edbee3de0761:/# sysctl net.core.somaxconn
    net.core.somaxconn = 1024
    

方法 2 は、 Dockerrun.aws.jsonでのボリューム マッピングのサポートを介して、Elastic Beanstalk で機能するはずです。また、名前空間ごとの /proc の下にある他の調整可能なパラメーターに対しても機能するはずです。しかし、これは Docker 側の見落としである可能性が高いため、ボリューム マッピングに追加の検証を追加する可能性があり、その場合、このトリックは機能しません。

于 2014-10-04T22:42:40.363 に答える
8

docker 1.12 は --sysctl で sysctl を設定するためのサポートを追加します。

docker run --name some-redis --sysctl=net.core.somaxconn=511 -d redis

ドキュメント: https://docs.docker.com/engine/reference/commandline/run/#/configure-namespaced-kernel-parameters-sysctls-at-runtime

于 2016-09-15T14:48:33.653 に答える
4

私は解決策を見つけました:

{
    "AWSEBDockerrunVersion": "1",
    "Command": "run COMMAND",
    "Image": {
        "Name": "crystalnix/omaha-server",
        "Update": "true"
    },
    "Ports": [
        {
            "ContainerPort": "80"
        }
    ]
}

詳細はこちら: /opt/elasticbeanstalk/hooks/appdeploy/pre/04run.sh

アップデート:

ファイルを追加.ebextensions/02-commands.config

container_commands:
    00001-docker-privileged:
        command: 'sed -i "s/docker run -d/docker run --privileged -d/" /opt/elasticbeanstalk/hooks/appdeploy/pre/04run.sh'
于 2014-12-09T07:27:22.720 に答える
2

これを解決する方法を理解したところで、Elastic Beanstalk は特権コンテナの実行をサポートするようになりました。次のサンプルのように を追加するだけです (を見て"privileged": "true"ください) 。Dockerrun.aws.jsoncontainer-1

{
  "AWSEBDockerrunVersion": 2,
  "containerDefinitions": [{
    "name": "container-0",
    "essential": "false",
    "image": "ubuntu",
    "memory": "512"
  }, {
    "name": "container-1",
    "essential": "false",
    "image": "ubuntu",
    "memory": "512",
    "privileged": "true"
  }]
}

この回答を別のスレッドから複製したことに注意してください。

于 2016-03-15T19:27:08.297 に答える
1

@nazim.sp の回答のように、Docker の作成は sysctls をサポートします。@Or Gal と同じ問題がありました。「サポートされていないオプションを無視しています:」しかし、別の構文を使用すると、docker-compose.yaml のスタンザの例が受け入れられました。

redis:
  image: redis
  container_name: redis
  sysctls: 
    net.core.somaxconn: "1024"

ソース: https://rollout.io/blog/adjusting-linux-kernel-parameters-with-docker-compose/

これは適切な回答のコメントである必要があることは理解していますが、コメントを追加する担当者がいない初心者の方は、飛び込んで「回答」する必要があります

于 2021-01-01T12:47:34.940 に答える