networking - redes - que es docker0
El contenedor de Docker se enlaza al puerto, pero no puedo hacer ping (2)
Cuando ejecuta la ventana acoplable en Windows, la construcción es así
Windows machine [
Docker Virtual Box VM [
Container1,
Container2,
...
]
]
Entonces, cuando expone un puerto en su contenedor y lo vincula a todas las direcciones en la máquina host, por ejemplo, usando el parámetro -p
, el puerto se expone en realidad en la caja virtual VM de la ventana acoplable y no en la máquina con Windows.
Digamos por ejemplo que corres
docker run --name MyContainerWithPortExpose -d -p 127.0.0.1:43306:3306 SomeImage:V1
Ejecute un comando netstat
desde el símbolo del sistema de Windows. Extrañamente, no verá el puerto localhost:43306
en el modo LISTEN
Ahora haga un boot2docker ssh
desde su consola boot2docker
para iniciar sesión en la ventana virtual de la boot2docker
acoplable Ejecutar un comando netstat
. Vola ..... encontrará localhost:43306
listado en la caja virtual VM de la localhost:43306
acoplable
Trabajar alrededor de
Una vez en la VM Virtual Box, ejecute un comando ipconfig
y averigüe la dirección IP de la VM. Use esta IP en el comando de ejecución de la ventana acoplable, en lugar de 127.0.0.1
El boot2docker
esta boot2docker
es que su servidor DHCP puede causar estragos al asignar diferentes IP cada vez que inicie la boot2docker
virtual boot2docker
virtual box.
Tengo un contenedor Docker en ejecución (de this imagen). El contenedor parece estar funcionando correctamente por lo que puedo ver (los archivos de registro se ven bien y pueden conectarse a través de SSH al contenedor y usar SQLPlus en su interior). Sin embargo, no puedo conectarme al contenedor desde mi host.
Comencé el contenedor así:
sudo docker run -d -p 49160:22 -p 49161:1521 -p 49162:8080 alexeiled/docker-oracle-xe-11g
He inspeccionado el enlace de puerto por este:
$ sudo docker port <container> 8080
0.0.0.0:49162
Y cuando hago un sudo docker inspect <container>
, obtengo entre otros esto:
"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"
}
]
}
},
Cuando intento hacer ping al contenedor, el contenedor responde:
$ 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
Pero no puedo conectarme desde mi host (Windows) al contenedor Docker . Estoy ejecutando Docker dentro de una máquina virtual Ubuntu 12.04 (en VirtualBox en Windows). No estoy seguro de si es un problema con Docker, con mi VM de Linux o con VirtualBox. Reenvié un montón de puertos en VirtualBox:
Este es el resultado de 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
¿Alguna idea de por qué no puedo conectarme desde Windows a mi contenedor Docker (en ejecución)?
ACTUALIZAR:
La configuración me parece correcta, pero creo que los puertos 49160-49162
deberían estar 49160-49162
a la interfaz IPv4, no a IPv6. Busqué en Google y parece que encontraste un error abierto en la ventana acoplable:
- https://github.com/dotcloud/docker/issues/2174
- https://serverfault.com/questions/545379/docker-will-only-bind-forwarded-ports-to-ipv6-interfaces
Veo dos soluciones a su problema:
- Desactivar completamente IPv6 en Ubuntu VM
- o enlace directamente a la dirección IPv4: -p
172.17.42.1:49162:8080
Responder antes de editar:
No puedes hacer ping a los puertos. Ping está utilizando el protocolo ICMP.
En caso de que no pueda conectarse al puerto publicado, puede verificar si un servicio específico en el contenedor de la ventana acoplable se enlaza con la interfaz de red adecuada (fe 0.0.0.0
) y no con el localhost
. Puede verificar todos los puertos de escucha en el contenedor: netstat -tpla
.