「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'