Докер слушает в контейнере, но не отвечает снаружи, почему?

У меня есть контейнер докеров, построенный с помощью "EXPOSE 8000" среди его инструкций. Я начал процесс следующим образом:

sudo docker run -t -i -P imagename

Процесс в контейнере прослушивается на 8000.

# netstat -a
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 localhost:8000          *:*                     LISTEN     
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node   Path
# 

На хосте (то есть вне контейнера) я вижу, что порт 49164 связан с контейнером 8000:

[S-22][email protected]:~ $ sudo docker ps 
CONTAINER ID        IMAGE                      COMMAND             CREATED             STATUS              PORTS                     NAMES
0b0e333c6ec9        lkz:latest                 "/bin/bash"         About an hour ago   Up 6 minutes        0.0.0.0:49164->8000/tcp   lkxyz__2015-01-18_202737   
[S-22][email protected]:~ $ 

Inded, docker inspect говорит (между прочим)

"NetworkSettings": {
    "Bridge": "docker0",
    "Gateway": "172.17.42.1",
    "IPAddress": "172.17.0.16",
    "IPPrefixLen": 16,
    "PortMapping": null,
    "Ports": {
        "8000/tcp": [
            {
                "HostIp": "0.0.0.0",
                "HostPort": "49164"
            }
        ]
    }
},

И все же я не могу разговаривать с контейнером. Снаружи

[S-22][email protected]:~ $ telnet localhost 49164
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host.
1,[S-22] [email protected]:~ $ 

внутри,

# telnet localhost 8000
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET /

[18/Jan/2015 23:00:59] "GET /" 200 4066
<!DOCTYPE html>
<html>
<head>
...

Я бы ожидал, что telnet на 49164 снаружи вернет html, как это делается внутри.

Любые предложения?

Ответ 1

Вы, вероятно, хотите, чтобы служба, запущенная в контейнере, слушала 0.0.0.0, а не 127.0.0.1

Ответ 2

Попробуйте подключиться 172.17.0.16:8000 с хоста. У меня была похожая проблема с nginx. Я заменил 127.0.0.1:8000 на 172.17.0.16:8000 внутри контейнера, и у меня это сработало.