Docker run中〜上級者向け:パフォーマンス・セキュリティ・運用最適化

はじめに

docker run は最も基本的なコンテナ起動コマンドですが、上級者になるほど“設定の深さ”が重要になります。
単なる起動ツールではなく、リソース制御・セキュリティ強化・自動運用化の中核コマンドでもあります。

この記事では、実際に試せるハンズオンを通して docker run の中〜上級機能を体験していきます。


1. 環境準備

まずはシンプルなテスト用アプリケーションを用意します。

サンプルアプリの作成

mkdir docker-run-hands-on && cd docker-run-hands-on
cat <<EOF > app.py
from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, Docker run!"

@app.route("/health")
def health():
    return "OK"

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8080)
EOF

Dockerfileの作成

cat <<EOF > Dockerfile
FROM python:3.12-slim
WORKDIR /app
COPY app.py .
RUN pip install flask
EXPOSE 8080
CMD ["python", "app.py"]
EOF

ビルド

docker build -t docker-run-app .

2. リソース制御の実践

CPU制限

CPU使用率を1.5コアに制限して起動します。

docker run -d --name app_cpu --cpus="1.5" -p 8081:8080 docker-run-app

ホスト側でCPU使用率を観測し、コンテナごとに制限が効いているかを確認します。

docker stats app_cpu

メモリ制限

メモリ使用量を512MBに制限する例です。

docker run -d --name app_mem --memory="512m" docker-run-app

3. セキュリティ強化ハンズオン

非rootユーザーで実行

Dockerfileを編集し、専用ユーザーで実行します。

RUN useradd -m appuser
USER appuser

再ビルド後、以下のコマンドで確認します。

docker run -it --rm docker-run-app id

出力が uid=1000(appuser) のように表示されればOKです。

Capability制限

ネットワークバインドだけ許可し、それ以外は削除します。

docker run -d --cap-drop=ALL --cap-add=NET_BIND_SERVICE docker-run-app

読み取り専用ファイルシステム

コンテナ内部での不正書き換えを防ぎます。

docker run -d --read-only docker-run-app

4. ネットワーク構築ハンズオン

カスタムネットワークの作成

docker network create backend

同一ネットワーク内で通信

アプリAとBを同一ネットワークに起動して通信できるか確認します。

docker run -d --name appA --network backend docker-run-app
docker run -it --rm --network backend curlimages/curl curl http://appA:8080

これでアプリ同士がホスト名で通信できることを確認できます。


5. ログとメトリクス活用ハンズオン

ログドライバ変更(Fluentd例)

docker run -d --log-driver=fluentd --log-opt tag="hands-on.app" docker-run-app

この設定により、ログがFluentdサーバへ直接転送されます。
(環境にFluentdがない場合は json-file で試すことも可能)

ラベル付与でメトリクス統合

Prometheusなどで識別しやすいようにラベルを設定します。

docker run -d --label env=prod --label service=web docker-run-app

6. 運用の自動化設定

自動再起動

障害時の復旧を自動化します。

docker run -d --restart=always docker-run-app

ヘルスチェック設定

起動後の状態確認を自動で実施します。

docker run -d \
  --health-cmd="curl -f http://localhost:8080/health || exit 1" \
  --health-interval=30s \
  --health-retries=3 \
  docker-run-app

ステータス確認:

docker ps
docker inspect --format='{{json .State.Health}}' $(docker ps -q) | jq

7. デバッグテクニック

コンテナの一時シェルアクセス

docker run -it --rm --entrypoint /bin/bash docker-run-app

稼働中コンテナの調査

docker exec -it app_cpu bash
cat /proc/1/cgroup

このコマンドでコンテナがどのcgroupに属しているか確認できます。


まとめ

docker run は単純な起動コマンドではなく、運用・性能・セキュリティ制御の中心ツールです。
ハンズオンで触れることで、ComposeやKubernetesの設定にも応用できる理解が得られたはずです。


次のステップ

  • docker inspect で内部設定を詳細に分析
  • --security-opt seccomp を使ってシステムコール制限を追加
  • Compose (docker-compose.yml) に各設定を展開してチーム共有
  • CI/CD パイプラインで docker run のオプションを自動化

投稿日

カテゴリー:

投稿者:

タグ:

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です