04
第 4 章

ボリュームとネットワーク

この章で学ぶこと
1コンテナ内の書き込みがコンテナ削除と共に消える挙動
2名前付きボリュームとバインドマウントの違いと使い分け
3ユーザー定義ネットワークとコンテナ名による名前解決(DNS)
4コンテナ内の localhost が指すものと -p の役割の違い
解説

コンテナの書き込みは削除と共に消える

コンテナ内部への変更はそのコンテナ限り
ファイルの作成・編集はコンテナの内側にだけ記録される
同じイメージでも引き継がれない
別のコンテナを起動しても、前のコンテナの変更は入っていない
docker rm で変更も消える
コンテナを削除すると、内部に記録されていた変更も一緒に消える
ファイルシステム境界
マウントの種類
名前付きボリューム
バインドマウント
ネットワークとDNS
localhostとポート
まとめ
実演

実演:ファイル消失の確認

目的コンテナ内に作ったファイルがコンテナ削除で消えることを確認する
実行する
コマンド
$ docker run -d --name web1 nginx$ docker exec -it web1 bash
確認する
ポイント
web1 内の ls で test.txt が表示されること / web2 内の ls で test.txt がないこと
ファイルシステム境界
マウントの種類
名前付きボリューム
バインドマウント
ネットワークとDNS
localhostとポート
まとめ
解説

永続化のしくみが必要な理由

削除後も残したいデータ
データベースの中身、アップロードファイル、ログなど
コンテナの外側に置く
データをコンテナの外に配置すれば、コンテナを削除しても残る
-v オプションで接続
コンテナ内のディレクトリを外側のデータ置き場と結びつける
ファイルシステム境界
マウントの種類
名前付きボリューム
バインドマウント
ネットワークとDNS
localhostとポート
まとめ
図解

2種類のマウントの違い

観点 名前付きボリューム バインドマウント
データの実体 Docker管理の領域 ホストのディレクトリ
主な用途 DBデータの保存 コード編集しながら開発
-v の左側 名前(db-data) パス(./src)
ファイルシステム境界
マウントの種類
名前付きボリューム
バインドマウント
ネットワークとDNS
localhostとポート
まとめ
解説

名前付きボリュームの特徴

Docker が保存場所を管理
ユーザーは名前を付けるだけで、実体の場所を気にしなくてよい
コンテナを削除してもボリュームは残る
次のコンテナに同じボリュームを割り当てればデータを引き継げる
明示的に削除が必要
docker volume rm または docker volume prune で削除する
ファイルシステム境界
マウントの種類
名前付きボリューム
バインドマウント
ネットワークとDNS
localhostとポート
まとめ
コマンド

docker run -v(名前付きボリューム)

$ docker run -d -v db-data:/var/lib/postgresql postgres:18
-v db-data:/var/lib/postgresql名前付きボリューム db-data をコンテナ内パスに割り当て
db-data/ も . も含まない名前は名前付きボリュームとして自動作成される
補足: 実演では -e POSTGRES_PASSWORD=secret で管理者パスワードも指定します
ファイルシステム境界
マウントの種類
名前付きボリューム
バインドマウント
ネットワークとDNS
localhostとポート
まとめ
実演

実演:名前付きボリュームの作成と確認

目的名前付きボリュームがコンテナ削除後も残ることを確認する
実行する
コマンド
$ docker run -d --name pg1 \    -e POSTGRES_PASSWORD=secret \    -v db-data:/var/lib/postgresql postgres:18$ docker volume ls$ docker rm -f pg1
確認する
ポイント
docker volume ls に db-data が表示されること / コンテナ削除後も db-data が残ること
ファイルシステム境界
マウントの種類
名前付きボリューム
バインドマウント
ネットワークとDNS
localhostとポート
まとめ
解説

バインドマウントの特徴

ホストのディレクトリをそのまま共有
自分の Mac や Windows 上のフォルダをコンテナ内に見せる
ホスト側の編集が即座に反映
エディタで保存するだけでコンテナ内にも反映される
開発時のソースコード編集に最適
コンテナの再起動や再ビルドなしで変更を確認できる
ファイルシステム境界
マウントの種類
名前付きボリューム
バインドマウント
ネットワークとDNS
localhostとポート
まとめ
コマンド

docker run -v(バインドマウント)

$ docker run -d -p 8080:80 \    -v ./myapp:/usr/share/nginx/html nginx
-v ./myapp:/usr/share/nginx/htmlホスト側ディレクトリをコンテナ内パスに割り当て
./myappドットスラッシュやスラッシュを含むパスの形で指定するとバインドマウントになる
⚠ Windows(PowerShell): ./myapp → .\myapp に読み替え
ファイルシステム境界
マウントの種類
名前付きボリューム
バインドマウント
ネットワークとDNS
localhostとポート
まとめ
実演

実演:バインドマウントの動作確認

目的ホスト側の編集がバインドマウント経由でコンテナに即座に反映されることを確認する
実行する
コマンド
$ mkdir myapp$ echo "<h1>Hello from host</h1>" > myapp/index.html$ docker run -d --name web3 \    -p 8080:80 \    -v ./myapp:/usr/share/nginx/html nginx
確認する
ポイント
ブラウザに Hello from host が表示されること / ホスト側で書き換えた内容が再読み込みで反映されること
ブラウザで http://localhost:8080echo "<h1>Updated</h1>" > myapp/index.html で書き換え → 再読み込み
ファイルシステム境界
マウントの種類
名前付きボリューム
バインドマウント
ネットワークとDNS
localhostとポート
まとめ
解説

ユーザー定義bridgeネットワーク

bridge ネットワーク
ホストの中に作られた仮想的な LAN。同じネットワーク内のコンテナ同士が通信できる
ユーザー定義
docker network create で自分で作ったネットワーク
コンテナ名で相手を呼べる(DNS)
名前を IP アドレスに自動変換してくれる
ファイルシステム境界
マウントの種類
名前付きボリューム
バインドマウント
ネットワークとDNS
localhostとポート
まとめ
コマンド

docker network create

$ docker network create mynet$ docker run -d --name srv1 --network mynet alpine sleep 3600
docker network create mynetユーザー定義ネットワーク mynet を作成
--network mynetコンテナをこのネットワークに参加させる
補足: alpine はサイズの小さい Linux イメージ、sleep 3600 は確認用にコンテナを起動したままにする指定
ファイルシステム境界
マウントの種類
名前付きボリューム
バインドマウント
ネットワークとDNS
localhostとポート
まとめ
実演

実演:コンテナ名でのping疎通

目的ユーザー定義ネットワーク内でコンテナ名による名前解決と疎通を確認する
実行する
コマンド
$ docker network create mynet$ docker run -d --name srv1 --network mynet alpine sleep 3600$ docker run -d --name srv2 --network mynet alpine sleep 3600$ docker exec -it srv1 sh
確認する
ポイント
ping の出力で srv2 が IP アドレスに変換されていること / 3 回とも応答が返ること
コンテナ内で ping -c 3 srv2exit
ファイルシステム境界
マウントの種類
名前付きボリューム
バインドマウント
ネットワークとDNS
localhostとポート
まとめ
解説

コンテナ内のlocalhostの意味

localhost はそのコンテナ自身
コンテナ内で localhost と書くと、同じホスト上の別コンテナには届かない
別コンテナにはコンテナ名で接続
web から db へ接続するには localhost:5432 ではなく db:5432
実務でよくあるハマりどころ
接続先を localhost にしてしまい db につながらないケース
ファイルシステム境界
マウントの種類
名前付きボリューム
バインドマウント
ネットワークとDNS
localhostとポート
まとめ
図解

コンテナ名DNS解決とlocalhost

コンテナ名による接続と localhost の指す範囲

ファイルシステム境界
マウントの種類
名前付きボリューム
バインドマウント
ネットワークとDNS
localhostとポート
まとめ
解説

ポート公開とコンテナ間通信

-p はホストとコンテナをつなぐ
ホストのブラウザからコンテナの Web サーバにアクセスするための設定
コンテナ同士に -p は不要
同じネットワーク内ならコンテナ名で直接通信できる
-p を付けないとホストから見えない
db に -p を付けなければポート衝突を避けられる
ファイルシステム境界
マウントの種類
名前付きボリューム
バインドマウント
ネットワークとDNS
localhostとポート
まとめ
まとめ

この章のまとめ

コンテナ内に書いたファイルは docker rm で消える — 永続化にはボリュームかバインドマウントを使う
名前付きボリュームは Docker 管理の保存領域で、コンテナ削除後も残る
バインドマウントはホストのディレクトリを共有し、ホスト側の編集が即座に反映される
ユーザー定義ネットワークに参加させると、コンテナ名で相手を呼び出せる(DNS)
コンテナ内の localhost はそのコンテナ自身 — 別コンテナにはコンテナ名で接続する
次章: Dockerfile を読む
ファイルシステム境界
マウントの種類
名前付きボリューム
バインドマウント
ネットワークとDNS
localhostとポート
まとめ