第4弾はcgroupによるリソース制限をテーマにした演習です。
テーマ
・cgroupによるコンテナのリソース制限
・フォークボム
補足
$:ホストOS #:コンテナ内
PID名前空間の共有
docker runコマンドでリソース制限を実施したコンテナ上で、フォークボムを実行します。
フォークボムは、再帰処理でforkを実行して無限にプロセスを生成する手法です。これを実施すると、OSのプロセステーブルが枯渇して新規のプロセス生成が行えなくなり、OSがクラッシュします。単純ですが、強力なDos攻撃手法になります。特にコンテナ上でこのような処理を実行した場合、コンテナのみならず、OSまで被害が及びます。
[root@ip-10-0-1-94 ~]# docker run --pids-limit 20 --memory 1g --cpus 0.5 --rm –it ubuntu:latest bash
root@91857cc104d0:/# forkbomb(){ forkbomb|forkbomb & } ; forkbomb
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: retry: Resource temporarily unavailable
bash: fork: retry: Resource temporarily unavailable
bash: fork: retry: Resource temporarily unavailable
bash: fork: retry: Resource temporarily unavailable
root@91857cc104d0:/# forkbomb(){ forkbomb|forkbomb & } ; forkbomb
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: retry: Resource temporarily unavailable
bash: fork: retry: Resource temporarily unavailable
bash: fork: retry: Resource temporarily unavailable
bash: fork: retry: Resource temporarily unavailable
今回は、コンテナ実行時にリソース制限を設けることでホストOSのリソースが枯渇するようなことはありません。逆に、上記のような制限を設けていないコンテナで上記を実施すると、OSのGUIが動かなくなったり、クラッシュする挙動が確認できるかと思います。実施する場合は仮想マシンなど復旧が容易な環境を用意しましょう。
後片付け
作業が終わったら不要なコンテナは削除しましょう。
#すべてのコンテナを停止
docker stop `docker ps -a -q`
#すべてのコンテナを削除
docker rm `docker ps -a -q`
docker stop `docker ps -a -q`
#すべてのコンテナを削除
docker rm `docker ps -a -q`