Dockerコンテナのネットワークについて
docker network create
docker network connect
docker network ls
docker network rm
docker network disconnect
docker network inspect
ひとまずDockerのネットワークについて
dockerのインストールされている環境にはdocker0
などの
bridge
のネットワークが作成される。
docker run --net=<ネットワーク名>
でnetworkを指定しない限り、
デフォルトでdocker0
のbridge
に接続される。
んで、docker network ls
で確認できるが、自動でdockerコンテナ用のnetworkが3つ作成される
コンテナはデフォルトでbridge
に接続される。
(コンテナ間はbridgeで繋がっているため、pingも通る)
ホスト側の(host )ネットワーク・スタック
にコンテナに接続することで、
コンテナ内のネットワーク設定が、ホスト上と同じに見えるでしょう。
$ docker network ls
NETWORK ID NAME DRIVER
7fca4eb8c647 bridge bridge
9f904ee27bf5 none null
cf03ee007fb4 host host
ネットワークを作成する
Dockerではブリッジ・ネットワーク
やオーバレイ・ネットワーク
を作成できる。
また、ネットワークは複数作成
できます。コンテナを1つ以上のネットワークに追加できます
。コンテナの通信はネットワーク内だけでなく、ネットワーク間を横断できます。コンテナが2つのネットワークにアタッチする時、どちらのネットワークに対しても通信可能です。コンテナが複数のネットワークに接続時、外部への通信は単語順で1つめの非内部ネットワークを経由します。
ブリッジネットワークを作成する(単一ホスト上で比較的小さなネットワークの実行時に便利)
docker network create –driver bridge
ネットワーク内の各コンテナは通信可能
しかし、コンテナ自身が含まれるネットワークは外部のネットワークから独立しています。
ユーザ定義ブリッジ・ネットワークの内部では、リンク機能はサポートされません。
しかし、ネットワーク上にあるコンテナのポートは公開可能です。
さらに大きなネットワークを作成する場合は、オーバーレイ
を検討しましょう
オーバーレイ・ネットワークを作成する
Docker overlay network
を使うことで異なるL3 上(Dockerの場合は異なるDockerホスト上
) に存在するコンテナ
に対して、
同じネットワークに存在するコンテナとして透過的にアクセスすることができるようになります。
VXLAN
を利用して実装されているらしい(よくわからん。。。)
手順を以下に示す
1.DockerホストでSwarmを初期化
or 既存のSwarmに追加
させる
2. Swarm サービスに対して利用するオーバーレイネットワークを生成する
1.DockerホストでSwarmを初期化
or 既存のSwarmに追加
させる
Swarm
はサービス名らしい(VXLANの制御とかするのかな?)
- Docker ホスト間でのトラフィックのやりとりのため、以下のポートを公開する必要がある。
TCP ポート 2377、クラスター管理に関する通信用。
TCP と UDP のポート 7946、ノード間の通信用。
UDP ポート 4789、オーバーレイネットワークトラフィック用。
- オーバーレイネットワークを生成する前に以下のどちらかで、Swarmにホストを追加する必要がある。
# 🌟Swarn作成🌟
なんか ubuntu(manager)/mac(worker)で作成できなかった、、
## 🌟manager側
docker swarm init --advertise-addr=<managerのIPアドレス>
## 🌟worker側
docker swarm join --token <トークン> \
--advertise-addr <worker-1のIPアドレス> \
<managerのIPアドレス>:2377
2. Swarm サービスに対して利用するオーバーレイネットワークを生成する
- over-rayネットワーク間でのやりとりだけが目的なら
docker network create -d overlay my-overlay
- スタンドアロンコンテナー においても 利用することが必要な場合で、他の Docker デーモン上で動作する他のスタンドアロンコンテナーとも通信を行う必要がある場合は、--attachableフラグを加えます。
docker network create -d overlay --attachable my-attachable-overlay
- `--opt encrypted --attachable`を同時に指定すれば、このネットワークに対して、管理外にあったコンテナーをアタッチさせることができます。
docker network create --opt encrypted --driver overlay --attachable my-attachable-multi-host-network
Dockerのswarmクラスタのサービス作成
- managerホスト上で以下を実行
docker service create \
--name my-nginx \
--publish target=80,published=80 \
--replicas=2 \
--network myNetwork \
nginx
- 各ホストで以下コマンドを打つことで、コンテナの稼働状況を見れる
# 1秒ごとにコマンドを実行する
watch -n 1 docker ps -a
- どこぞのホストでmanagerのサービスポート向けにtelnetする
# 例 上記に合わせて 80番Portにアクセス
telnet 172.27.11.2 80
- サービスの削除
docker service rm <サービス名>
docker service rm my-nginx
コンテナにネットワークを追加する
Docker上のコンテナは動的にネットワークに参加/不参加を
切り替えることができる。
動作的にはNIC
をつけたり外したりした感じ
docker network connect <network名> <container名>
docker network disconnect <network名> <container名>
🌟以下のようになる
user@macbook ~ % docker network connect bridge ubuntuJpyter2
user@macbook ~ % docker exec -it ubuntuJpyter2 'ifconfig'
# 🌟 eth1のネットワーク層あり
eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:02 txqueuelen 0 (イーサネット)
RX packets 12 bytes 936 (936.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (ローカルループバック)
RX packets 4 bytes 200 (200.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 4 bytes 200 (200.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
# 🌟 disconnectで削除する
user@macbook ~ % docker network disconnect bridge ubuntuJpyter2
user@macbook ~ % docker exec -it ubuntuJpyter2 'ifconfig'
# 🌟 eth1のネットワーク層が消える
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (ローカルループバック)
RX packets 4 bytes 200 (200.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 4 bytes 200 (200.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
user@macbook ~ %