この記事でわかること
swarm modeで動作しているコンテナのカーネルパラメータを変更する方法
目的
Docker swarm modeで動作hしているコンテナのカーネルパラメータ
(具体的にはnet.core.somaxconn)の変更方法を整理する。
なぜこの記事を書いたか
swarm-modeがsysctlオプションに対応していない
Docker 1.12以降で、非swarm modeの場合は--sysctlオプションにより
カーネルパラメータをコンテナ毎に設定することが可能であるが、
swarm modeでは同等のオプションが設定されていない(ように見える)から。
コンテナ起動後は/proc配下を書き換えできない
コンテナ起動後は/proc配下の(擬似?)ファイル群はread onlyでマウント
されており変更を受け付けないため。
手順
ここでは例としてnginxをあげている。
端的に述べると1.11以前の方法を用いることでコンテナ起動後にカーネルパラメータを
変更することが可能です。
コンテナの起動
起動時にコンテナに/proc以下の適当なボリュームをマウントする。
docker service create --volume type=bind,source=/proc/sys/net/core/somaxconn,destination=/somaxconn --replicas 1 nginx
ポイントは
/proc/sys/net/core/somaxconnを/somaxconnにマウント
しているところです。
コンテナでコマンドを実行
sudo docker exec -it コンテナID/名前 /bin/bash
sysctl -a | grep "somaxconn"
中略
net.core.somaxconn = 128
echo "512" > /somaxconn
sysctl -a | grep "somaxconn"
中略
net.core.somaxconn = 512
これで変更できた。
補足
このようにしてしまえば/wproc/sys配下のファイルに値を書き込むことで
様々なカーネルパラメータをもりもり変更できるようになる。
試行錯誤するぶんには良いかもしれない。
docker service create --name nginx -p 80:80 --replicas 1 --mount type=bind,source=/proc/sys,destination=/wproc/sys nginx:latest
注意
仕組みとしてはnamespace周りが云々とのことだけれども、
そのあたりはあまり詳しくないので詳細には説明できない。
docker inspactから個別コンテナに与たカーネルパラメータの値を取得できるため、
非swarm mode(docker runで起動)コンテナの場合はsysctlオプションを使ったほうがよい。
参考文献