Контейнер Docker привязывается к порту, но я не могу выполнить его ping

у меня есть работающий контейнер Docker (от этой изображения). Насколько я вижу, контейнер работает правильно (лог-файлы выглядят хорошо и могут подключаться через SSH к контейнеру и использовать SQLPlus внутри него). Однако я не могу подключиться к контейнеру с моего хоста.

Я начал контейнер так:

sudo docker run -d -p 49160:22 -p 49161:1521 -p 49162:8080 alexeiled/docker-oracle-xe-11g

Я проверил привязку порта следующим образом:

$ sudo docker port <container> 8080
0.0.0.0:49162

и когда я делаю sudo docker inspect <container> я получаю среди других это:

"NetworkSettings": {
    "IPAddress": "172.17.0.2",
    "IPPrefixLen": 16,
    "Gateway": "172.17.42.1",
    "Bridge": "docker0",
    "PortMapping": null,
    "Ports": {
        "1521/tcp": [
            {
                "HostIp": "0.0.0.0",
                "HostPort": "49161"
            }
        ],
        "22/tcp": [
            {
                "HostIp": "0.0.0.0",
                "HostPort": "49160"
            }
        ],
        "8080/tcp": [
            {
                "HostIp": "0.0.0.0",
                "HostPort": "49162"
            }
        ]
    }
},

когда я пытаюсь пинговать контейнер, контейнер отвечает:

$ ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_req=1 ttl=64 time=0.138 ms
64 bytes from 172.17.0.2: icmp_req=2 ttl=64 time=0.132 ms

но я не могу подключиться с моего хоста (Windows) к контейнеру Docker. Я запускаю Docker внутри виртуальной машины Ubuntu 12.04 (в VirtualBox в Windows). Я не уверен, что это проблема с Docker, с моей виртуальной машиной Linux или с VirtualBox. Я переслал кучу портов в VirtualBox:

enter image description here

это результат sudo netstat -tpla:

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 *:sunrpc                *:*                     LISTEN      542/rpcbind
tcp        0      0 *:ssh                   *:*                     LISTEN      1661/sshd
tcp        0      0 *:51201                 *:*                     LISTEN      831/rpc.statd
tcp        0     80 docker:ssh              10.0.2.2:62220          ESTABLISHED 1902/sshd: vagrant
tcp6       0      0 [::]:49160              [::]:*                  LISTEN      2388/docker
tcp6       0      0 [::]:49161              [::]:*                  LISTEN      2388/docker
tcp6       0      0 [::]:56105              [::]:*                  LISTEN      831/rpc.statd
tcp6       0      0 [::]:49162              [::]:*                  LISTEN      2388/docker
tcp6       0      0 [::]:sunrpc             [::]:*                  LISTEN      542/rpcbind
tcp6       0      0 [::]:ssh                [::]:*                  LISTEN      1661/sshd

есть идеи, почему я не могу подключиться из Windows к моему (работающему) контейнеру Docker?

2 ответов


обновление:

ваша конфигурация кажется мне нормальной, но я думаю, что порты 49160-49162 должны быть привязаны к интерфейсу IPv4, а не IPv6. Я погуглил это, и кажется, что вы столкнулись с открытой ошибкой в docker:

Я вижу два решения вашей проблемы:

  1. полностью отключить IPv6 на Ubuntu VM
  2. или bind напрямую на IPv4-адрес: - p 172.17.42.1:49162: 8080

ответ до редактирования:

вы не можете пинговать порты. Ping использует протокол ICMP.

Если вы не можете подключиться к опубликованному порту, вы можете проверить, привязывается ли конкретная служба в контейнере docker к соответствующему сетевому интерфейсу (f.e. 0.0.0.0) и не локальный хост. Вы можете проверить все прослушивающие порты в контейнере:netstat -tpla.


когда вы запускаете docker в windows, конструкция выглядит так

Машина Windows [
  Настройки виртуальной машины виртуальной окне [
    Контейнер1,
    Container2,
    ...
  ]
]

Поэтому, когда вы предоставляете порт в контейнере и привязываете его ко всем адресам на хост-машине, используя параметр "- p", порт фактически предоставляется в виртуальной машине docker, а не на машине windows.

Скажем, например, вы запустить
  docker run --name MyContainerWithPortExpose-d-p 127.0.0.1:43306: 3306 SomeImage: V1

Выполните команду netstat из командной строки windows. Как ни странно, вы не увидите localhost: 43306 порт в режиме прослушивания

Теперь сделайте "boot2docker ssh" из консоли boot2docker, чтобы войти в виртуальную коробку docker VM
Запустить команду netstat. Vola..... вы найдете localhost: 43306, указанный в виртуальном окне docker VM

Обходной :
После того, как в виртуальном окне VM, запустите команду ipconfig и узнать IP-адрес виртуальной машины. Используйте этот IP в команде run docker вместо 127.0.0.1
Недостатком этой работы является то, что ваш DHCP-сервер может иногда играть в хаос, назначая разные IP-адреса при каждом запуске виртуальной машины boot2docker.