はじめに
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
のオプションを自動化
コメントを残す