YusukeKatoブログ

Dockerコンテナのリソースの制限を設定【シェル芸オンラインジャッジ】

記事投稿日: 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

CPU

下記コマンドで負荷をかけます。

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

おわりに

コンテナのリソースの制限を設定しました。 本当はユーザも変更したかったのですが、 設定が面倒そうなのでまた時間がある時に対応します。 それでは、また。

お知らせ

過去のお知らせ

シリーズ記事一覧

各シリーズの記事を下記にまとめてあります。

我が家のインコ「れもん&ぽぽ&ぐぐ&さん」の日記 我が家のインコ「れもん&ぽぽ&ぐぐ&さん」の日記24 : 2026年もよろしくお願いします 我が家のインコ「れもん&ぽぽ&ぐぐ&さん」の日記23 : 2025年の我が家のインコ 我が家のインコ「れもん&ぽぽ&ぐぐ&さん」の日記22 : 我が家にさんちゃんがやってきた 我が家のインコ「れもん&ぽぽ&ぐぐ」の日記21 : 2ヶ月ぶりのインコ日記 我が家のインコ「れもん&ぽぽ&ぐぐ」の日記20 : 久しぶりのインコ日記 我が家のインコ「れもん&ぽぽ&ぐぐ」の日記19 : 鳥フェス浅草2025に行ってきました! 我が家のインコ「れもん&ぽぽ&ぐぐ」の日記18 : 2024年に感謝&2025年もよろしくお願いします 我が家のインコ「れもん&ぽぽ&ぐぐ」の日記17 : れもんもぐぐも平和な日々を送っています 我が家のインコ「れもん&ぽぽ&ぐぐ」の日記16 : れもんが本に掲載されたり、愛鳥祭に行ったりなど 我が家のインコ「れもん&ぽぽ&ぐぐ」の日記15 : 落花生、新聞紙、れもんとぐぐの邂逅 インコの飼い方と注意点(2024年版) 我が家のインコ「れもん&ぽぽ&ぐぐ」の日記14 : 大人に近づくれもんと遊ぶ余裕が出てきたぐぐ 我が家のインコ「れもん&ぽぽ&ぐぐ」の日記13 : 生後4ヶ月を迎えたれもんと我が家に慣れてきたぐぐ 我が家のインコ「れもん&ぽぽ&ぐぐ」の日記12 : ぽぽが亡くなりました、そしてぐぐがやってきました インコ仲間「れもん&ぽぽ」の日記11 : ズグロシロハラインコのぽぽ、我が家へ セキセイインコ「れもん」の日記10 : 生後100日のれもん、ついに喋る セキセイインコ「れもん」の日記9 : 換羽期のれもん セキセイインコ「れもん」の日記8 : 病院へ挑戦! セキセイインコ「れもん」の日記7 : 外出用ゲージにチャレンジ! セキセイインコ「れもん」の日記6 : 新宿ことり博に行ってきました! セキセイインコ「れもん」の日記5 : 3週間経って順調に成長している模様 セキセイインコ「れもん」の日記4 : 鳥フェス千葉2024に行ってきました! セキセイインコ「れもん」の日記3 : 2週間経って我が家にも慣れてきた模様 セキセイインコ「れもん」の日記:第2回 セキセイインコの「れもん」が我が家にやってきました!
AlpacaHackで始めるCTF入門 AlpacaHackで始めるCTF入門7:AlpacaHack Round 5 - XorshiftStreamに挑戦 AlpacaHackで始めるCTF入門6:AlpacaHack Round 4 - Simple Flag Checkerに挑戦 AlpacaHackで始めるCTF入門5:AlpacaHack Round 3 - qrimeに挑戦 AlpacaHackで始めるCTF入門4:AlpacaHack Round 2 - Simple Loginに挑戦 AlpacaHackで始めるCTF入門3:初めてのCTFに参加 AlpacaHackで始めるCTF入門2:DreamhackでCTF入門 AlpacaHackで始めるCTF入門1:初めてのCTF
シェル芸 Dockerコンテナのリソースの制限を設定【シェル芸オンラインジャッジ】 Google AI Studioで自作のウェブサイトの改善点を教えてもらった シェル芸オンラインジャッジの紹介 第66回シェル芸勉強会メモ 第64回シェル芸勉強会メモ ChatGPTでシェル芸勉強会の問題が解きたい シェル芸botで遊びたい(Bash)
シェル芸オンラインジャッジ Dockerコンテナのリソースの制限を設定【シェル芸オンラインジャッジ】 Google AI Studioで自作のウェブサイトの改善点を教えてもらった シェル芸オンラインジャッジの紹介
ROS 2 ROS 2シェル芸:URDFを置換してRVizで表示する 改訂新版『ROS 2ではじめよう』を読了&メモ書き ROS 2 Jazzy公式チュートリアル02: ROS 2のノードとトピックについて ROS 2 Jazzy公式チュートリアル01: ROS 2 Jazzyのインストールから動作確認まで ROS 2 Humble 公式チュートリアル 02: ROS 2 のノード関係のコマンド ROS 2 Humble 公式チュートリアル 01: 環境構築から turtlesim まで
VRChat 【VRChat】UnityとBlenderでアバターのパーツを作る VRChatのワールド「森の中のログハウス」をUnityで作成してアップロードするまで VRChatでワールドをパブリック(コミュニティーラボ)へアップロードする VRChatのアバターにGoGo Locoを導入して座ったり寝っ転がったりする VRChatのワールドでオブジェクトと変数の同期を行う VRChatのスマホアプリ(Android)用にアバターをアップロードする Modular Avatarを使ってVRChatのアバターのオブジェクトをワールドに固定する VRChatのアバターのオブジェクトにアニメーションを設定する 【VRChat】Modular Avatarを使ってアバターのオブジェクトの表示と非表示を切り替える 公開されているVRMモデルをVRChatで動かす
技術ネタ WSL2で開いたVisual Studio Codeで日本語入力が不安定になる問題の解決 TouchDesignerを使って曲の音声に合わせた動画を作成してみる Sonic Piで作曲してみる Visual Studio CodeでGitHub Copilot使用時にGitHubにサインインできない問題を解決 Unityでブラウザゲーム(Webアプリ)を作成してレンタルサーバで動かす方法 echoコマンドで"-n"をそのまま出力したい Ubuntu 24.04 LTSにおいてノートPCを電源に接続していない状態だと画面が暗くなる問題の解決方法 HTMLのvideoタグで貼った動画のサムネイルがSafariで表示されない問題を解決 WSL2上のUbuntuのVimで矩形選択するための設定 HTMLとCSSで画像のスライドショーを作成 GitHub Actionsでサーバ上のブログを自動更新 Windows と Ubuntu のデュアルブート
ELDEN RING BLOG ELDEN RING BLOG 10: DLCをクリアしました! ELDEN RING BLOG 9: DLCに挑戦した ELDEN RING BLOG 8: 最後のボスを倒した ELDEN RING BLOG 7: ラニのストーリーを進めた ELDEN RING BLOG 6: 四体目と五体目の大ボスを倒した ELDEN RING BLOG 5: 三体目の大ボスを倒した ELDEN RING BLOG 4: 二体目の大ボスを倒した ELDEN RING BLOG 3: 一体目の大ボスを倒した ELDEN RING BLOG 2: レベル上げと武器強化の旅 ELDEN RING BLOG 1: 今更ながら始める初見ELDEN RING冒険日記
ELDEN RING NIGHTREIGN BLOG ELDEN RING NIGHTREIGN BLOG 3: 喰らいつく顎を倒した ELDEN RING NIGHTREIGN BLOG 2: 最初の標的を倒した ELDEN RING NIGHTREIGN BLOG 1: マルチプレイ初戦
ポケポケブログ ポケポケブログ4:「超克の光」環境でもベトベトンデッキはまだ強い ポケポケブログ3:「時空の激闘」環境でもベトベトンデッキを使いたい ポケポケブログ2:「幻のいる島」環境でもベトベトンデッキが強いです ポケポケブログ1:ベトベトン+マタドガスデッキをおすすめする
読書日記 読書日記:山崎ナオコーラ『人のセックスを笑うな』(河出文庫) 読書日記:プジェ日記を読みました! 読書日記『本を読んだことがない32歳がはじめて本を読む』【ネタバレあり】 読書日記:近畿地方のある場所について【ネタバレあり】 改訂新版『ROS 2ではじめよう』を読了&メモ書き
映画日記 映画日記『ラストマイル』感想【ネタバレあり】
料理日記 料理日記:オムライス 料理日記:豆腐春巻き 料理日記:鶏肉とナスのほりにし炒め 料理日記:卵焼き 料理日記:鶏肉の照り焼き&小松菜のおひたし 料理日記:納豆蕎麦 料理日記:ローストビーフ 料理日記:バターガーリックチキン
その他 JR東日本公式のお忘れ物チャットにお世話になった話 『Omega Crafter』プレイ日記: チュートリアル編 自作ブログ大改造計画 HTML数式表示テスト 自作ブログ開始

YusukeKatoブログの著作物はCC BY-NC-ND 4.0で公開されています。
YusukeKatoブログのソフトウェアはApache License 2.0で公開されています。
About License: GitHub - YusukeKatoBlog/LICENSE
© 2023 YusukeKato All Rights Reserved.