質問: circleci 2.0 では、ジョブを実行する環境として、複数 docker image を指定できます。 この環境では、以下が実現されています。 * ビルドコマンドを実行するメインのコンテナにおいて、2つめ以降の image が expose するポートを、 `localhost:${exposeされたポート番号}` からアクセスできる docker で実行されているコンテナにおいて、このようなことはどうやったら可能なのだろう、とふと思いました。 というのも、例えば素朴に docker-compose で複数コンテナ実行を行った場合、他のコンテナは基本的にそのコンテナの名称がホストに設定されています。なので、どこのコンテナにアクセスするかは、そのコンテナに割り振られたホスト名を、アクセス元のコンテナから指定してホスト解決をする必要があると理解しています。 一方、 circleci の実行環境では、すべての2番目以降のコンテナのポートは、おもむろに localhost:ポート番号 で接続できているように思っています。 ### 質問 * circleci で複数 docker image での環境でジョブを実行した場合、その場合のコンテナの構成(とくにネットワーク) はどのように構築されますか?
回答: こんにちは、CircleCIでエンジニアをしている者です。 CircleCIではDockerのNetwork Namespaceという機能を使ってlocalhostを複数のコンテナで共有しています。これを使うと複数のコンテナで使うネットワークを分けることができます。もともとはLinux Kernelが提供している機能でnetnsと呼ばれ、Dockerはそれをラップしている形となります。 netnsを使ったことがなければこの説明だけではピンとこないかもしれませんが 読んでみればイメージがつくかもしれません。 なお余談ですが、KubernetsもPOD内のコンテナ通信にnetnsを使っていることが に書かれています。 ``` Kubernetes applies IP addresses at the Pod scope - containers within a Pod share their network namespaces - including their IP address. This means that containers within a Pod can all reach each other’s ports on localhost. ``` 参考になれば幸いです。