Dockerネットワークとは?作り方と使い方

IT・プログラミング

Dockerネットワークとは?

Dockerネットワークは、コンテナ間での通信を管理するための重要な機能です。Dockerは、アプリケーションをコンテナとして分離して実行することができますが、これらのコンテナが互いにどのように通信するかを決定するのがネットワークです。この記事では、Dockerネットワークの基本概念と設定方法について解説します。

Dockerネットワークの基本概念

Dockerは複数のネットワークドライバを提供しており、これにより異なるアプリケーションやサービスを異なる方法で接続できます。主なネットワークドライバには以下のものがあります。

  • bridge(ブリッジ): デフォルトのネットワークドライバで、コンテナが同じホスト上で通信するためのプライベートネットワークを作成します。
  • host(ホスト): コンテナがホストのネットワークスタックを直接利用するドライバです。このモードでは、コンテナはホストのIPアドレスを使用します。
  • overlay(オーバーレイ): 複数のDockerホスト間でコンテナを接続するためのドライバで、主にDocker SwarmやKubernetesなどのオーケストレーションツールで使用されます。
  • macvlan(マックブラン): コンテナに独自のMACアドレスを持たせ、物理ネットワークに直接接続することを可能にするドライバです。

Dockerネットワークの作成と管理

Dockerネットワークを作成するには、以下のコマンドを使用します。

docker network create <ネットワーク名>

例えば、my_bridge_networkという名前のブリッジネットワークを作成するには、次のようにします。

docker network create my_bridge_network

作成したネットワークの詳細情報を確認するには、次のコマンドを実行します。

docker network inspect <ネットワーク名>

コンテナをネットワークに接続する

特定のネットワークにコンテナを接続するには、--networkオプションを使用します。

docker run -d --name my_container --network my_bridge_network my_image

これにより、my_containermy_bridge_networkに接続されます。

コンテナ間の通信

同じネットワーク内にあるコンテナは、コンテナ名を使用して通信できます。たとえば、my_container1my_container2が同じネットワークに接続されている場合、my_container1からmy_container2にリクエストを送信することができます。

具体的な例を通じて、コンテナ間の通信を詳しく見ていきます。

基本的なネットワーク設定

まず、基本的なブリッジネットワークを作成します。このネットワークに接続される2つのコンテナ(Webサーバーとデータベース)を用意します。

# ブリッジネットワークの作成
docker network create my_bridge_network

コンテナの起動

次に、nginx(Webサーバー)とmysql(データベース)を起動し、同じネットワークに接続します。

# MySQLコンテナの起動
docker run -d --name my_db --network my_bridge_network -e MYSQL_ROOT_PASSWORD=root mysql

# Nginxコンテナの起動
docker run -d --name my_web --network my_bridge_network nginx

コンテナ間の通信

ここでは、nginxコンテナがmysqlコンテナに接続し、データベースに問い合わせを行うシンプルなケースを想定します。

  1. コンテナ名による通信: NginxからMySQLに接続する際、MySQLのコンテナ名my_dbを使用します。
# Nginxコンテナ内でMySQLに接続
docker exec -it my_web /bin/bash
# Nginxコンテナ内でMySQLに接続(適切なクライアントが必要)
mysql -h my_db -u root -p

このコマンドにより、my_webコンテナ内からmy_dbコンテナに接続し、MySQLデータベースにアクセスすることができます。

  1. ポートを介した通信: 通常、Webサーバーは特定のポートで動作します。Nginxはデフォルトでポート80を使用しています。my_webコンテナがリクエストを受け取った場合、my_dbコンテナから必要なデータを取得し、そのデータをクライアントに返すことができます。

たとえば、NginxがPHPアプリケーションを実行している場合、以下のようなPHPコードを使用してデータベースに接続することができます。

<?php
$servername = "my_db"; // MySQLコンテナの名前
$username = "root";
$password = "root";

// MySQLに接続
$conn = new mysqli($servername, $username, $password);

// 接続確認
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}
echo "Connected successfully";
?>

サービス名の使用

Dockerのオーバーレイネットワークを使用すると、コンテナが動的にスケーリングされた場合でも、サービス名を使用して通信することができます。たとえば、複数のNginxインスタンスを使用している場合でも、すべてのNginxコンテナはmy_webというサービス名で呼び出すことができます。これにより、負荷分散や冗長性を高めることができます。

# Docker Composeを使用した例
version: '3'
services:
  web:
    image: nginx
    networks:
      - my_network
  db:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
    networks:
      - my_network

networks:
  my_network:

この設定により、すべてのサービスはmy_networkという共通のネットワークを介して通信できます。

Dockerネットワークの削除

不要になったネットワークを削除するには、次のコマンドを使用します。

docker network rm <ネットワーク名>

削除する前に、そのネットワークに接続されているコンテナがないことを確認してください。

まとめ

Dockerネットワークは、コンテナ間の通信を効率的に管理するための重要な機能です。適切に設定することで、アプリケーションのスケーラビリティやセキュリティを向上させることができます。

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