Dockerコンテナはデフォルトでは停止するとデータが消えるという特性があります。データベースのデータやアップロードファイルなどを永続化するにはボリュームの仕組みを使う必要があります。また、複数のコンテナが通信するにはネットワークの設定も重要です。この記事ではDockerのボリュームとネットワークを実践的に解説します。
Dockerのデータ永続化:ボリューム
Dockerコンテナのファイルシステムはコンテナと一緒に削除されます。データを残したい場合は以下の3つの方法があります。
| 種類 | 説明 | 用途 |
|---|---|---|
| Volume | Dockerが管理する専用の保存領域 | DBデータ、アプリデータの永続化(推奨) |
| Bind Mount | ホストの任意のディレクトリをマウント | 開発時のソースコード共有 |
| tmpfs Mount | メモリ上の一時領域(コンテナ停止で消える) | 機密情報の一時保存 |
Volumeの使い方
# ボリュームを作成
docker volume create mydata
# ボリューム一覧を確認
docker volume ls
# ボリュームの詳細を確認
docker volume inspect mydata
# コンテナにボリュームをマウントして起動(-v オプション)
docker run -d --name mydb -v mydata:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=secret mysql:8.0
# --mountオプション(より明示的な書き方)
docker run -d --name mydb --mount type=volume,source=mydata,target=/var/lib/mysql -e MYSQL_ROOT_PASSWORD=secret mysql:8.0
このようにすることで、コンテナを削除してもmydataボリュームにMySQLのデータが残ります。次回起動時に同じボリュームをマウントすればデータを引き継げます。
Bind Mountの使い方
# ホストの/home/user/appをコンテナの/appにマウント
docker run -d --name myapp -v /home/user/app:/app python:3.11-slim python3 /app/app.py
# カレントディレクトリをマウント(開発時によく使う)
docker run -d --name myapp -v $(pwd):/app python:3.11-slim python3 /app/app.py
Bind Mountはホストのファイルをリアルタイムで反映できるため、開発中にソースコードの変更を即座にコンテナに反映させるのに便利です。
docker-compose.ymlでのボリューム設定
version: '3.8'
services:
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: myapp
volumes:
- db_data:/var/lib/mysql # Volumeを使用
web:
image: nginx:latest
volumes:
- ./html:/usr/share/nginx/html # Bind Mountを使用
volumes:
db_data: # Volumeの定義
ボリュームの削除・クリーンアップ
# 特定のボリュームを削除
docker volume rm mydata
# 未使用のボリュームをまとめて削除
docker volume prune
# コンテナと一緒にボリュームも削除(-v オプション)
docker rm -v mycontainer
Dockerのネットワーク
Dockerコンテナ同士が通信するためにはネットワークの設定が必要です。Dockerには複数のネットワークドライバーが用意されています。
ネットワークの種類
| ドライバー | 説明 | 用途 |
|---|---|---|
| bridge | デフォルト。同一ホスト上のコンテナを接続 | 単一ホストでのコンテナ間通信 |
| host | ホストのネットワークをそのまま使用 | パフォーマンス重視の場合 |
| none | ネットワーク接続なし | 完全に隔離したい場合 |
| overlay | 複数ホスト間のコンテナを接続 | Docker Swarmのクラスター通信 |
| macvlan | コンテナにMACアドレスを割り当て | 物理ネットワークへの直接接続 |
カスタムbridgeネットワークの作成と使用
# カスタムネットワークを作成
docker network create myapp-network
# ネットワーク一覧を確認
docker network ls
# ネットワークの詳細を確認
docker network inspect myapp-network
# コンテナをカスタムネットワークに接続して起動
docker run -d --name mydb --network myapp-network -e MYSQL_ROOT_PASSWORD=secret mysql:8.0
docker run -d --name myapp --network myapp-network myapp-image
カスタムbridgeネットワーク内では、コンテナ名でDNS名前解決ができます。つまりmyappコンテナからmydbホスト名でデータベースに接続できます。
# appコンテナからdbコンテナにコンテナ名で接続できる
# 例:MySQLの接続文字列
mysql -h mydb -u root -p
docker-compose.ymlでのネットワーク設定
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
networks:
- frontend
- backend
app:
image: myapp:latest
networks:
- backend
db:
image: mysql:8.0
networks:
- backend
networks:
frontend:
driver: bridge
backend:
driver: bridge
このようにfrontendとbackendのネットワークを分けることで、DBコンテナは外部(frontend)から直接アクセスできない安全な構成にできます。
ポートの公開設定
# ホストの8080ポートをコンテナの80ポートにマッピング
docker run -p 8080:80 nginx
# 特定のIPアドレスのみバインド(セキュリティ強化)
docker run -p 127.0.0.1:8080:80 nginx
# UDPポートを公開
docker run -p 53:53/udp mydns
# 複数ポートを公開
docker run -p 80:80 -p 443:443 nginx
よく使うネットワーク・ボリュームコマンド一覧
| コマンド | 説明 |
|---|---|
docker volume create <name> | ボリュームを作成 |
docker volume ls | ボリューム一覧を表示 |
docker volume inspect <name> | ボリュームの詳細を確認 |
docker volume rm <name> | ボリュームを削除 |
docker volume prune | 未使用ボリュームを全削除 |
docker network create <name> | ネットワークを作成 |
docker network ls | ネットワーク一覧を表示 |
docker network inspect <name> | ネットワークの詳細を確認 |
docker network connect <net> <con> | コンテナをネットワークに接続 |
docker network rm <name> | ネットワークを削除 |
まとめ
- データ永続化にはVolume(本番)またはBind Mount(開発)を使う
- Volumeはコンテナを削除しても残り、DBデータの永続化に最適
- カスタムbridgeネットワークを使うとコンテナ名でDNS解決できて便利
- ネットワークを
frontend/backendに分けることでセキュリティが向上する - docker-compose.ymlにボリュームとネットワークをまとめて定義するのがベストプラクティス



コメント