たのしい工学

プログラミングを学んで、モノをつくりたいひと、効率的に仕事をしたい人のための硬派なブログになりました

【Docker 独学 入門】Dockerのネットワーク

   

Dockerコンテナのネットワークとしてブリッジドライバを使用したネットワークについてみていきます。

ブリッジドライバは単一のDockerホスト内に構成されるネットワークで、比較的小規模なネットワーク構成を組む場合に利用されます。

Docker machineでDockerホストを一台起動して、そのなかでネットワークの動作を確認していきます。

Dockerマシンホストの作成


docker-machine create  vm1

上記で作成したDockerマシンホストにssh接続


docker-machine ssh vm1

すると、このようにホストに接続できます。
Image from Gyazo

それではいま立てたDockerマシンホストがデフォルトで用意しているネットワークについてみていきましょう。

下記のコマンドでネットワークを確認できます。


docker network ls

Image from Gyazo

デフォルトでは上記の三つのネットワークが作成されており、ドライバはそれぞれbridge、host、nullとなっています。

ちなみに、ドライバについてはこちらのページを参考にしてみるといいかもです。
ドライバ (driver)とは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

コンテナはデフォルトでbrigdeドライバのネットワークに属することになります。

ではbridgeドライバについて詳細をみていきましょう。

下記のコマンドでbridgeドライバネットワークの詳細を確認できます。


docker network inspect bridge

このようにネットワークのサブネットとデフォルトゲートウェイのIPを確認することができます。

Image from Gyazo

bridgeネットワークに接続されたコンテナは、この172.17.0.0/16内のIPが割り当てられます。

GatewayのIPはDockerホストのdocker0インターフェースに割り当てられたIPです。


ip addr show

コマンドで確認をすると、
Image from Gyazo

たしかにGatewayのIP172.17.0.1がDockerホストに割り当てられていることがわかります。

ためしにこのDockerホスト上で、alpine linuxのコンテナをひとつ起動してみましょう。

Image from Gyazo

これでこのalpine1のコンテナが自動的にbridgeネットワークに接続されているはずです。

では、


docker inspect bridge

で状態を確認してみましょう。

Image from Gyazo

Containersの欄にalpine1が存在し、172.17.0.2のIPが割り当てられています。

デフォルトのブリッジネットワークでは、同じネットワーク内に存在するコンテナと、IPアドレス指定で通信することができます。

もうひとつコンテナを立ち上げて確認してみましょう。


docker run -itd --name alpine2 alpine /bin/sh

下記コマンドでalpine2に接続


docker attach alpine2

ip addr showで確認してみると、

Image from Gyazo

172.17.0.3のIPが割り当てられていることが確認できました。

ではalpine1の172.17.0.2に3秒間pingを飛ばしてみましょう。

Image from Gyazo

応答がかえってくるので、alpine1と通信できていることが確認できました。

ではコンテナ名で通信ができるかを確認しましょう。

Image from Gyazo

するとbad addressとなり、通信ができないことがわかります。

これはデフォルトのネットワークではdockerデーモンにDNSの機能が提供されていないため、コンテナ名で通信することができません。これはユーザ定義のbridgeネットワークを使用することで解決できます。

では、dockerホストに戻り、ユーザ定義のbridgeネットワークを作成していきましょう。


docker network create  my_nw

Image from Gyazo

これで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

Image from Gyazo

これでmy_nwに三つのコンテナが接続されたことを確認できました。

では、alpine2にattachして、alpine1とalpine3にpingを飛ばしてみましょう。

Image from Gyazo

今度はコンテナ名で通信することができました、これはDockerデーモンの組み込みのDNSが動作しているためです。

コンテナ間で通信を行う場合には、LINKは非推奨であり、ユーザ定義のネットワークをつかうことが推奨されています。

さいごに、ネットワークからコンテナを切断する処理を見ておきましょう。

このように、bridgeとmy_nwのふたつのネットワークにつながっていることがわかります。
Image from Gyazo


docker network disconnect bridge alpine2

docker inspect alpine2

Image from Gyazo

すると、bridgeネットワークから切り離されたことがわかります。

bridgeネットワークはインターネットにでることはできますが、デフォルトの状態で外部に公開されていないネットワークです。-dフラグで指定したポートを解放することで、外部からコンテナの指定元にアクセスできるようになります。

独学するには?

もっとDockerを詳しく学びたいひとは、Udemyの「ゼロからはじめる Dockerによるアプリケーション実行環境構築」がおすすめです。本とはまたちがった動画教材ならではの手を動かしながらの学びやすさがあります。

本ならこちらがおすすめ
Dockerのみならず、Kubernetesまでを見据えて書かれているところもよいです。弊部署の大先輩も7冊くらいDocker本を読んでみた結果、これが一番まとまっていてよかったといってました。

 - Docker