0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

docker-composeのネットワークで名前解決できない

Last updated at Posted at 2021-01-22

問題

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
上記のリポジトリにテストケースを作成しました。
そして、協力してくれる方は、再現できたら教えてください。再現できなくても教えてください。。。。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?