はじめに
コンテナ内のプロセス数の上限を制限するdocker runのオプション--pids-limitを利用するハンズオンです。
--pids-limit int Tune container pids limit (set -1 for unlimited)
個人利用では指定することはないと思いますが、本番システムのコンテナのプロセスを無限に作成することでホスト側に悪影響を与えてしまうので本番環境で利用する場合は誤作動を考慮して大きな値を指定しておくという利用方法はあります。
環境情報
- Debian GNU/Linux 9
- Docker Version:19.03.5
コンテナ内のプロセスを制限する
以下の文法で起動したコンテナで
# docker run -it --pids-limit 3 ubuntu /bin/bash
プロセス数を確認するpsコマンドを押下すると2つのプロセスが確認できます。
root@9f7bffcf2398:/# ps
PID TTY TIME CMD
1 pts/0 00:00:00 bash
9 pts/0 00:00:00 psここでsleepを投入してプロセス数を増やして確認すると合計3つとなります。
root@9f7bffcf2398:/# sleep 60 &
[1] 11
root@9f7bffcf2398:/# ps
PID TTY TIME CMD
1 pts/0 00:00:00 bash
11 pts/0 00:00:00 sleep
12 pts/0 00:00:00 psこれをもう一度行うとプロセス数が上限を超えた4つになりpsコマンドが失敗します。
root@9f7bffcf2398:/# sleep 60 & [2] 13 root@9f7bffcf2398:/# ps bash: fork: retry: Resource temporarily unavailable bash: fork: retry: Resource temporarily unavailable bash: fork: retry: Resource temporarily unavailable bash: fork: retry: Resource temporarily unavailable bash: fork: Resource temporarily unavailable
ちなみにユーザ名を変えても同じ機構が利用できました。
# docker run -it --user 8 --pids-limit 3 ubuntu /bin/bash
mail@a87400da0d44:/$ ps
PID TTY TIME CMD
1 pts/0 00:00:00 bash
7 pts/0 00:00:00 ps
mail@a87400da0d44:/$ sleep 60 &
[1] 8
mail@a87400da0d44:/$ sleep 60 &
[2] 9
mail@a87400da0d44:/$ ps
bash: fork: retry: Resource temporarily unavailable
...
bash: fork: Resource temporarily unavailable
終わりに
プロセス数が上限に達するとforkシステムコールが失敗していることが分かります。
滅多に見ないエラーですが、コンテナ内で制限をかけているとたまに見かけるので覚えておくと役立ちます。
以上、ご参考になれば幸いです。