Контейнер 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:
это результат 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:
- https://github.com/dotcloud/docker/issues/2174
- https://serverfault.com/questions/545379/docker-will-only-bind-forwarded-ports-to-ipv6-interfaces
Я вижу два решения вашей проблемы:
- полностью отключить IPv6 на Ubuntu VM
- или 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.