背景
社内の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
というネットワークを作成するので、同じ名前で事前に作っておく。
めんどくさいけどこれが一番ましな方法なきがする。