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_container
がmy_bridge_network
に接続されます。
コンテナ間の通信
同じネットワーク内にあるコンテナは、コンテナ名を使用して通信できます。たとえば、my_container1
とmy_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
コンテナに接続し、データベースに問い合わせを行うシンプルなケースを想定します。
- コンテナ名による通信: 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データベースにアクセスすることができます。
- ポートを介した通信: 通常、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ネットワークは、コンテナ間の通信を効率的に管理するための重要な機能です。適切に設定することで、アプリケーションのスケーラビリティやセキュリティを向上させることができます。