48569


circleci 2.0 では、ジョブを実行する環境として、複数 docker image を指定できます。
<https://circleci.com/docs/2.0/executor-types/#using-multiple-docker-images>

この環境では、以下が実現されています。

  * ビルドコマンドを実行するメインのコンテナにおいて、2つめ以降の image が expose するポートを、 `localhost:${exposeされたポート番号}` からアクセスできる

docker で実行されているコンテナにおいて、このようなことはどうやったら可能なのだろう、とふと思いました。

というのも、例えば素朴に docker-compose
で複数コンテナ実行を行った場合、他のコンテナは基本的にそのコンテナの名称がホストに設定されています。なので、どこのコンテナにアクセスするかは、そのコンテナに割り振られたホスト名を、アクセス元のコンテナから指定してホスト解決をする必要があると理解しています。

一方、 circleci の実行環境では、すべての2番目以降のコンテナのポートは、おもむろに localhost:ポート番号
で接続できているように思っています。

### 質問

  * circleci で複数 docker image での環境でジョブを実行した場合、その場合のコンテナの構成(とくにネットワーク) はどのように構築されますか?


CC BY-SA 4.0
2018-09-18T04:17:14.797
48494
2018-09-20T01:36:40.783
2018-09-18T11:59:54.813
754
754
question
docker circleci
circleci で複数イメージを指定したとき、それは docker としてどのような構成で実現される？


こんにちは、CircleCIでエンジニアをしている者です。

CircleCIではDockerのNetwork
Namespaceという機能を使ってlocalhostを複数のコンテナで共有しています。これを使うと複数のコンテナで使うネットワークを分けることができます。もともとはLinux
Kernelが提供している機能でnetnsと呼ばれ、Dockerはそれをラップしている形となります。

netnsを使ったことがなければこの説明だけではピンとこないかもしれませんが  
<http://yoru9zine.hatenablog.com/entry/2016/12/28/225948>
読んでみればイメージがつくかもしれません。

なお余談ですが、KubernetsもPOD内のコンテナ通信にnetnsを使っていることが
<https://kubernetes.io/docs/concepts/cluster-
administration/networking/#kubernetes-model> に書かれています。

[code]

    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.
    
[/code]

参考になれば幸いです。


CC BY-SA 4.0
2018-09-20T01:36:40.783
48569
2018-09-20T01:36:40.783
30178
48494
answer