【Docker 独学 入門】Dockerのネットワーク
Dockerコンテナのネットワークとしてブリッジドライバを使用したネットワークについてみていきます。
ブリッジドライバは単一のDockerホスト内に構成されるネットワークで、比較的小規模なネットワーク構成を組む場合に利用されます。
Docker machineでDockerホストを一台起動して、そのなかでネットワークの動作を確認していきます。
Dockerマシンホストの作成
docker-machine create vm1
上記で作成したDockerマシンホストにssh接続
docker-machine ssh vm1
それではいま立てたDockerマシンホストがデフォルトで用意しているネットワークについてみていきましょう。
下記のコマンドでネットワークを確認できます。
docker network ls
デフォルトでは上記の三つのネットワークが作成されており、ドライバはそれぞれbridge、host、nullとなっています。
ちなみに、ドライバについてはこちらのページを参考にしてみるといいかもです。
ドライバ (driver)とは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
コンテナはデフォルトでbrigdeドライバのネットワークに属することになります。
ではbridgeドライバについて詳細をみていきましょう。
下記のコマンドでbridgeドライバネットワークの詳細を確認できます。
docker network inspect bridge
このようにネットワークのサブネットとデフォルトゲートウェイのIPを確認することができます。
bridgeネットワークに接続されたコンテナは、この172.17.0.0/16内のIPが割り当てられます。
GatewayのIPはDockerホストのdocker0インターフェースに割り当てられたIPです。
ip addr show
たしかにGatewayのIP172.17.0.1がDockerホストに割り当てられていることがわかります。
ためしにこのDockerホスト上で、alpine linuxのコンテナをひとつ起動してみましょう。
これでこのalpine1のコンテナが自動的にbridgeネットワークに接続されているはずです。
では、
docker inspect bridge
で状態を確認してみましょう。
Containersの欄にalpine1が存在し、172.17.0.2のIPが割り当てられています。
デフォルトのブリッジネットワークでは、同じネットワーク内に存在するコンテナと、IPアドレス指定で通信することができます。
もうひとつコンテナを立ち上げて確認してみましょう。
docker run -itd --name alpine2 alpine /bin/sh
下記コマンドでalpine2に接続
docker attach alpine2
ip addr showで確認してみると、
172.17.0.3のIPが割り当てられていることが確認できました。
ではalpine1の172.17.0.2に3秒間pingを飛ばしてみましょう。
応答がかえってくるので、alpine1と通信できていることが確認できました。
ではコンテナ名で通信ができるかを確認しましょう。
するとbad addressとなり、通信ができないことがわかります。
これはデフォルトのネットワークではdockerデーモンにDNSの機能が提供されていないため、コンテナ名で通信することができません。これはユーザ定義のbridgeネットワークを使用することで解決できます。
では、dockerホストに戻り、ユーザ定義のbridgeネットワークを作成していきましょう。
docker network create my_nw
これでmy_nwというユーザ定義のネットワークが作成されました。このように、
docker network create (任意のネットワーク名)
でネットワーク名を指定することで、ユーザ定義のネットワークを作成することができます。
このネットワークに、さきほど作成したふたつのコンテナを接続します。
docker network connect my_nw alpine1
docker network connect my_nw alpine2
このように、docker network connect (ネットワーク名) (コンテナ名)で任意のネットワークに接続することができます。
最初からmy_nwに接続してalpine3コンテナを起動するコマンドは下記のとおりです。
docker run -itd --name alpine3 --network my_nw alpine
このように、--network (ネットワーク名)というオプションを付加することで、はじめからそのネットワークに接続された状態でコンテナを起動できます。この場合、デフォルトのbridgeネットワークには接続されていない状態で起動します。
では下記のコマンドでいまmy_nwのネットワークに接続されているコンテナを確認しましょう。
docker network inspect my_nw
これでmy_nwに三つのコンテナが接続されたことを確認できました。
では、alpine2にattachして、alpine1とalpine3にpingを飛ばしてみましょう。
今度はコンテナ名で通信することができました、これはDockerデーモンの組み込みのDNSが動作しているためです。
コンテナ間で通信を行う場合には、LINKは非推奨であり、ユーザ定義のネットワークをつかうことが推奨されています。
さいごに、ネットワークからコンテナを切断する処理を見ておきましょう。
このように、bridgeとmy_nwのふたつのネットワークにつながっていることがわかります。
docker network disconnect bridge alpine2
docker inspect alpine2
すると、bridgeネットワークから切り離されたことがわかります。
bridgeネットワークはインターネットにでることはできますが、デフォルトの状態で外部に公開されていないネットワークです。-dフラグで指定したポートを解放することで、外部からコンテナの指定元にアクセスできるようになります。
独学するには?
もっとDockerを詳しく学びたいひとは、Udemyの「ゼロからはじめる Dockerによるアプリケーション実行環境構築」がおすすめです。本とはまたちがった動画教材ならではの手を動かしながらの学びやすさがあります。
本ならこちらがおすすめ
Dockerのみならず、Kubernetesまでを見据えて書かれているところもよいです。弊部署の大先輩も7冊くらいDocker本を読んでみた結果、これが一番まとまっていてよかったといってました。