【実例付】DockerのNetworkを手を動かしながら学ぼう

※本サイトにはプロモーション・広告が含まれています。

(最終更新月:2023年8月)

✔このような方へ向けて書かれた記事となります

「docker networkとは何か詳しく知りたい」

「docker networkの設定方法を理解したい」

「docker networkの使い方を具体的な例で見てみたい」

✔当記事を通じてお伝えすること

  • docker networkについての基本的な知識
  • docker networkの設定方法とその応用
  • docker networkを活用した具体的な例

当記事では、docker networkの基本から設定方法、そして実際の例まで、詳細にわたって解説します。

はじめてdocker networkに挑戦する方から経験者まで、幅広くご利用いただけます。

ぜひ最後までお付き合いください。

筆者プロフィール

筆者プロフィールアイコン

【現職】プロダクトマネージャー

【副業】ブログ(月間17万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

Dockerの基本

こちらでは、Dockerとそのネットワーキングの基本的な概念についてお伝えします。

Dockerの基本を理解することで、Dockerネットワークの仕組みやその重要性を理解できるでしょう。

  • Dockerとは何か?
  • 名前空間(namespace)の分離とコンテナ間通信

Dockerとは何か?

Dockerとは、ソフトウェアをコンテナと呼ばれる隔離された環境で実行することを可能にするプラットフォームです。

Dockerは、アプリケーションの開発やテスト、デプロイを効率化するツールとして広く活用されています。

Dockerを用いれば、異なる環境でも一貫した動作を保証することが可能です。

“動作するコード”を共有、配布することが容易になります。

名前空間(namespace)の分離とコンテナ間通信

Dockerは、Linuxの名前空間(namespace)という機能を活用して、各コンテナを隔離しています。

この名前空間の機能により、各コンテナはほかのコンテナやホストから独立した状態で動作できるのです。

しかし一方でコンテナ間通信が必要な場合もあります。

その際に重要となるのが、Dockerのネットワーク機能です。

Dockerは、ブリッジネットワークやオーバレイネットワークなど、異なる種類のネットワークを提供し、これによりコンテナ間の通信や外部ネットワークとの接続を実現しています。

Docker Networkの詳細

こちらでは、Docker Networkの基本から、それが提供するさまざまなネットワークタイプについて詳しく説明します。

Docker Networkの機能と種類を理解することで、自身のニーズに合ったネットワーク設定がおこなえるでしょう。

  • Docker Networkの基本
  • Docker Networkの種類

Docker Networkの基本

Dockerは内部でネットワークを管理し、コンテナが通信をおこなうためのインフラを提供します。

ユーザーはコマンドラインやDocker Composeなどを通じて、これらのネットワークを制御可能です。

例えば、特定のネットワークにコンテナを接続するためには、以下のようなコマンドを実行します。

docker network connect [network-name] [container-name]

Docker Networkの種類

Dockerは複数のネットワークドライバを提供し、それぞれ異なるユースケースをサポートします。

以下に、主なネットワークドライバを紹介します。

  • ブリッジネットワーク
    Dockerがデフォルトで使用するネットワークタイプです。Dockerコンテナ間のプライベート内部ネットワークを提供します。それぞれのコンテナはこのネットワーク上で独自のIPアドレスを持ち、互いに通信可能です。ブリッジネットワークは、単一のホスト上でのコンテナ間通信に使用されます。
  • ホストネットワーク
    コンテナがホストのネットワーク名前空間を直接使用するように設定します。これにより、コンテナはホストのIPアドレスとポートを使用し、ホストのネットワークインターフェイスと直接通信可能です。高性能が必要な場合によく用いられますが、ホストとコンテナ間でのネットワークリソースの競合を避けなければなりません。
  • オーバーレイネットワーク
    複数のDockerデーモン(つまり、複数のホスト)が存在する場合、それらを跨いでコンテナ間のネットワーク通信を可能にします。Swarmモードで動作しているDockerエンジンに特有のもので、複数のホストにまたがるクラスター内でコンテナ間の通信を実現します。
  • マックvlanネットワーク
    コンテナにMACアドレスを割り当て、それが物理ネットワーク上の別のデバイスであるかのように見せられます。
  • Noneネットワーク
    ネットワーキングを無効にするオプションで、コンテナのネットワーク隔離を提供します。これを使用すると、コンテナはネットワークに接続することなく、完全に隔離された環境で動作します。
  • ユーザー定義ブリッジネットワーク
    Dockerにはデフォルトのブリッジネットワークがありますが、ユーザーは自分でブリッジネットワークを定義できます。ユーザー定義のブリッジネットワークでは、自動DNS解決やカスタムIP範囲の指定など、追加の機能が利用可能です。

以上のネットワークタイプは、それぞれ以下のように作成することが可能です。

#デフォルトのネットワークは作成不要です
docker network create -d host my-host-network
docker network create -d overlay my-overlay-network
docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 my-macvlan-network
docker run --network=none my_container
docker network create -d bridge my-bridge-network

それぞれのコマンドは、特定のネットワークドライバ(-dオプション)を使用して新しいネットワークを作成します。

名前はユーザーが任意で設定可能です。

macvlanネットワークでは、サブネットとゲートウェイの指定も必要です。

Docker Networkの設定と運用

こちらでは、Docker Networkの具体的な設定方法と運用方法を解説します。

ネットワークの設定を理解し、自身で操作できるようになることで、さまざまな状況に対応する能力が身につくでしょう。

  • デフォルトのブリッジネットワークの詳細
  • ユーザ定義ネットワーク
  • Docker Networkコマンドの使用方法

デフォルトのブリッジネットワークの詳細

Dockerはデフォルトで、”bridge”という名前のブリッジネットワークを提供します。

これはDockerの起動時に自動的に作成され、新たに起動するコンテナはデフォルトでこのネットワークに接続されます。

しかし、名前解決(ほかのコンテナを名前で参照する)などの機能は限定的です。

以下のコマンドで確認できます。

docker network inspect bridge

ユーザ定義ネットワーク

ユーザ定義のネットワークを作成すると、以下のようなメリットがあります。

  • コンテナ間での通信やインターネットへの接続など、完全なネットワーク機能が使える
  • ネットワーク内で、コンテナ名でほかのコンテナを見つけられる、DNS名前解決も自動的に提供される

ユーザ定義ネットワークの作成は以下のコマンドでおこないます。

docker network create my-network

作ったネットワークなど、一覧を取得する方法はこちらです。

docker network ls

Docker Networkコマンドの使用方法

Dockerのネットワークを操作するための主要なコマンドは以下のとおり。

  • docker network create [options] [network-name]:新しいネットワークを作成
  • docker network rm [network-name]:指定したネットワークを削除
  • docker network connect [network-name] [container-name]:指定したコンテナをネットワークに接続
  • docker network disconnect [network-name] [container-name]:指定したコンテナをネットワークから切断
  • docker network inspect [network-name]:指定したネットワークの詳細を表示

これらのコマンドを利用して、コンテナのネットワーク環境を柔軟に制御することが可能です。

Docker Networkの深掘り

こちらでは、Dockerネットワークについて更に深堀りしていきます。

各ネットワークの特性を理解することで、自身のプロジェクトに最適なネットワーク選択が可能になるでしょう。

  • ブリッジ・ネットワーク
  • オーバレイ・ネットワーク
  • 外部ネットワークプラグイン
  • Dockerの内蔵DNSサーバ

ブリッジ・ネットワーク

Dockerのデフォルトネットワークドライバーは、”bridge”です。

ブリッジネットワークは、同じDocker宿主で実行されるコンテナ間の通信を可能にします。

また宿主のネットワークと接続するためのインターフェースも提供。

とくにユーザー定義のブリッジネットワークを作成した場合、コンテナ間の名前解決が可能になります。

オーバレイ・ネットワーク

オーバレイネットワークは、異なるDocker宿主(つまり、複数のマシン)上で動作するコンテナ間の通信を可能にするもの。

これにより、大規模なアプリケーションを構築する際に、各コンテナを疎結合で管理できるようになります。

オーバレイネットワークは通常、Swarmクラスタにおけるサービスのネットワーキングに使用されます。

Swarmクラスタとは、コンテナ化されたアプリケーションとサービスの管理やネットワーキングなどを自動化したツール「Swarmモード」を使用したクラスタリングシステムです。

外部ネットワークプラグイン

Dockerは、ネットワークのカスタマイズをさらに進めるために、外部のネットワークプラグインをサポートしています。

これらのプラグインを使用すると、特殊な環境要件や特定のネットワーク技術に対応するネットワークを作成できます。

以下は一般的な例です。

Weave Net

Weave Netは、Dockerコンテナ間でネットワークを作成し、複数のホスト間で通信を可能にします。このプラグインを使用すると、コンテナがどこで実行されているかを気にせず、分散アプリケーションのコンポーネント間で透過的に通信できます。

docker network create --driver weave my-custom-network

Calico

Calicoは、スケーラビリティとセキュリティに優れたネットワークプラグインです。

細かなネットワークポリシーを指定して、コンテナ間の通信を制御できます。

docker network create --driver calico --ipam-driver calico-ipam my-custom-network

Cilium

Ciliumは、次世代のカーネル技術であるBPF(Berkeley Packet Filter)を活用して、セキュリティ、ロードバランシング、ネットワーク観測の機能を提供します。

docker network create --driver cilium my-custom-network

Flannel

Flannelは、シンプルで使いやすいオーバーレイネットワークプラグインです。

異なるホスト間のコンテナ通信を提供します。特にKubernetesと組み合わせてよく使用されます。

VMware NSX

VMware NSXは、VMwareの仮想化インフラストラクチャと統合することで、物理的なネットワーク機器に依存せずにネットワーク機能を提供します。

大規模なエンタープライズ環境での使用に適しているプラグインです。

Dockerの内蔵DNSサーバ

ユーザー定義のネットワーク内では、コンテナ名やエイリアスでほかのコンテナを参照することが可能になります。

なぜならDockerエンジンでは、内蔵のDNSサーバが、コンテナ間の名前解決を担当しているからです。

ただしデフォルトのブリッジネットワークではこの機能は利用できません。

Docker Networkの統合

こちらでは、Docker NetworkがどのようにほかのDocker機能と統合されているかについて説明します。

具体的には、リンク機能とDocker Composeとの連携について詳しく見ていきましょう。

  • リンク機能
  • Docker Composeとネットワーク

リンク機能

Dockerでは、異なるコンテナ間で簡単に通信するためにリンク機能を提供しています。

リンク機能を使用すると、ひとつのコンテナからほかのコンテナに対してセキュアなチャネルを確立できます。

コンテナ間で必要なポートのみを開放し、ほかの通信はブロックできるのです。

たとえば、webコンテナがdbコンテナと通信する必要がある場合、次のようにリンクを使用できます。

$ docker run -d -P --name=web --link=db:db training/webapp python app.py

コマンドの解説です。

  1. docker run: 新しいコンテナを作成し、指定されたイメージを使用してそのコンテナ内でプロセスを実行
  2. -d: コンテナをバックグラウンドで実行することを指示。コンテナがデタッチモードで実行されるため、コマンドプロンプトはすぐに戻る。
  3. -P: Dockerホスト上のランダムな空いているポートに、コンテナ内でEXPOSEされた全てのポートをマッピング。
  4. --name=web: コンテナにwebという名前をつける。この名前を使用して、後でこの特定のコンテナを参照したり操作したりが可能。
  5. --link=db:db: 名前がdbである既存のコンテナと新しいコンテナをリンク。リンクにより、新しいコンテナ(この場合はweb)から、エイリアス(この場合もdb)を使って既存のコンテナ(db)に接続できる。
  6. training/webapp: この部分は、コンテナを実行するのに使用するDockerイメージを指定しています。この例では、training/webappという名前のイメージを使用。
  7. python app.py: これらの引数は、コンテナ内で実行するコマンドを指定。この場合、app.pyという名前のPythonプログラムを実行。

Docker Composeとネットワーク

Docker Composeは、複数のコンテナを定義し、実行するためのツールです。

Composeを使用すると、YAMLファイル内でアプリケーションのサービスを定義し、一連のコマンドでそれらのサービスを作成・起動が可能。

ネットワーキングに関しては、Docker Composeはデフォルトで各サービス間の隔離されたネットワークを作成します。

たとえば、次のようなdocker-compose.ymlファイルがあるとします。

version: '3'
services:
  web:
    build: .
    ports:
     - "5000:5000"
  redis:
    image: "redis:alpine"

webサービスとredisサービスが同じネットワーク上に作成され、webサービスはredisサービスに「redis」という名前でアクセス可能です。

Dockerネットワークの実例

こちらでは、Docker Networkがどのように動作するのかを理解するために、具体的なコマンドの実行を通じて見ていきます。

順番に進めてください。

  • ブリッジネットワークの作成
  • 2つのコンテナを作成・起動
  • ネットワーク通信の確認

ブリッジネットワークの作成

まず、ブリッジネットワークを作成します。

$ docker network create my_bridge_network

2つのコンテナを作成・起動

次に、このネットワーク上に2つのコンテナを作成します:

$ docker run -d --name container1 --network my_bridge_network alpine sleep 1d
$ docker run -d --name container2 --network my_bridge_network alpine sleep 1d

これで2つのコンテナが同じネットワーク上に存在することになりました。

最後のsleep 1dを忘れずに!

ネットワーク通信の確認

コンテナ1からコンテナ2にpingを送ってみましょう。

$ docker exec -it container1 ping container2

成功すれば、コンテナ1からコンテナ2へのネットワーク通信が可能であることが確認できます。

PING container2 (172.19.0.3): 56 data bytes
64 bytes from 172.19.0.3: seq=0 ttl=64 time=0.085 ms
64 bytes from 172.19.0.3: seq=1 ttl=64 time=0.146 ms
64 bytes from 172.19.0.3: seq=2 ttl=64 time=0.154 ms
64 bytes from 172.19.0.3: seq=3 ttl=64 time=0.123 ms

トラブルシューティング

Docker Networkを利用する際、一部のユーザーは接続問題や設定の混乱に直面することがあります。

以下に、一部の一般的な問題とその対策を示します。

  • コンテナ間の通信ができない
  • 特定のポートが利用できない
  • ネットワークが見つからない

コンテナ間の通信ができない

コンテナが同じネットワークに接続されていることを確認してください。

接続されていない場合、次のコマンドでコンテナをネットワークに接続します。

$ docker network connect [network_name] [container_name]

特定のポートが利用できない

そのポートがほかのアプリケーションによって既に使用されていないか確認してください。

また、Dockerがそのポートを使用するための適切な権限を持っているかどうかも確認する必要があります。

ネットワークが見つからない

ネットワークが存在すること、そして正しい名前で参照されていることを確認してください。

全てのネットワークをリストするには以下のコマンドを使用します。

$ docker network ls

問題が解決しない場合やより複雑な問題が発生した場合は、Dockerの公式ドキュメンテーションまたは信頼できる技術フォーラムを参照することをおすすめします。

実生活の応用

ここではマイクロサービスアーキテクチャの一例として、異なるDockerコンテナに分割されたアプリケーションのネットワーク接続を見ていきます。

マイクロサービスアーキテクチャ(Microservices Architecture)とは、大規模なアプリケーションを小さな、独立したサービスに分割する設計パターンのこと。

設定は以下のとおり。

  • Webサーバ(コンテナA)とデータベース(コンテナB)の2つのコンテナが存在
  • 各コンテナは、異なるネットワーク(network1、network2)に存在する

まず、コンテナAとコンテナBをそれぞれのネットワークに接続します。

$ docker network connect network1 containerA
$ docker network connect network2 containerB

この状態では、異なるネットワークに存在するため、コンテナAからコンテナBへ直接の通信ができません。

これを解決するために、コンテナAをコンテナBと同じネットワーク(network2)にも接続します。

$ docker network connect network2 containerA

この操作により、コンテナAはnetwork1とnetwork2の両方に存在することになり、コンテナBとの通信が可能になります。

Docker Networkにより、物理ネットワークの制限を超えて、アプリケーションの各部分が適切に通信できるのです。

まとめ

当記事では、Docker Networkについて学習してきました。

また、具体的なユースケースを通じて、Docker Networkがどのように実際の問題を解決するかも理解しました。

Docker Networkは、コンテナ化されたアプリケーションの部分が互いに効果的に通信することを可能にし、アプリケーションのスケーラビリティと柔軟性を大幅に向上させます。

実際に手を動かし理解を深め、実戦で活かせるスキルにしてください。

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