Dockerネットワーキングとは?
Dockerネットワーキングは、複数のDockerコンテナやサービス、各種コンポーネント同士を接続し、さらに外部のシステムやワークロードとも連携できるようにする仕組みです。これにより、コンテナがどのプラットフォーム上で動作しているかを意識せずに通信を行うことが可能になります。
この後の解説では、Dockerネットワーキングの概要を学びながら、その構成要素や仕組み、動作プロセスについて理解していきます。
Dockerネットワークドライバー
Dockerのネットワーキング機能は拡張性を考慮して設計されており、必要とされるネットワーク機能に応じて異なるドライバーを読み込める仕組みになっています。
これらのプラグインは「ドライバー」と呼ばれ、標準のDockerインストールには5種類のドライバーが含まれています。現在利用可能な標準ドライバーは次のとおりです。
- Host:ホストOSと同じネットワークスタックを共有します。最もシンプルな方法ですが、ネットワーク分離が行われず、ポート競合などが発生しやすくなります。
- Bridge(ブリッジ):デフォルトのネットワークドライバーです。コンテナ同士が共有できる分離されたネットワークを作成するため、よく利用されます。同一ホスト上の他グループのコンテナネットワークとは隔離しつつ、コンテナ群(スウォーム)間の相互通信を可能にします。
- Overlay(オーバーレイ):複数のDockerデーモンを相互接続し、コンテナ間通信を実現します。ホストOSにルーティングを依存しないため、マルチホスト環境に適しています。
- IPvlan:レイヤー2で動作し、IPスタックに直接アクセスできるようにします。これにより、コンテナが利用するVLANタグの設定などを柔軟に管理できます。
- Macvlan:IPvlanをさらに拡張し、コンテナに物理ネットワーク上の固有のMACアドレスを持たせることができます。
- None:ネットワーク接続を必要としないコンテナ向けの設定です。
ホストへのコンテナポートの公開
ホストがその上で動作しているDockerコンテナに接続できるようにする最も手っ取り早い方法は、コンテナのポートをホストマシンに公開(または割り当て)することです。これは docker run コマンドの一部として利用できる --expose フラグを使うことで実現できます。(Dockerを使う人なら誰でも非常によく使うことになるコマンドです。)
docker run <...> --expose hostport:containerport
例えば、下記のように
$ docker run --name mynginx --expose 80:80 -d nginx
--expose 80:80: コンテナ内部のポート80を、127.0.0.1 上のポート80にバインド接続します--name mynginx: コンテナの名前をmynginxと命名します-d nginx: nginxコンテナイメージをデーモンとしてご利用ください。
ブリッジドネットワークの作成
ブリッジドネットワークはデフォルトのネットワークドライバとなりますため、ユーザー定義のブリッジドネットワークを作成する方法と、コンテナの実行時にそれを利用する方法をご説明いたします。
なお、ブリッジは同一ホスト上で実行中のコンテナのみを接続できる点にご留意ください。これは開発環境において非常に一般的なシナリオです。コンテナ起動時にネットワークが特定されない場合、デフォルトのブリッジが設定され、コンテナが利用可能になります。
これは単純なユースケースには最適ですが、多くの場合、すべてを同一ブリッジ上に配置すると競合やその他の異常が発生する可能性があります。したがって、ユーザー定義のブリッジドネットワークを作成する方法を知っておくと有用です。
ユーザー定義ネットワークを作成するには、以下のコマンドを使用します。これにより、abcという名前のブリッジドネットワークが作成されます。
$ docker network create abc
次に、使用するネットワークを正確に指定したコンテナを起動します。
$ docker run --name mynginx --network abc -d nginx
オーバーレイネットワークの作成
ブリッジドネットワークのセクションで述べたように、これは単一ホストのシナリオに適しています。一方、オーバーレイネットワークは複数ホストのシナリオにおいて真の価値を発揮します。オーバーレイネットワークが稼働すれば、異なるDockerホスト上のコンテナ間でトラフィックを流すことが可能となり、ホストレベルでのルーティング設定などの追加構成は不要となります。
オーバーレイネットワークは、Kubernetesなどのコンテナオーケストレーションソリューションが導入されている企業環境やクラウド環境で頻繁に採用されます。
ユーザー視点では、オーバーレイネットワークの作成と使用はブリッジドネットワークの操作と大きく変わりません。これはネットワークドライバモデルの真価を示すもので、複雑な処理の大半を抽象化し、ユーザーに一貫した操作体験を提供します。
まず、スタンドアロンコンテナが接続可能なdefというオーバーレイネットワークを作成します。
$ docker network create -d overlay --attachable def
Linuxホストの場合、Dockerオーバーレイネットワークドライバーで通信を自動的に暗号化することも可能です。
$ docker network create -d overlay --attachable --opt encrypted def
次に、使用するネットワークを指定した同じrunコマンドを実行します:
$ docker run --name mynginx --network def -d nginx
同じrunコマンドをクラスター内のすべてのホストで実行することが可能です。これにより、すべてのnginxインスタンスが起動次第、ネットワーク上で相互に通信できるようになります。
注記:Dockerで複数ホストにまたがるオーバーレイネットワークをご利用の場合、まずホスト間でスウォームを作成し、その後スウォームマネージャー上でcreate networkコマンドを実行されることをお勧めいたします。
コンテナでのホストネットワークの使用
ネットワーク機能が必要となるシナリオにおいて、Dockerホストとネットワークスタックを共有することが合理的な場合があります。これは、オーバーレイネットワークやブリッジドネットワークで発生する可能性のあるNATを回避するため、あるいはコンテナがアウトバウンド接続のみを持つ場合にポート競合を防ぐためです。
別のシナリオとしては、SwarmやKubernetesクラスターの外側で実行される管理プロセスが、実際に使用するネットワークを管理する場合が考えられます。
ホストのネットワークを利用することは、基本的に先ほどご説明した概念と同じですが、コンテナがそのネットワークタイプに対してホストを使用するよう明示的に指示する必要がある点が異なります。
$ docker run --name mynginx --net=host -d nginx
注記:ホストネットワークを使用している場合、runコマンドの--exposeオプションは機能しません。ポートは既にホストのネットワークスタック上で開放されているため、--exposeフラグは単に無視されます。
まとめ
本記事で説明した通り、Dockerはホスト上のコンテナ向け、さらにはオーバーレイネットワークを用いたホスト間接続向けのネットワーク層管理において、広範な機能を提供しております。他のソリューションは、これらの機能にまだ追いついておりません。
公式のネットワークドキュメントはDockerのドキュメントサイトで公開されており、より詳細なアーキテクチャや関連技術情報に加え、追加機能を提供するサードパーティ製ネットワークドライバへのリンクも含まれております。
