問題
docker-composeで定義されたコンテナ名と別のコンテナのサービス名が同じだと、Dockerネットワーク内での名前解決がコンテナ名でできなくなる
本家には報告ずみです。
https://github.com/docker/compose/issues/8056
# 検証
docker-compose.yml
version: "3"
services:
rest-client:
container_name: curl
image: tutum/curl
command: sleep infinity
web1:
container_name: api1
build: ./api1
command: ruby main.rb -o 0.0.0.0
api1:
container_name: api2
build: ./api2
command: ruby main.rb -o 0.0.0.0
networks:
default:
name: net1
以上のようなケース、”api1”が異なるコンテナでそれぞれコンテナ名、サービス名で使われている場合だと、net1ネットワーク内だと名前解決の結果が混ざる。
嘘だろって思いますが、本当に混ざります。
## api1コンテナ
require 'sinatra'
get '/' do
'This is app1 container!'
end
## api2コンテナ
require 'sinatra'
get '/' do
'This is app2 container!'
end
これらをnet1内でアクセスするにはドメインにコンテナ名を使うことでURLアクセスできます。
つまり、以下の結果が期待できます。
#net1ネットワークに接続して、
$ curl "http://api1:4567/"
This is app1 container!
$ curl "http://api2:4567/"
This is app2 container!
ですが、curl "http://api1:4567/"
の結果がランダムに変わります。
## テスト
$ docker-compose up -d
$ docker exec -it curl bash
# curl "http://api1:4567/"
こうしてやると、半分ぐらいの確率で、This is app2 container!
の結果が混ざって帰ってきます。。。
謎の404エラーなどで困っている方がいれば、それが別のコンテナに運ばれている可能性があります。お気をつけて。。。
## 手軽に試したい方へ
https://github.com/akihirof0005/Verification-defects
上記のリポジトリにテストケースを作成しました。
そして、協力してくれる方は、再現できたら教えてください。再現できなくても教えてください。。。。