2021/10/30

docker再びの再び (4)

4回もやっていると何でこんなタイトルだったのか忘れてしまいそうになるが、今回で dockerを勉強するのが3回目になるからだった。


今回はネットワークについて。

Docker コンテナ・ネットワークの理解 — Docker-docs-ja 19.03 ドキュメント
http://docs.docker.jp/engine/userguide/networking/dockernetworks.html

日本語だ。
多少情報が古いかもしれないが、基本的なことは変わってないんじゃなかろうか。まあ、後で調べよう。

 

ifconfig で見えるのは docker0 だけだが、docker コマンドでは書いてあるように 3つ見える。

$ docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
cc02564a80e1   bridge    bridge    local
4dee0c98d161   host      host      local
51c798d9077c   none      null      local

うーん、少し読んだけどさっぱりわからんよ。
もっと概要から説明してほしいのだが。

Networking overview | Docker Documentation
https://docs.docker.com/network/

Dockerのnetworkingサブシステムは、driver を使って追加/削除できる(プラグイン方式)らしい。
デフォルトで存在したりコアネットワークとして提供されているドライバはこれら。

  • bridge
  • host
  • overlay
  • macvlan
  • none

さっきの network ls で出てきたものでも DRIVER として表示されているな。

 

bridge

これがデフォルトのネットワークdriver。
固有名詞じゃなさそうだから「ドライバ」でよいのかな。
どういう意味でデフォルトかというと、普通はこれが使われる、というデフォルトのようだ。そりゃそうだろうと言われそうだが「デフォルトで付属している(けどあまり使われない)」みたいなこともあるので気にしたのだ。

名前からすると、docker コンテナ内のネットワークとリアル環境のネットワークを橋渡ししてくれるのだろうか。
なんというか、そうだったら bridge 以外はいらないような気がするのだが、他は何をするんだろう?

 

host

   うーん?

For standalone containers, remove network isolation between the container and the Docker host, and use the host’s networking directly.
スタンドアロンコンテナの場合、コンテナとDockerホスト間のネットワーク分離を削除し、ホストのネットワークを直接使用します。

通常はコンテナとホストが分離されているけど、それを削除するということは、分離しなくなるということか?

 

overlay

複数の docker daemonをそれぞれ接続し、 swarm service?がそれぞれ通信できるようにする もの らしい。
うん、よくわからん。

1台の PCでは、docker daemonは 1つ動いているということになるんだろうか。
bridge と host では「standalone containers」と書いてあったのだが、それぞれのコンテナで docker daemonが 1つ動いているという扱いにするのなら、これがコンテナ間を直接つないでくれるのかもしれん。
swarm というのは知らん。後回し。

 

macvlan

MacOS 専用のドライバかと思ったが、MACアドレスの方を表しているようだ。
MACアドレスをコンテナに割り当てることができるらしい。ということはマシン外とアクセスするときに使えるということだろうか。それに MACアドレスということなら物理層とか下の方の階層になるはずなので他のドライバと併用できるとかだろうか。

まあ、用途として特殊になりそうだから後回しでいいかな。

 

none

host が外部と接続しないようにするドライバだったが、 none はネットワーク接続をしないというドライバらしい。
ネットワークドライバなのにネットワークに接続しないとは、なんか面白いものだ。

カスタムネットワークドライバと一緒に使うのが普通らしい。
よくわからんが、後回しで良い気がする。ただ、初期設定で動作しているのでよく使うものなのかも。

 

 

説明の中で「standalone containers」という言葉がしばしば出てくる。
スタンドアローンなのにコンテナは複数形なのだ。だから、スタンドアローンのコンテナが複数あって、それを bridge とかで接続するとか、それぞれが host とかで自分の中だけで運用するとか、そういう話なんじゃなかろうか。

あと、「swarm service」という言葉も出てくる。

【swarm】
群れ、群衆。群がる。

swarm mode というページがある。

Current versions of Docker include swarm mode for natively managing a cluster of Docker Engines called a swarm.
Dockerの現在のバージョンには、スウォームと呼ばれるDockerエンジンのクラスターをネイティブに管理するためのスウォームモードが含まれています。

クーベネイティス、だったか、複数のコンテナを使ったシステムをうまいこと立ち上げるのがあったと思うが、それで使うのだろうか? わからんことは後回しだ。


Networking with standalone containers | Docker Documentation
https://docs.docker.com/network/network-tutorial-standalone/

bridge ドライバがデフォルトだとあるが、ここでは「デフォルト bridge ネットワーク」と「ユーザ定義 bridge ネットワーク」の2つが書かれている。ドライバとは書いていないので別の話なのか。
デフォルトの bridge ネットワークは製品版には推奨しないそうだ。

このチュートリアルではどちらも見せてくれるそうなので、やってみるのが良かろう。

 

まず、デフォルトの方。
特に何か特別なことをするわけでもなく、コンテナを2つ立ち上げると IPアドレスがそれぞれホストとは異なるプライベートアドレスが割り当てられた(ホストは 192.168.0.0 だが、コンテナは 172.17.0.0 だった)。
そのコンテナの中からグローバルなIPアドレスにアクセスできるし、相手のコンテナにもアクセスできる。

そういえばホストにもアクセスできるのかは確認していなかった。
docker stop でコンテナを終わらせた状態なのだが「再開」はできるのだろうか? チュートリアルと同じ docker run のコマンドを打ち込んでも名前が既にあるとエラーになった。
コンテナを削除すれば良いそうだが、単に再開させるだけなら docker start でよいようだ。

で、コンテナの中からホストに向けて ping しても成功したし、ホストからコンテナに向けて ping しても成功した。
私の記憶では、ネットワークのことをやるのにポート番号をどうのこうの設定していた気がするのだが... まあ ping だからポート番号は関係ないというだけで、後から出てくるのか。
わからん。

 

次はユーザ定義の方。
docker network create で bridge をベースにして(?)新たなドライバを作っているのか。
この方式だと、ping 先としてコンテナ名を使うことができる(bridge の場合は IPアドレスだけだった)。

デフォルトがなんで製品に向かないかというと、コンテナを立ち上げてしまうだけでネットワークにアクセスできてしまうからだと思う。他にも理由はあるとは思うが、システムごとに network create して作るのが無難だろう。


長くなったので、Hostのチュートリアルは次回にしよう。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。