技術

【初心者必見】Dockerのネットワークとは?デフォルトの3種類とユースケースを解説

広告

Dockerにはインストールした時点でデフォルトで3種類のネットワークが用意されます。3種類+新規作成するDockerネットワークを活用し、コンテナに接続するのかが重要です。Dockerネットワークの種類とそれぞれのユースケースを紹介し、実践的な利用方法も解説します。

Dockerのネットワークとは

Dockerネットワークは、Dockerコンテナ間またはDockerコンテナとホスト間の通信を実現するネットワークです。

Dockerネットワークの管理によってアプリケーションの安全性と効率性を確保が可能です。Dockerネットワークの利用により具体的には以下の効果が期待できます。

  • コンテナの通信経路の確保
  • ネットワーク分離
  • セキュリティの確保

Dockerネットワークを利用して、コンテナの通信を自在に操作しましょう。

デフォルトで用意されているDockerネットワーク3種類

Dockerはインストールした時点で以下3種類のネットワークが用意されます。

  • bridge
  • host
  • none

3種類の違いはドライバーの違いによるものです。ドライバーが違うことで異なる通信を実現できます。

bridge

bridgeネットワークは以下のようにホストマシン内部に生成されたコンテナ用ネットワークです。コンテナ作成時にデフォルトネットワークとなっており、作成時にネットワークを指定しなければbridgeにアタッチされます。

bridgeはホストのインタフェースから独立しています。各コンテナのNICがそれぞれIPアドレスを保有するため、bridgeネットワーク間ではIPアドレスを用いた通信が可能です。

なおデフォルトで用意されるbridge(bridge0)の場合、コンテナ間の名前解決はできません。名前解決をしたい場合は別のbridgeネットワークを作成する必要があります。

上記のようにbridgeが分かれている場合は、コンテナ間の通信ができません。例として上記であればコンテナAとコンテナCは通信をできないことになります。

外部との通信は上記の図ではeth0でのNATを行うことで実現されます。

host

hostネットワークはコンテナがホスト上のネットワーク環境をそのまま利用するネットワークです。

bridgeはeth0とbridgeがあくまで別のレイヤーとして独立したネットワークとなっていました。一方でhostは別のレイヤーではなく平面的なネットワーク環境を実現します。

上記のようにコンテナがホスト上のeth0を直接利用して通信を実施します。よって外部から見るとコンテナが直接外部にアクセスしているように見えることが特徴です。

上記の場合、コンテナA,Bはそれぞれ同じIPアドレスを持ちます。通信の宛先として指定するためには、各コンテナがリッスンするポートの設定が必要です。

none

noneを指定した場合、コンテナがネットワークにアタッチされません。よってホストや他のコンテナから通信できないコンテナに使用するネットワークです。

ユースケースはネットワーク接続を必要としない処理を行う場合です。

Dockerネットワークの使い分け

Dockerネットワークの大まかな使い分けは以下のとおりです。

Dockerネットワークの使い分け

  • 特に何も気にしない → bridge
  • 絶対に他のコンテナやホストと通信させたくない → none
  • ネットワーク分離などを考えず、外部から見てシンプルな構成でコンテナを動かしたい → host

デフォルトではbridgeに接続するようになっており、その分多彩なニーズにも対応できます。そのため、noneやhostを使いたい要望がなければ基本的にはbridgeを使えば問題ありません。

またbridgeでも名前解決ができた方が便利なケースが多いです。理由はコンテナは作成・削除を繰り返すため一位のIPアドレスを保有できる可能性は低い環境といえます。

特に複数のコンテナを連携させる場合はIPアドレスではなく名前解決ができた方が良いです。よってbridgeでもデフォルトのbridgeではなく、新しいbridgeのネットワークを作成することが推奨です。

Dockerネットワークの作り方

Dockerネットワークを作る際のコマンドは以下のとおりです。

 

nginxのコンテナに作成したDockerネットワークを接続させる

では先ほど作成したtest-networkに、nginxのコンテナを接続させてみましょう。nginxのコンテナを立てておき、そこに対してubuntuのコンテナを立ててnginxのコンテナに対してcurlを実行します。

2つ目のコマンドの最後がcurl nginxとなっています。これでコンテナ名で名前解決をしていることも理解していただけるでしょう。

Dockerネットワークを活用して様々な環境をコンテナのみで実現できます。

-技術
-,