Open1

host からdocker-compose のサービス名で ping しよう

saygoxsaygox

(本稿は ubuntu20.04 中心だけどwindowsや他向けの技術紹介もあるよ)

はじめに

最近の開発でdockerが手放せない人も多くなっていると思う
特にdocker-composeは複数のサービスを簡単に立ち上げられるので楽

設定ファイル docker-compose.yml で

version: '3'
services:
  nginx:
    image: nginx:alpine
  nginx2:
    image: nginx:alpine

としてると、 お互いのコンテナでは、サービス名 nginx, nginx2 で呼びあえて楽

$ docker-compose exec nginx ping nginx2
PING nginx2 (172.21.0.3): 56 data bytes
64 bytes from 172.21.0.3: seq=0 ttl=64 time=0.072 ms
64 bytes from 172.21.0.3: seq=1 ttl=64 time=0.143 ms

実際、dockerでプログラムを書くときは埋め込みで名前を入れることも多いハズ

ところが、ホストからは呼ぶことができず、仲間はずれ感が半端ない

$ LANG=C ping nginx2
ping: nginx2: Temporary failure in name resolution

これが ping だったら特に開発に影響はないけど、実際はサービスにアクセスするurlを名前で呼べるか。

http://nginx2

でアクセスできると目視含めて動作のテストが楽なのだ。

こんな軽いテストをやるためでもホストから見ようとすると、IP直打ちか、exportでホスト側に出すしかない。
がこれ、単純にめんどくさいだけじゃない、セキュリティそこそこのものだとipで呼ぶとハッシュが違うエラーとかで出るので、DNSを建てるなどが必要となってきて手間がかかりすぎる

簡易DNSおいてみます?

ホストからもdocker-composeの名前で呼びたいということで紹介するのが dvddarias/docker-hoster

魔法の呪文を打ち打ち

docker run  -v /var/run/docker.sock:/tmp/docker.sock   \
    -v /etc/hosts:/tmp/hosts     dvdarias/docker-hoster

あら不思議、ホストからもpingが通ります

$ LANG=C ping nginx2
PING nginx (172.21.0.3) 56(84) bytes of data.
64 bytes from nginx (172.21.0.3): icmp_seq=1 ttl=64 time=0.081 ms
64 bytes from nginx (172.21.0.3): icmp_seq=2 ttl=64 time=0.072 ms
64 bytes from nginx (172.21.0.3): icmp_seq=3 ttl=64 time=0.075 ms
^C
--- nginx2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 3050ms
rtt min/avg/max/mdev = 0.024/0.063/0.081/0.022 ms

実際は、dvdarias/docker-hoster が /etc/hosts を書き換えているだけ。賢い
DNSというのは言いすぎなのかもしれない

$ cat /etc/hosts
127.0.0.1 localhost
127.0.1.1 ***

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters


#-----------Docker-Hoster-Domains----------
172.17.0.2    nervous_faraday   ae55309a041a
172.21.0.4    nginx   194670f908fb   test_nginx_1
172.21.0.3    9465f50c0ea1   test_nginx2_1   nginx2
#-----Do-not-add-hosts-after-this-line-----

よく見ると、 コンテナ名なども追記されてる

これで煩わしさがなくなるならと我が家では即導入
みなさんも使われてはどうだろうか

windowsでは使えないの?

この dvdarias/docker-hoster は windows の WSLでは残念ながら使えない。
でも落ち込まないでくれ。
似たものに mageddo/dns-proxy-server がある。

むしろこっちが本命で、筆者もを使おうとしたら ubuntu20.04 と相性が悪いくて、急遽 dvdarias/docker-hoster に切り替えたのだ。
こちらを使っているという人がいたら報告ヨロシク