Mímisbrunnr知恵の泉

← クラウドインフラ 一覧

🎓 レベル:標準 | 重要度:A(必須)

📎 前提:コンテナとは(名前空間・cgroups) | 関連:DockerイメージとレイヤDocker Composeで複数コンテナ

要点(BLUF)

概念 ── 隔離されたネットワークと消えるストレージ

コンテナは名前空間(コンテナとは(名前空間・cgroups))で自分専用のIP・ポートを持ちます。便利な反面、何もしなければ外からも他コンテナからも届きません。さらにファイルシステムも使い捨て——コンテナを消すと書き込みは消えます。この2つを橋渡しするのが「ポート公開」と「ボリューム」です。

仕組み① ── ネットワーク

ポート公開:ホストのポートをコンテナのポートに転送します。-p 8080:80 は「ホストの8080に来たらコンテナの80へ」。

コンテナ間通信:同じユーザー定義ネットワークに置くと、コンテナはサービス名(コンテナ名)で名前解決して通信できます。Docker内蔵のDNSが効くので、IPを直書きしません。

flowchart LR
    client["外部クライアント"] -->|"ホスト:8080"| host["ホスト"]
    host -->|"転送 -p 8080:80"| web["webコンテナ:80"]
    web -->|"名前 db で接続"| db["dbコンテナ:5432"]
    subgraph net["ユーザー定義ネットワーク(内蔵DNSで名前解決)"]
      web
      db
    end
# ユーザー定義ネットワークを作る
docker network create appnet
# DBを参加させる(外には公開しない)
docker run -d --name db --network appnet postgres:16
# Webを参加させ、ホストにだけ公開。アプリは接続先を「db」と書ける
docker run -d --name web --network appnet -p 8080:80 myapp:1.0

ポイントは DB はホストに公開しないこと。外に出すのは入口(web)だけにし、DB は内部ネットワークに隠す。これが最小公開の原則です。

仕組み② ── ボリューム

書き込みを残すには、コンテナの外にストレージを置いてマウントします。2種類。

種類向く用途
名前付きボリュームDockerが管理する領域DBデータなど本番の永続化
バインドマウントホストの実ディレクトリ開発中のソース共有
# 名前付きボリュームを作り、DBのデータディレクトリにマウント
docker volume create pgdata
docker run -d --name db \
  -v pgdata:/var/lib/postgresql/data \
  postgres:16
# → コンテナを消して作り直しても pgdata は残る

# 開発:ホストのコードをコンテナに反映(バインドマウント)
docker run -d --name dev -v "$(pwd)":/app myapp:dev

なぜステートレス+ボリュームなのか

⚠️ よくある誤解・落とし穴

対応ラボ

cloud-infra-study/labs/03-04_compose.yaml 内で、web と db をネットワークで繋ぎ、db をボリューム永続化する構成を確認(次トピックの Compose と共通)。

関連

第3章 コンテナ 目次