network - Darle a un contenedor de docker una dirección IP enrutable
docker-machine ip (2)
Estoy ejecutando esto en ubuntu 14.04 y he establecido docker0
en una IP estática que luego se enruta desde la IP pública a través del firewall. Estoy tratando de configurar mi API de backend para que se ejecute en un contenedor acoplable y me confunden un par de cosas.
1.) ¿Cómo docker0
la ip de docker0
la ip del contenedor de modo que docker0
sabría enviar los paquetes entrantes al contenedor (dinámicamente si es posible)?
2.) Si no lo hice de esa manera, ¿cómo podría hacerlo para no tener que configurarlo cada vez que haga una nueva corrida de ese contenedor acoplable?
¡Gracias por adelantado!
Recientemente tuve el mismo problema y lo resolví usando Network Containers :
- Comience mi contenedor de ''servicio'' que quiero que esté disponible en la IP pública
- Cree un nuevo contenedor de "red" que esté vinculado con el contenedor de servicio y enrute a los puertos expuestos por el contenedor de servicio. Este contenedor tendrá una interfaz de red adicional puenteada con el host para que pueda adquirir una IP de DHCP.
- Cree un puente de red desde el host Docker hasta el contenedor utilizando Pipework de jpetazzo ( https://github.com/jpetazzo/pipework )
- El contenedor de red adquiere una dirección de DHCP.
A partir de este momento, el contenedor de red estará disponible en la red y enrutará los puertos al contenedor de servicio. La principal ventaja es que el contenedor de "servicio" no tiene que saber nada acerca de la IP pública, DHCP, etc. De esta forma, todos los contenedores en ejecución se pueden hacer públicos en la red.
Para mayor comodidad, creé un script que hace todo esto a la vez. Hacer que un contenedor en ejecución esté disponible en una IP pública es tan simple como:
create-network-container.sh webserver ens32
En este caso, necesitaría tener un contenedor en ejecución llamado ''servidor web'', y una interfaz de red en el servidor ''ens32''. La interfaz es necesaria para crear el puente en el contenedor de red.
El script, información más detallada y ejemplos están disponibles en: https://github.com/jeroenpeeters/docker-network-containers
Supongo que quiere tener una IP asignada a su contenedor de docker fuera de la ventana acoplable.
Primero, cree una nueva IP y asígnela a la interfaz de su host (suponemos que su interfaz se llama eth0.
$> ip addr add 10.0.0.99/8 dev eth0
Ahora, cuando abras el contenedor, especifica esa dirección y vincúlala al contenedor de tu docker:
$> docker run -i -t --rm -p 10.0.0.99:80:8080 base
El argumento -p hará que Docker cree una regla NAT de iptables que transmitirá todo el tráfico que coincida con el destino 10.0.0.99:80 a su contenedor de docker en el puerto 8080.
Si necesita automatizar el proceso y escalarlo, consulte este recurso: https://github.com/jpetazzo/pipework
La documentación del docker es un buen comienzo: https://docker.github.io/engine/userguide/networking/