CodeGym /コース /Docker SELF /ボリュームとネットワークのマウント

ボリュームとネットワークのマウント

Docker SELF
レベル 16 , レッスン 1
使用可能

7.1 ボリュームのマウント

Docker Composeでボリュームとネットワークをマウントすることで、柔軟で効率的なマルチコンテナアプリケーションを構築できるよ。ボリューム(volumes)は、コンテナの外部に保存する必要があるデータ用に使用されて、一方でネットワーク(networks)はコンテナ間のやりとりを提供します。この講義では、Docker Composeでボリュームとネットワークを使う方法を詳しく説明するよ。

Dockerのボリュームを使うと、コンテナの外部でデータを保存することができて、コンテナを停止または削除してもデータは利用可能だよ。これは特に、データベースのデータ、ログファイル、その他の長期間保存が必要なデータに便利です。

ボリュームの種類:

  • 名前付きボリューム (Named Volumes): Dockerによって管理されるよ。ホスト上の特定のディレクトリに保存されるんだ。
  • バインドマウント (Bind Mounts): ホストの指定ディレクトリからコンテナにマウントされるよ。

Docker Composeでのボリュームの設定

名前付きボリュームの例

この例では、名前付きボリュームpostgres-dataが作成されて、コンテナdb内の/var/lib/postgresql/dataディレクトリにマウントされてるよ。

Yaml

version: '3.8'

services:
  db:
    image: postgres:latest
    volumes:
      - postgres-data:/var/lib/postgresql/data

volumes:
  postgres-data:

バインドマウントの例

この例では、ローカルディレクトリとファイルnginx.confhtmlが、コンテナwebにバインドマウントとしてマウントされているよ。

Yaml

version: '3.8'

services:
  web:
    image: nginx:latest
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./html:/usr/share/nginx/html
<

7.2 ネットワークのマウント

Docker Composeのネットワークを使うと、コンテナ同士が通信できるよ。各コンテナは1つ以上のネットワークに接続できて、これがトラフィックの管理と分離を実現するんだ。

ネットワークの種類:

  • ブリッジネットワーク (Bridge): デフォルトでコンテナはブリッジネットワークに接続される。これは同じホスト上での相互通信を可能にするよ。
  • オーバーレイネットワーク (Overlay): Docker Swarmクラスター内の異なるホスト上で実行されるコンテナを接続するために使用されるんだ。
  • ネットワークプラグイン (Network Plugins): 他のネットワークドライバを使用して、より高度な構成を可能にするよ。

カスタムネットワークを作成して使う例

この例ではfront-endback-endの2つのカスタムネットワークを作成するよ。サービスappは両方のネットワークに接続されるけど、サービスwebfront-endだけ、サービスdbback-endだけに接続されるんだ。

Yaml

version: '3.8'

services:
  web:
    image: nginx:latest
    networks:
      - front-end

  app:
    image: myapp:latest
    networks:
      - front-end
      - back-end

  db:
    image: postgres:latest
    networks:
      - back-end

networks:
  front-end:
  back-end:

実践的なヒント:

  1. 名前付きボリュームの使用: 名前付きボリュームはDockerで管理されるから、データの使用や管理が簡単になるよ。同じ名前付きボリュームを複数のサービスで同時に使うこともできるよ。例えば、バックエンドサービスがログを書き込んで、モニタリングサービスがそのログを分析してerrorレベルのエラーを見つけたら通知する、なんて感じでね。
  2. ネットワークの分離: 複数のネットワークを使うと、アプリケーションの異なる部分を分離して、その相互作用を制御できるよ。
  3. 構成ファイルの保存: バインドボリュームを使って構成ファイルをマウントしよう。この方法なら、イメージを再構築せずに簡単に構成を変更できるよ。
  4. ネットワークのセキュリティ: ネットワークへのアクセスを制限して、必要なコンテナだけが通信できるようにしよう。これでアプリのセキュリティが向上するからね。

7.3 ボリュームとネットワークの使用例

Docker Composeでのボリュームとネットワークの使用例:

例1: Webサーバーとデータベースを持つアプリケーション

Yaml

version: '3.8'

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./html:/usr/share/nginx/html
    networks:
      - webnet

  db:
    image: postgres:latest
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
      POSTGRES_DB: mydb
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - webnet

volumes:
  db-data:

networks:
  webnet:

この例では:

  • WebサーバーnginxとデータベースPostgreSQLが同じネットワークwebnetに接続されており、相互通信が可能になっています。ネットワークが1つだけの場合、指定しなくてもデフォルトネットワークが作成されます。
  • データベースのデータは名前付きボリュームdb-dataに保存されており、コンテナの再起動時にも保持されます。

例2: 複数レベルのアプリケーション

Yaml

version: '3.8'

services:
  frontend:
    image: myfrontend:latest
    networks:
      - front-tier
      - back-tier

  backend:
    image: mybackend:latest
    networks:
      - back-tier
    volumes:
      - backend-data:/var/lib/backend

  database:
    image: mysql:latest
    environment:
      MYSQL_ROOT_PASSWORD: example
    volumes:
      - db-data:/var/lib/mysql
    networks:
      - back-tier

volumes:
  backend-data:
  db-data:

networks:
  front-tier:
  back-tier:

この例では:

  • 2つのネットワーク: front-tierback-tierが作成されました。
  • サービスfrontendは両方のネットワークに接続されており、backendおよび外部クライアントの両方と通信することができます。
  • サービスbackenddatabaseback-tierネットワークにのみ接続されており、それらの隔離と相互通信を保証しています。
  • サービスbackenddatabaseのデータは、それぞれ個別の名前付きボリュームbackend-datadb-dataに保存されています。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION