web-dev-qa-db-ja.com

特権Dockerコンテナーを使用したカーネル調整

ロードバランサーのカーネル設定を調整するコンテナーを構築しています。単一の特権コンテナーを使用して、これらの変更をホスト内のイメージに展開したいと思います。例えば:

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
10
allingeek

この特定の設定は、Dockerが実行されるネットワーク名前空間の影響を受けます。

原則として、/procはシステム全体に関連する設定を変更しますが、技術的には、ネットワーク名前空間ごとに結果を返す/proc/netの設定を変更します。

/proc/netは実際には/proc/self/netへのシンボリックリンクであることに注意してください。これは、実際に作業を行っている名前空間の設定を反映しているためです。

8
Matthew Ife

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 ...
7
hyperknot

特権コンテナは、/procの独自のプロセス名前空間をまだ使用しています。あなたができることは実際の/procをコンテナ内にマウントすることです:

docker run --rm --privileged -v /proc:/Host-proc ubuntu:latest \
  'echo 65535 > /Host-proc/sys/net/core/somaxconn'
3
Ángel

これは私にとってDocker 1.5.0で動作します:

docker run --privileged --net=Host --rm ubuntu:latest /bin/sh -c \
   'echo 65535 > /proc/sys/net/core/somaxconn'   
2