Docker-Compose の実験的な --x-networking 機能を使用してプロジェクトをセットアップしましたが、compose が作成するプライベート ネットワークでの DNS ルックアップに関する奇妙な問題に遭遇しています。
ping や ip コマンドを実行したり、/etc/hosts を見たりすると、すべてが期待どおりに表示されます。しかし、DNS ルックアップを行うツール (起動時の Varnish や Dig など) は、奇妙な結果を返します。
/etc/hosts から値を返すのではなく、IP アドレスのペアを返していますが、どちらも実際のものではありません。
Mac OS X で docker-compose バージョン 1.5.2、ビルド 7240ff3 を実行しています。
ここに私の docker-compose.yml があります:
redis:
image: redis
container_name: my_redis
db:
image: postgres
container_name: my_postgres
nginx:
image: nginx
container_name: my_nginx
volumes:
- .:/code
- ./devscripts/docker-compose/nginx.conf:/etc/nginx/nginx.conf:ro
ports:
- 8080
uwsgi:
build: .
container_name: my_uwsgi
environment:
DJANGO_SETTINGS_MODULE: 'my.settings_docker_compose'
command: uwsgi --yaml=devscripts/docker-compose/uwsgi-compose.yml
volumes:
- .:/code
ports:
- 7000
varnish:
image: million12/varnish
container_name: my_varnish
environment:
VARNISHD_PARAMS: -a :8000
ports:
- 8000:8000
volumes:
- ./devscripts/docker-compose/varnish.vcl:/etc/varnish/default.vcl:ro
my_varnish コンテナ /etc/hosts から:
[root@61bcb46ba4a2 /]# cat /etc/hosts
172.18.0.3 61bcb46ba4a2
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.18.0.4 my_redis
172.18.0.6 my_nginx
172.18.0.2 my_postgres
172.18.0.2 my_postgres.my
172.18.0.4 my_redis.my
172.18.0.5 my_uwsgi
172.18.0.5 my_uwsgi.my
172.18.0.6 my_nginx.my
Dig 出力 (CentOS 7 イメージ) は次のとおりです。
[root@61bcb46ba4a2 /]# dig my_nginx
; <<>> DiG 9.9.4-RedHat-9.9.4-29.el7_2.1 <<>> my-nginx
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 47196
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;my_nginx. IN A
;; ANSWER SECTION:
my_nginx. 10 IN A 198.105.244.23
my_nginx. 10 IN A 198.105.254.23
;; Query time: 56 msec
;; SERVER: 205.171.2.25#53(205.171.2.25)
;; WHEN: Thu Dec 31 01:11:33 UTC 2015
;; MSG SIZE rcvd: 66
これら 2 つの IP アドレスは、私が知る限り、何の関係もありません。実際には機能しません。また、私が掘ったすべてのホストは、同じ 2 つの A レコードを取得します。
そしてトリックは、Varnish が起動しないということです。なぜなら、Varnish は 1 回限りの DNS ルックアップを実行し、バックエンドの 2 つの (偽の) アドレスを見つけるからです。
ここで何が起こっているのか推測できますか?
乾杯!