Lambdaカクテル

京都在住Webエンジニアの日記です

awsvpcとdocker-composeメモ

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では疎通しない
  • ホストのインターフェイスも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と同じ挙動
  • ホストのネットワークインターフェイスを共有しているというイメージでよい
  • このためポート被りができないし,回避できない
  • 速そう(勘)

参考文献

dev.classmethod.jp

enakai00.hatenablog.com