Leaseweb: VM を Ubuntu 14.04 から 16.04 にアップグレードした後、docker が localhost への接続を拒否する

Leaseweb: VM を Ubuntu 14.04 から 16.04 にアップグレードした後、docker が localhost への接続を拒否する

まったく困惑しています。Leaseweb 仮想サーバーで Ubuntu 14.04 から 16.04 にアップグレードした後、docker は localhost への接続を受け入れなくなりました。元の CouchBase サーバー イメージを使用して、ラップトップで次のコマンドを実行すると、完全に動作します (Docker バージョン 1.12.1、ビルド 23cf638)。

$ docker run --rm -ti --name couchbase-server -p 127.0.0.1:8091:8091 couchbase/server:community-4.5.0
Starting Couchbase Server -- Web UI available at http://<ip>:8091 and logs available in /opt/couchbase/var/lib/couchbase/logs

$ curl localhost:8091
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"><html><head><title>301 Moved Permanently</title></head><body><h1>Moved Permanently</h1><p>The document has moved <a href="http://localhost:8091/ui/index.html>here</a>.</p></body></html>

しかし、Leaseweb でホストされている Ubuntu 16.04 VM (まったく同じ docker Docker バージョン 1.12.1、ビルド 23cf638) でまったく同じコマンドを実行すると、失敗します。

# curl localhost:8091
curl: (7) Failed to connect to localhost port 8091: Connection refused
# netstat -tnlp|grep 8091
tcp        0      0 127.0.0.1:8091          0.0.0.0:*               LISTEN      7387/docker-proxy
# iptables -t nat -L                                                                                                                                                                  
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
REDIRECT   tcp  --  anywhere             anywhere             tcp dpt:http redir ports 8080
REDIRECT   tcp  --  anywhere             anywhere             tcp dpt:https redir ports 8443
DOCKER     all  --  anywhere             anywhere             ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
DOCKER     all  --  anywhere            !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
MASQUERADE  all  --  172.17.0.0/16        anywhere            
MASQUERADE  all  --  172.18.0.0/16        anywhere            
MASQUERADE  tcp  --  172.17.0.2           172.17.0.2           tcp dpt:8091

Chain DOCKER (2 references)
target     prot opt source               destination         
RETURN     all  --  anywhere             anywhere            
RETURN     all  --  anywhere             anywhere            
DNAT       tcp  --  anywhere             localhost            tcp dpt:8091 to:172.17.0.2:8091

ただし、ポートをパブリックに開くと、動作し始めます。

# docker run --rm -ti --name couchbase-server -p 8091:8091 couchbase/server:community-4.5.0
# netstat -tnlp|grep 8091
tcp6       0      0 :::8091                 :::*                    LISTEN      15434/docker-proxy
# curl localhost:8091
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"><html><head><title>301 Moved Permanently</title></head><body><h1>Moved Permanently</h1><p>The document has moved <a href="http://localhost:8091/ui/index.html>here</a>.</p></body></html>
# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
REDIRECT   tcp  --  anywhere             anywhere             tcp dpt:http redir ports 8080
REDIRECT   tcp  --  anywhere             anywhere             tcp dpt:https redir ports 8443
DOCKER     all  --  anywhere             anywhere             ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
DOCKER     all  --  anywhere            !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
MASQUERADE  all  --  172.17.0.0/16        anywhere            
MASQUERADE  all  --  172.18.0.0/16        anywhere            
MASQUERADE  tcp  --  172.17.0.2           172.17.0.2           tcp dpt:8091

Chain DOCKER (2 references)
target     prot opt source               destination         
RETURN     all  --  anywhere             anywhere            
RETURN     all  --  anywhere             anywhere            
DNAT       tcp  --  anywhere             anywhere             tcp dpt:8091 to:172.17.0.2:8091

唯一の違いは、最後の行のdestination anywhereVSですlocalhost。ただし、自宅のマシンでは、関連する iptables ルールlocalhostも同様であり、機能します。実際、自宅のマシンでは、iptables ルールはまったく同じですが、機能します。自宅のマシンは、新しいカーネル (VM では 4.8.0-34-generic に対して 4.4.0-59-generic) を使用し、VM では準仮想化ではなくベアメタルで実行されます。おそらくそうでしょう。サポートによると、上記は Ubuntu 14.04 VM で問題なく動作するとのことですが、アップグレードすべきではなかったのかもしれません...

関連情報