GNU/Linux >> Linux の 問題 >  >> Linux

docker コンテナーの net.core.somaxcomm (または任意の sysctl プロパティ) を更新します。

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

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

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

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

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

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

    docker run -it --rm -v /proc:/writable-proc ubuntu:14.04 /bin/bash
    [email protected]:/# echo 1024 > /writable-proc/sys/net/core/somaxconn
    [email protected]:/# sysctl net.core.somaxconn
    net.core.somaxconn = 1024
    
  • 方法 2 は、Dockerrun.aws.json でのボリューム マッピングのサポートを介して、Elastic Beanstalk で機能するはずです。また、名前空間ごとの /proc の下にある他の調整可能なパラメーターに対しても機能するはずです。しかし、これは Docker 側の見落としである可能性が高いため、ボリューム マッピングに追加の検証を追加する可能性があり、その場合、このトリックは機能しません。


    更新:Docker が docker run --sysctl をサポートするようになったため、この回答は廃止されました。 オプション!

    OpenVPN コンテナーに使用する解決策は、nsenter を使用して完全な機能を備えたコンテナーの名前空間に入ることです。 、/proc/sys を再マウントしています 一時的に読み取り/書き込みを行い、設定を行い、再度読み取り専用で再マウントします。

    コンテナーで IPv6 転送を有効にする例:

    CONTAINER_NAME=openvpn
    
    # enable ipv6 forwarding via nsenter
    container_pid=`docker inspect -f '{{.State.Pid}}' $CONTAINER_NAME`
    nsenter --target $container_pid --mount --uts --ipc --net --pid \
       /bin/sh -c '/usr/bin/mount /proc/sys -o remount,rw;
                   /usr/sbin/sysctl -q net.ipv6.conf.all.forwarding=1;
                   /usr/bin/mount /proc/sys -o remount,ro;
                   /usr/bin/mount /proc -o remount,rw # restore rw on /proc'
    

    この方法では、コンテナーを特権で実行する必要はありません。


    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


    解決策を見つけました:

    {
        "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'
    

    Linux
    1. Dockerコンテナとは:初心者向け入門ガイド

    2. 高負荷用のsysctl設定とDDoS防止

    3. Nuget への SSL 認証が原因で、docker linux コンテナーの .NET Core ビルドが失敗する

    1. システム管理者向けの10のコンテナガイド

    2. 7つの楽しいLinuxコンテナ/画像転送機能

    3. Dockerコンテナを一覧表示する方法

    1. Ubuntu上のDockerコンテナのTraefik

    2. Linux 上の .NET Core 用 NuGet

    3. 実行中のコンテナのホスト名を指定するには?