ロードバランサーのカーネル設定を調整するコンテナーを構築しています。単一の特権コンテナーを使用して、これらの変更をホスト内のイメージに展開したいと思います。例えば:
docker run --rm --privileged ubuntu:latest sysctl -w net.core.somaxconn=65535
テストでは変更が有効になりますが、そのコンテナに対してのみ有効です。完全に特権のあるコンテナーを使用すると、/ procを変更すると、実際に基盤となるOSが変更されるという印象を受けました。
$docker run --rm --privileged ubuntu:latest \
sysctl -w net.core.somaxconn=65535
net.core.somaxconn = 65535
$ docker run --rm --privileged ubuntu:latest \
/bin/bash -c "sysctl -a | grep somaxconn"
net.core.somaxconn = 128
これは特権コンテナがどのように機能することになっていますか?
私はばかげたことをしているだけですか?
永続的な変更を行うための最良の方法は何ですか?
バージョン情報:
Client version: 1.4.1
Client API version: 1.16
Go version (client): go1.3.3
Git commit (client): 5bc2ff8
OS/Arch (client): linux/AMD64
Server version: 1.4.1
Server API version: 1.16
Go version (server): go1.3.3
Git commit (server): 5bc2ff8
/ procがマウントされたコマンドの例:
$ docker run -v /proc:/proc ubuntu:latest \
/bin/bash -c "sysctl -a | grep local_port"
net.ipv4.ip_local_port_range = 32768 61000
$ docker run -v /proc:/proc --privileged ubuntu:latest \
/bin/bash -c "sysctl -p /updates/sysctl.conf"
net.ipv4.ip_local_port_range = 2000 65000
$ docker run -v /proc:/proc ubuntu:latest \
/bin/bash -c "sysctl -a | grep local_port"
net.ipv4.ip_local_port_range = 32768 61000
$ docker run -v /proc:/proc --privileged ubuntu:latest \
/bin/bash -c "sysctl -a | grep local_port"
net.ipv4.ip_local_port_range = 32768 61000
この特定の設定は、Dockerが実行されるネットワーク名前空間の影響を受けます。
原則として、/proc
はシステム全体に関連する設定を変更しますが、技術的には、ネットワーク名前空間ごとに結果を返す/proc/net
の設定を変更します。
/proc/net
は実際には/proc/self/net
へのシンボリックリンクであることに注意してください。これは、実際に作業を行っている名前空間の設定を反映しているためです。
Docker 1.12+には、コンテナー内のsysctl値を調整するためのネイティブサポートがあります。 documentation からの抜粋を次に示します。
実行時に名前空間付きカーネルパラメータ(sysctl)を構成する
--sysctlは、コンテナー内の名前空間付きカーネルパラメーター(sysctl)を設定します。たとえば、コンテナネットワークの名前空間でIP転送をオンにするには、次のコマンドを実行します。
docker run --sysctl net.ipv4.ip_forward=1 someimage
あなたの例を使用すると、net.core.somaxconn
をレイズする正しい方法は次のようになります。
docker run ... --sysctl net.core.somaxconn=65535 ...
特権コンテナは、/proc
の独自のプロセス名前空間をまだ使用しています。あなたができることは実際の/proc
をコンテナ内にマウントすることです:
docker run --rm --privileged -v /proc:/Host-proc ubuntu:latest \
'echo 65535 > /Host-proc/sys/net/core/somaxconn'
これは私にとってDocker 1.5.0で動作します:
docker run --privileged --net=Host --rm ubuntu:latest /bin/sh -c \
'echo 65535 > /proc/sys/net/core/somaxconn'