docker でホストへ bind した port が、 tcp6 に bind されているのに tcp4 で接続できている理由がわからない
ubuntu 14.04 上に、 docker をインストールしています。
この上で、コンテナ (elasticsearch) を、適切に host へマッピングしながらデーモン実行して(補足参照)、netstat -lnp
を実行したところ、どうも tcp6 に対してのみ port が bind されているように見えます。
vagrant@vagrant-ubuntu-trusty-64:~$ netstat -lnp | egrep '(9200|9300)'
(No info could be read for "-p": geteuid()=1000 but you should be root.)
tcp6 0 0 :::9300 :::* LISTEN -
tcp6 0 0 :::9200 :::* LISTEN -
しかし、この状態でも、 tcp4 での接続は、正しく動作している様子でした。
vagrant@vagrant-ubuntu-trusty-64:~$ curl -4 127.0.0.1:9200
{
"name" : "Rahne Sinclair",
"cluster_name" : "elasticsearch",
"version" : {
"number" : "2.2.0",
"build_hash" : "8ff36d139e16f8720f2947ef62c8167a888992fe",
"build_timestamp" : "2016-01-27T13:32:39Z",
"build_snapshot" : false,
"lucene_version" : "5.4.1"
},
"tagline" : "You Know, for Search"
}
自分の理解ですと、 tcp6 と tcp4 はプロトコルが別なので、 tcp6 で特定の port へ bind していたとしても、tcp4 のプロトコルでは、接続ができないのではないかと思っているのですが、上記の通り、今手元の環境では、そうではない動作をしています。
質問:
- どうして、 tcp6 でしか bind していないように見えるのに、 tcp4 でアクセスできているのでしょうか。
補足:
コンテナの実行に利用したコマンドは、次の通りでした。
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 elasticsearch