Cuando Docker está instalado, creará automáticamente tres redes, puente (creará un contenedor para conectarse a esta red de forma predeterminada), ninguna, host
Modo de red |
|
---|---|
Anfitrión | El contenedor no virtualizará su propia tarjeta de red, configurará su propia IP, etc., sino que utilizará la IP y el puerto del host. |
Puente | Este modo asignará y establecerá la IP para cada contenedor, conectará el contenedor a un puente virtual docker0 y se comunicará con el host a través del puente docker0 y la configuración de la tabla nat de Iptables. |
Ninguno | Este modo desactiva la función de red del contenedor. |
Envase | El contenedor creado no creará su propia tarjeta de red ni configurará su propia IP, sino que compartirá la IP y el rango de puertos con un contenedor específico. |
1. Red predeterminada
Cuando instale Docker, creará automáticamente tres redes. Puede utilizar el siguiente docker network ls
comando para enumerar estas redes:
Docker construyó estas tres redes, cuando ejecuta el contenedor, puede usar esta –network
marca para especificar qué contenedor debe conectarse a la red.
El representante de la red de puentes docker0Es la red que existe en todas las instalaciones de Docker. A menos que use esta docker run --network=XXX
opción, especifique lo contrario, el demonio Docker predeterminado se conectará a este contenedor de red.
Usamos docker run
al crear un contenedor Docker, puede usar --net
el contenedor especificado de opciones de modo de red, Docker puede tener los siguientes cuatro tipos de modos de red:
- modo de host: uso
--net=host
especificado - modo ninguno: use para
--net=none
especificar - modo puente: utilice
--net=bridge
la configuración predeterminada especificada - modo contenedor: uso
--net=container:NAME_or_ID
especificado
2. Modo anfitrión
Es equivalente al modo puente en VMware. Está en la misma red que la máquina host, pero no tiene una dirección IP separada .
Como todos sabemos, Docker utiliza la tecnología de espacios de nombres de Linux para el aislamiento de recursos, como el proceso de aislamiento del espacio de nombres PID, el sistema de archivos de aislamiento del espacio de nombres de montaje, la red de aislamiento del espacio de nombres de red, etc.
Un espacio de nombres de red proporciona un entorno de red independiente, que incluye tarjetas de red, enrutamiento, reglas Iptable, etc., que están aisladas de otros espacios de nombres de red. A un contenedor Docker generalmente se le asigna un espacio de nombres de red independiente. Pero si se utiliza el modo de host al iniciar el contenedor, el contenedor no obtendrá un espacio de nombres de red independiente, sino que compartirá un espacio de nombres de red con el host. El contenedor no virtualizará su propia tarjeta de red, configurará su propia IP, etc., sino que utilizará la IP y el puerto del host .
Como puede ver, la red del contenedor usa la red del host (aquí está la IP de la intranet de mi Tencent Cloud), pero otros aspectos del contenedor, como el sistema de archivos, la lista de procesos, etc., aún están aislados del host.
3. Modo contenedor
Después de comprender el modo de host, este modo es fácil de comprender. Este modo especifica que el contenedor recién creado comparte un espacio de nombres de red con un contenedor existente en lugar de compartirlo con el host . El contenedor recién creado no creará su propia tarjeta de red, configurará su propia IP, sino que compartirá la IP, el rango de puertos, etc. con un contenedor específico . De manera similar, además de los aspectos de red de los dos contenedores, otras cosas como los sistemas de archivos y las listas de procesos aún están aisladas . Los procesos de los dos contenedores pueden comunicarse a través del dispositivo de tarjeta de red IO.
4. Modo ninguno
Este modo coloca el contenedor en su propia pila de red, pero no realiza ninguna configuración. De hecho, este modo desactiva la función de red del contenedor , que es útil en las dos situaciones siguientes: el contenedor no requiere una red (por ejemplo, solo una tarea por lotes de escritura de volúmenes de disco).
5. Modo puente
Equivalente al modo Nat en VMware, el contenedor utiliza un espacio de nombres de red independiente y está conectado a la tarjeta de red virtual docker0 (modo predeterminado). Comuníquese con el host a través del puente docker0 y la configuración de la tabla nat de Iptables; el modo puente es la configuración de red predeterminada de Docker. Este modo asignará el espacio de nombres de red, establecerá la IP, etc. para cada contenedor y conectará el contenedor Docker en un host a un virtual en el puente. Lo siguiente se centra en este modo.
5.1 Topología del modo puente
Cuando se inicia el servidor Docker, se creará un puente virtual llamado docker0 en el host y el contenedor Docker iniciado en este host se conectará a este puente virtual. El puente virtual funciona como un conmutador físico, de modo que todos los contenedores del host están conectados a una red de capa 2 a través del conmutador . El siguiente paso es asignar una IP al contenedor. Docker seleccionará una dirección IP y una subred diferente del host del segmento de red IP privada definido por RFC1918 y la asignará a docker0. El contenedor conectado a docker0 seleccionará de esta subred. Se utiliza una IP desocupada. Por ejemplo, Docker general usa 172.18.0.0/16 segmento de red y 172.18.0.1/16 asignado a docker0 bridge (en el host que usa el ip addr
comando se puede ver docker0 puede pensar que es una interfaz de administración de puentes, en Usado como una tarjeta de red virtual en el anfitrión).
Esto puede deberse a que mi intranet de Tencent Cloud lo es
172.17.XX.XX
, por lo que, de forma predeterminada, docker0 usa el segmento de red 18
La topología de la red en un entorno autónomo es la siguiente:
5.2 Explicación detallada del modo de red puente
Docker completa el proceso de configuración de red anterior más o menos así:
-
Cree un par de dispositivos de cinco pares de tarjetas de red virtual en el host. Los dispositivos Veth siempre aparecen en pares, forman un canal de datos y los datos ingresan desde un dispositivo y luego salen desde otro dispositivo . Por lo tanto, los cinco dispositivos se utilizan a menudo para conectar dos dispositivos de red.
-
Docker coloca un extremo del dispositivo de par veth en el contenedor recién creado y lo llamó eth0. El otro extremo se coloca en el host, llamado así por un nombre similar como veth5f56268, y este dispositivo de red se agrega al puente docker0, que se puede ver a través del comando brctl show.
[root@VM-0-4-centos ~]# brctl show bridge name bridge id STP enabled interfaces docker0 8000.0242652b8c9d no veth5f56268
-
Asigne una IP al contenedor desde la subred de docker0 y configure la dirección IP de docker0 como la puerta de enlace predeterminada del contenedor.
Ejecute el contenedor:
docker run --name=nginx_bridge --net=bridge -p 80:80 -d nginx
Ver el contenedor:
docker ps
docker inspect nginx_bridge
docker network inspect bridge
6. --enlace
Considere un escenario donde escribimos un microservicio ¿Cómo acceder al contenedor por su nombre para evitar la inaccesibilidad del proyecto debido al cambio de la IP del contenedor?
Podemos usar --link
para resolver
docker run -d -P --name tomcat03 --link tomcat02 tomcat
Sin embargo, esta conexión es unidireccional:
El desarrollo real no usará
--link
7. Red personalizada
Se recomienda utilizar un puente personalizado para controlar qué contenedores pueden comunicarse entre sí, y también puede resolver automáticamente los nombres de los contenedores en direcciones IP a través de DNS. Docker proporciona controladores de red predeterminados para crear estas redes. Puede crear una nueva red Bridge, Overlay o Macvlan. También puede crear un complemento de red o una red remota para una personalización y un control completos.
Puede crear tantas redes como necesite y puede conectar contenedores a cero o más de estas redes en cualquier momento. Además, puede conectar y desconectar contenedores en ejecución en la red sin reiniciar el contenedor. Cuando un contenedor está conectado a varias redes, sus conexiones externas se proporcionan en orden léxico a través de la primera red no interna.
Una red Bridge es el tipo de red más utilizado en Docker. La red puenteada es similar a la red puente predeterminada, pero agrega algunas características nuevas y elimina algunas capacidades antiguas. El siguiente ejemplo crea algunas redes puenteadas y realiza algunos experimentos en contenedores en estas redes.
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
Se crea nuestra propia red:
docker network inspect mynet
Inicie el contenedor con la red creada:
docker run -d -P --name tomcat-net-01 --net mynet tomcat
docker run -d -P --name tomcat-net-02 --net mynet tomcat
Vea la red creada nuevamente:
docker network inspect mynet
En este momento, se puede hacer ping a los dos contenedores
docker run -d -P --name tomcat-net-01 --net mynet tomcat
docker run -d -P --name tomcat-net-01 --net mynet tomcat
¡Los dos contenedores pueden hacer ping entre sí!
8. Conectividad de red
No hay intercomunicación entre los contenedores basados en docker0 y los contenedores basados en mynet, por lo que se requiere conectividad de red, o tomcat como ejemplo:
docker run -d -P --name tomcat01 tomcat
Ahora conecta tomcat01 a mynet
docker network connect mynet tomcat01
Ahora echa un vistazo a mynet
docker network inspect mynet
Un contenedor, 2 IP, similar a un servidor en la nube, con IP pública e IP de intranet
En este punto, puede hacer ping de nuevo
Pero tomcat02 todavía no puede hacer ping: