記事投稿日: 2026年1月31日(土)
最終更新日: 2026年1月31日(土)
シェル芸オンラインジャッジというウェブサイトを開発しています。 今回はユーザが入力したコマンドを実行するDockerコンテナにメモリやCPUなどのリソースの制限を設定しました。
シェル芸オンラインジャッジPythonスクリプトからコンテナを実行しています。 元々はネットワークの制限だけ設定していました。
container = self.client.containers.run(
self.image_id,
detach=True,
command="sleep 60",
ipc_mode="none",
network_mode="none",
)
メモリ、CPU、プロセス数、権限、データサイズの制限を設定しました。
container = self.client.containers.run(
self.image_id,
detach=True,
command="sleep 60",
ipc_mode="none",
network_mode="none",
mem_limit="256m", # メモリ制限
memswap_limit="1024m", # スワップ制限(メモリと同じ値にしてスワップさせない)
nano_cpus=500000000, # CPU使用率制限 (0.5 CPU)
pids_limit=50, # 最大プロセス数制限(フォーク爆弾対策)
cap_drop=["ALL"], # 全ての特権(Capabilities)を剥奪
tmpfs={"/media": "size=100M"},
ulimits=[
# fsize (file size): 1プロセスが作成できる最大ファイルサイズ(バイト単位)
docker.types.Ulimit(name="fsize", soft=50000000, hard=50000000)
],
)
設定が正しく行われているか確認してみます。
200MB程度のメモリの使用を試します。
python3 -c "a = 'a' * (200 * 1024 * 1024)"
強制終了しました。
z.bash: 1 行: 19 強制終了 python3 -c "a = 'a' * (200 * 1024 * 1024)"
また、コンテナのステータスを見るとメモリが256MBに制限されていることを確認できました。
docker stats
下記コマンドで負荷をかけます。
timeout 5s bash -c "while true; do :; done"
コンテナのステータスを見るとCPUの使用率が50%程度が上限になっていることが確認できました。
docker stats
下記コマンドでプロセスを100個作成します。
for i in {1..100}; do sleep 1 & done
コンテナのステータスを見るとPIDSの上限が50になっていることが確認できました。
docker stats
下記コマンドで制限より大きいファイルを作成すると、制限を超過した判定が出ることを確認しました。
dd if=/dev/zero of=/media/test_60mb bs=1M count=60
z.bash: 1 行: 19 ファイルサイズ制限を超過しました (コアダンプ) dd if=/dev/zero of=/media/test_60mb bs=1M count=60
コンテナのリソースの制限を設定しました。 本当はユーザも変更したかったのですが、 設定が面倒そうなのでまた時間がある時に対応します。 それでは、また。
各シリーズの記事を下記にまとめてあります。