⑥Docker・コンテナ

Dockerのボリュームとネットワークの使い方【データ永続化と通信設定】

⑥Docker・コンテナ
記事内に広告が含まれています。

Dockerコンテナはデフォルトでは停止するとデータが消えるという特性があります。データベースのデータやアップロードファイルなどを永続化するにはボリュームの仕組みを使う必要があります。また、複数のコンテナが通信するにはネットワークの設定も重要です。この記事ではDockerのボリュームとネットワークを実践的に解説します。

Dockerのデータ永続化:ボリューム

Dockerコンテナのファイルシステムはコンテナと一緒に削除されます。データを残したい場合は以下の3つの方法があります。

種類説明用途
VolumeDockerが管理する専用の保存領域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

このようにfrontendbackendのネットワークを分けることで、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にボリュームとネットワークをまとめて定義するのがベストプラクティス

コメント

タイトルとURLをコピーしました