networking - same - Docker 1.10 IP del contenedor en LAN
docker network inspect (6)
Desde Docker 1.10 (y la actualización de libnetwork) podemos dar manualmente una IP a un contenedor dentro de una red definida por el usuario, ¡y eso es genial!
Quiero darle a un contenedor una dirección IP en mi LAN (como podemos hacer con las máquinas virtuales en modo "puente"). Mi LAN es 192.168.1.0/24, todas mis computadoras tienen direcciones IP en su interior. Y quiero que mis contenedores tengan direcciones IP en este rango, para poder acceder a ellos desde cualquier lugar de mi LAN (sin NAT / PAT / etc ...).
Obviamente, leí la publicación del blog de Jessie Frazelle y muchos otros publicaron aquí y en todas partes, como:
- ¿Cómo configurar el iP de un contenedor docker?
- ¿Cómo asignar IP específica al contenedor y hacer que sea accesible fuera del host de VM?
y mucho más, pero nada salió; mis contenedores aún tienen direcciones IP "dentro" de mi host docker, y no están disponibles para otras computadoras en mi LAN.
Al leer la publicación del blog de Jessie Frazelle, pensé (ya que ella usa IP pública) que podemos hacer lo que yo quiero hacer.
Edit : De hecho, si hago algo como:
network create --subnet 192.168.1.0/24 --gateway 192.168.1.1 homenet
docker run --rm -it --net homenet --ip 192.168.1.100 nginx
La nueva interfaz en el host de la ventana acoplable (br- [a-z0-9] +) toma la IP ''--gateway'', que es la IP de mi enrutador. Y la misma IP en dos computadoras en la red ... BOOM
Gracias por adelantado.
Aquí hay un ejemplo del uso de macvlan. Inicia un servidor web en http://10.0.2.1/ .
Estos comandos y el archivo Docker Compose funcionan en QNAP y en la Container Station de QNAP. Observe que la interfaz de red de QNAP es qvs0
.
Comandos:
La publicación del blog " Using Docker macvlan networks " [1] [2] de Lars Kellogg-Stedman explica qué significan los comandos.
docker network create -d macvlan -o parent=qvs0 --subnet 10.0.0.0/8 --gateway 10.0.0.1 --ip-range 10.0.2.0/24 --aux-address "host=10.0.2.254" macvlan0
ip link del macvlan0-shim link qvs0 type macvlan mode bridge
ip link add macvlan0-shim link qvs0 type macvlan mode bridge
ip addr add 10.0.2.254/32 dev macvlan0-shim
ip link set macvlan0-shim up
ip route add 10.0.2.0/24 dev macvlan0-shim
docker run --network="macvlan0" --ip=10.0.2.1 -p 80:80 nginx
Docker componer
Use la versión 2 porque la versión 3 no admite las otras configuraciones de red, como gateway
, ip_range
y aux_address
.
version: "2.3"
services:
HTTPd:
image: nginx:latest
ports:
- "80:80/tcp"
- "80:80/udp"
networks:
macvlan0:
ipv4_address: "10.0.2.1"
networks:
macvlan0:
driver: macvlan
driver_opts:
parent: qvs0
ipam:
config:
- subnet: "10.0.0.0/8"
gateway: "10.0.0.1"
ip_range: "10.0.2.0/24"
aux_address: "host=10.0.2.254"
Docker ahora es compatible con los controladores de red Macvlan e IPvlan . La documentación de Docker para ambos controladores de red se puede encontrar here .
Con ambos controladores, puede implementar el escenario deseado (configurar un contenedor para que se comporte como una máquina virtual en modo puente):
Macvlan : permite que una única interfaz de red física (dispositivo maestro) tenga un número arbitrario de dispositivos esclavos, cada uno con sus propias direcciones MAC.
Requiere el kernel de Linux v3.9–3.19 o 4.0+.
IPvlan : le permite crear una cantidad arbitraria de dispositivos esclavos para su dispositivo maestro que comparten la misma dirección MAC.
Requiere el kernel de Linux v4.2 + (existe soporte para los kernels anteriores, pero está defectuoso).
Consulte el CÓMO del controlador IPVLAN de kernel.org para obtener más información.
La conectividad del contenedor se logra al colocar uno de los dispositivos esclavos en el espacio de nombres de la red del contenedor que se va a configurar. Los dispositivos maestros permanecen en el sistema operativo host (espacio de nombres predeterminado).
Como regla general, debe usar el controlador IPvlan si el host de Linux que está conectado al conmutador / enrutador externo tiene una política configurada que permite solo un MAC por puerto. ¡Ese es a menudo el caso en los entornos VMWare ESXi!
Otra cosa importante para recordar (Macvlan e IPvlan): el tráfico hacia y desde el dispositivo maestro no se puede enviar hacia y desde los dispositivos esclavos. Si necesita habilitar la comunicación maestro a esclavo, consulte la sección " Comunicación con el host (default-ns) " en el documento " IPVLAN - El comienzo " publicado por uno de los autores de IPvlan (Mahesh Bandewar).
Es posible mapear una interfaz física en un contenedor a través de pipework
.
Conectar un contenedor a una interfaz física local
pipework eth2 $(docker run -d hipache /usr/sbin/hipache) 50.19.169.157/24
pipework eth3 $(docker run -d hipache /usr/sbin/hipache) 107.22.140.5/24
Puede haber una forma nativa ahora, pero no he investigado eso para la versión 1.10.
Ya no recomendé esta solución. Así que ha sido eliminado. Estaba usando bridge driver y brctrl .
Hay un conductor mejor y oficial ahora. Vea otra respuesta en esta página: https://.com/a/36470828/287510
Utilice el controlador oficial Docker:
A partir de Docker v1.12.0-rc2 , el nuevo controlador MACVLAN ahora está disponible en una versión oficial de Docker:
- El controlador de MacVlan está fuera de experimental #23524
Estos nuevos controladores han sido bien documentados por el autor (es), con ejemplos de uso .
Al final del día, debe proporcionar una funcionalidad similar, ser más fácil de configurar y con menos errores / otras peculiaridades.
Viendo los contenedores en el host Docker:
La única advertencia con el nuevo controlador oficial de macvlan es que la máquina host de la ventana acoplable no puede ver / comunicarse con sus propios contenedores. Lo que podría ser deseable o no, dependiendo de su situación específica.
Este problema puede solucionarse si tiene más de 1 NIC en su máquina host docker. Y ambas NIC están conectadas a su LAN. Entonces, puede: A) dedicar 1 de los hosts de su docker 2 nics para ser exclusivamente para docker. Y utilice el código restante para que el host acceda a la LAN.
O B) agregando rutas específicas solo a aquellos contenedores a los que necesita acceder a través de la 2da NIC. Por ejemplo:
sudo route add -host $container_ip gw $lan_router_ip $if_device_nic2
El método A) es útil si desea acceder a todos sus contenedores desde el servidor de la ventana acoplable y tiene varios enlaces conectados por cable.
El método B) es útil si solo requiere acceso a algunos contenedores específicos desde el host de la ventana acoplable. O si su 2da NIC es una tarjeta wifi y sería mucho más lenta para manejar todo el tráfico de su LAN. Por ejemplo, en una computadora portátil.
Instalación:
Si no puede ver el candidato pre-release -rc2
en ubuntu 16.04, agregue o modifique temporalmente esta línea a su /etc/apt/sources.list para decir:
deb https://apt.dockerproject.org/repo ubuntu-xenial testing
En lugar de main
(que es lanzamientos estables).
EDIT: esta solución es ahora inútil. Desde la versión 1.12, Docker proporciona dos controladores de red: macvlan e ipvlan. Permiten asignar IP estática desde la red LAN. Vea la respuesta a continuación .
Después de buscar personas que tienen el mismo problema , fuimos a una solución:
Resumir :
- (V) LAN es 192.168.1.0/24
- La puerta de enlace predeterminada (= enrutador) es 192.168.1.1
- Hosts de Dockers múltiples
- Nota: tenemos dos NIC: eth0 y eth1 (que está dedicado a Docker)
Qué queremos :
Queremos tener contenedores con ip en la red 192.168.1.0/24 (como computadoras) sin NAT / PAT / translation / port-forwarding / etc ...
Problema
Al hacer esto:
network create --subnet 192.168.1.0/24 --gateway 192.168.1.1 homenet
podemos dar a los contenedores la IP que queremos, pero el puente creado por la br-[a-z0-9]+
acoplable ( br-[a-z0-9]+
) tendrá la IP 192.168.1.1, que es nuestro enrutador.
Solución
1. Configure la red Docker
Utilice el parámetro DefaultGatewayIPv4
:
docker network create --subnet 192.168.1.0/24 --aux-address "DefaultGatewayIPv4=192.168.1.1" homenet
De manera predeterminada, Docker le dará a la interfaz del puente ( br-[a-z0-9]+
) la primera IP, que ya podría haber sido tomada por otra máquina. La solución es usar el parámetro --gateway
para decirle a la --gateway
acoplable que asigne una IP arbitraria (que está disponible):
docker network create --subnet 192.168.1.0/24 --aux-address "DefaultGatewayIPv4=192.168.1.1" --gateway=192.168.1.200 homenet
Podemos especificar el nombre del puente agregando -o com.docker.network.bridge.name=br-home-net
al comando anterior.
2. ¡Puente el puente!
Ahora tenemos un puente ( br-[a-z0-9]+
) creado por Docker. Necesitamos conectarlo a una interfaz física (en mi caso tengo que usar NIC, así que estoy usando eth1 para eso):
brctl addif br-home-net eth1
3. Borrar el puente IP
Ahora podemos eliminar la dirección IP del puente, ya que no necesitamos una:
ip a del 192.168.1.200/24 dev br-home-net
La IP 192.168.1.200
se puede usar como puente en varios hosts de docker, ya que no la usamos y la eliminamos.