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