awsvpcまわりのECSのネットワークの挙動がdocker-composeと違っていて困って調べたので今後のためにメモしておきます。
docker-compose
- service単位でbridgeが作成される
- bridgeはL2レイヤ
- bridgeがたくさん生えるが,docker for macではVMの中にbridgeが生えるので外から
ifconfig
しても見えない。VMに潜ると見える
- bridgeの下にコンテナのインターフェイスが生える
- dockerが名前解決を提供するので,コンテナ間はコンテナ名で互いに通信できる
- exposeするとNAPTでホストのポートが開くので,ホストからは
localhost:xxxx
で見られる - したがってコンテナ同士では
localhost
では疎通しない
- exposeするとNAPTでホストのポートが開くので,ホストからは
- ホストのインターフェイスもbridgeにひっついているのでそこを通って外部に出て行ける
- composeを使わない場合,特に指定しなければdefault bridgeが使われる。default bridgeはたいてい
docker0
という名前になっているが,docker for macではlinuxがVMの中で動く都合でOS Xからは見えない - eth0とbridgeとの間のNAPTをlinuxカーネルがやっているので外部に疎通できる。
- OSXの場合,さらにVMとOSXとの間にbridge接続があるはず(ここは勘です)
- ポートをホストにexposeする場合は,当然被らせることができない
- exposeしないなら被ってても内部的に通信できる??
awsvpc
localhost
を使ってコンテナ間通信を行う- コンテナ名は使わない!!
- 他の全てのコンテナが
localhost
という名前になっていると考えることができる - 謎の挙動。なんで・・・?
- コンテナごとにENIがついているという世界観。あたかもコンテナが1つのEC2のような状態
- Fargateではこれしか使えない
bridge
- EC2で使う場合のデフォはこれ
- docker-composeの挙動と同じ
host
- dockerのhostと同じ挙動
- ホストのネットワークインターフェイスを共有しているというイメージでよい
- このためポート被りができないし,回避できない
- 速そう(勘)