Comparar el rendimiento y el comportamiento de las redes
Ahora, ejecutemos algunas pruebas para ver las diferencias prácticas entre la red de puente (bridge) y la red del anfitrión (host) en Docker.
Probar el rendimiento de la red
Primero, creemos un contenedor con red de puente y otro con red del anfitrión, y luego comparemos su rendimiento.
- Detengamos y eliminemos el contenedor nginx anterior:
docker stop nginx-host
docker rm nginx-host
- Creemos un nuevo contenedor con red de puente para probar el rendimiento:
docker run --name bridge-test -d --network bridge nginx:alpine
- Creemos otro contenedor con red del anfitrión:
docker run --name host-test -d --network host nginx:alpine
- Usemos
docker exec
para ejecutar una simple prueba de red en cada contenedor:
Para el contenedor con red de puente:
docker exec bridge-test sh -c "time wget -q -O /dev/null http://google.com"
Para el contenedor con red del anfitrión:
docker exec host-test sh -c "time wget -q -O /dev/null http://google.com"
Comparemos los tiempos de ejecución. Por lo general, el contenedor con red del anfitrión tendrá un rendimiento ligeramente mejor porque evita la capa de red adicional.
Examinar las interfaces de red
Examinemos las interfaces de red en ambos contenedores:
- Para el contenedor con red de puente:
docker exec bridge-test ip addr show
Verás que este contenedor tiene sus propias interfaces de red, aisladas del anfitrión.
- Para el contenedor con red del anfitrión:
docker exec host-test ip addr show
Notarás que este contenedor tiene exactamente las mismas interfaces de red que el sistema anfitrión, incluyendo todas las interfaces de red físicas.
- Comparemos con las interfaces de red del anfitrión:
ip addr show
Las interfaces del contenedor con red del anfitrión deben coincidir con las del sistema anfitrión.
Comprender los conflictos de puertos
Al usar la red del anfitrión, pueden producirse conflictos de puertos si el contenedor intenta utilizar puertos que ya están en uso en el anfitrión:
- Detengamos y eliminemos todos los contenedores en ejecución:
docker stop bridge-test host-test
docker rm bridge-test host-test
- Iniciemos un servicio en el anfitrión utilizando el puerto 8080:
python3 -m http.server 8080 &
- Ahora, intentemos ejecutar un contenedor con red del anfitrión que también quiera utilizar el puerto 8080:
docker run --name conflict-test --network host -d -p 8080:80 nginx:alpine
Deberías ver un error porque el puerto 8080 ya está en uso en el anfitrión.
- Limpiemos el servidor HTTP de Python:
kill %1
Esto demuestra una desventaja potencial de la red del anfitrión: debes ser consciente de los conflictos de puertos con el anfitrión.