LoginSignup
13
9

More than 5 years have passed since last update.

dockerのgetsockopt: no route to host問題

Posted at

背景

社内のprivate docker registryにある日突然アクセスできなくなった
いままでできてたのになぜ?

こんなエラーが出てdocker loginできない・・・

$ docker login -u username -p password <private docker registry>
Error response from daemon: Get https://<private docker registry>/v2/: dial tcp 172.24.79.240:443: getsockopt: no route to host

原因

docker network createで作ったネットワークとアドレスが被っていた

docker network createでは--subnetオプションを使ってネットワークアドレスを指定することが出来る。
指定しないとデフォルトでクラスBのプライベートアドレス(172.16.x.x〜172.31.x.x)から順番に割り当てられていくようだ。

この際、ルーティングテーブルにも追加されるので、dockerで作られたネットワークの方を見に行ってしまうようになる。

特にdocker-composeを使っていると裏でネットワークがバンバン作られていくので気づきにくい・・・

docker networkでどのsubnetが使われているかは、以下のコマンドで確認出来る。

$ docker network inspect $(docker network ls --format {{.Name}}) --format '{{.Name}} {{.IPAM.Config}}'
bridge [{172.17.0.0/16  172.17.0.1 map[]}]
myproject_default [{172.18.0.0/16  172.18.0.1 map[]}]
host []
none []

対処方法

docker network createした時に割りあてるsubnetをオプションかなんかで指定できれば良いのだが、そういったものは無い模様
issue も出てるっぽい

使ってないネットワークを消す

使ってるネットワークが被ってたらダメだけど・・・

$ docker  network prune

docker-compose.ymlで明示的に指定する

当然、他のdocker-compose.ymlとsubnetが被ってはいけないのでアドレスを管理する必要がある。
(めんどくさい・・・・)

subnetを明示的に指定していして docker network createする

docker-comoseは <projectname>_defaultというネットワークを作成するので、同じ名前で事前に作っておく。

めんどくさいけどこれが一番ましな方法なきがする。

13
9
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
13
9