今回のお題
前回はdocker-compose
を用いて複数のコンテナを同時に作成しましたが、その結果それらの間でも通信ができるようになりました。
これはコンテナ同士がdockerネットワークという同一の入れ物に入っているからであり、docker-composeを用いることでコンテナの作成だけでなくネットワークの整備までもが自動で進むのがdocker-composeのメリットだと言われています。
と、偉そうに言いましたが、docker-composeが自動でやってくれたおかげで私自身dockerネットワークについてはほとんどわかっていません。
ですので、それらについて自分なりに調べた内容をここにメモしておこうと思います。
復習〜Dockerネットワークとは
複数のコンテナを連携させるための箱のようなもの。
ほとんどのサービスは複数のコンテナを利用することで成り立っているため、コンテナ同士での通信が必要になる。
コンテナ同士を同一のネットワークに所属させることでそれらの間での通信が容易になり、結果的にサービスの構築が簡単になる。
Dockerネットワークの種類
Dockerネットワークには大きく分けて3つのタイプがあり、それぞれbridge
, host
, null(none)
と呼ばれる。
この分類は、ネットワーク内のコンテナがホストOSの外部とどのようにして通信するのかによって行われている。
ネットワークの種類がnull(none)の場合、コンテナは外部と通信できない。
hostにおいては、ネットワークに所属するコンテナはホストOSのプライベートIPアドレスを使って通信することになる。
bridgeにおいてはコンテナごとにホストOSとは別のIPアドレスが割り当てられ、ホストOSとコンテナのIPアドレスを仮想スイッチと呼ばれる装置が中継(bridge)することで通信が成立している。
作成されたコンテナのネットワーク設定
Dockerはデフォルトで3つのネットワークを保有しており、それぞれのネットワーク名やネットワークタイプについては以下のようになっている。
# 作成済みのネットワークを一覧表示
% docker network ls
NETWORK ID NAME DRIVER SCOPE
59c6a0c60086 bridge bridge local
efba6f694b6f host host local
a0d4f5e885f9 none null local
docker run
コマンドで作成されたコンテナについては基本的には上記のbridgeに所属するが、--net
オプションを付けることで所属するコンテナの指定が可能。
# これだとbridgeに所属
% docker run -it -d centos:centos7
# hostを指定
% docker run -it -d --net=host centos:centos7
# noneを指定
% docker run -it -d --net=none centos:centos7
また、docker-compose up
コマンドを用いてコンテナを作成した場合にはxxxx_default
という名前のネットワークが新しく作られるが、この際も特に指定がなければdriverはbridgeになる。
また、デフォルトのbridgeであっても新規作成されたbridgeネットワークであっても、コンテナ作成時に自動的にIPアドレスが付与される。
終わりに
長くなってしまったので一旦ここまでにします。
次回はbridgeの仕組みについてまとめる予定です。