MyUtils

View on GitHub

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を指定しない限り、 デフォルトでdocker0bridgeに接続される。

んで、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

🚨 hostネットワークに関して

hostネットワークはLinuxホストでしか動作しません😞



ネットワークを作成する

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クラスタのサービス作成

docker service create \
  --name my-nginx \
  --publish target=80,published=80 \
  --replicas=2 \
  --network myNetwork \
  nginx
# 1秒ごとにコマンドを実行する
watch -n 1 docker ps -a
# 例 上記に合わせて 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 ~ %