Контейнер-докер привязывается к порту, но я не могу его пронести

У меня есть работающий контейнер 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 контейнер, контейнер отвечает:

$ 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 VM или с 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?

Ответы

Ответ 1

UPDATE:

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

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

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

Ответ перед редактированием:

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

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

Ответ 2

Когда вы запускаете docker в windows, конструкция выглядит так:
Windows-машина [
  Docker Virtual Box VM [
    container1,
    container2,
     ...
   ]
]

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

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

Запустите команду netstat из командной строки Windows. Странно вы не увидите локальный хост: 43306 порт в режиме LISTEN

Теперь сделайте "boot2docker ssh" из консоли boot2docker, чтобы войти в виртуальную виртуальную коробку docker


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


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