[Docker] notas de estudio (dos)

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
Introducción
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 lscomando para enumerar estas redes:

Inserte la descripción de la imagen aquí

Docker construyó estas tres redes, cuando ejecuta el contenedor, puede usar esta –networkmarca 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=XXXopción, especifique lo contrario, el demonio Docker predeterminado se conectará a este contenedor de red.

Inserte la descripción de la imagen aquí

Usamos docker runal crear un contenedor Docker, puede usar --netel contenedor especificado de opciones de modo de red, Docker puede tener los siguientes cuatro tipos de modos de red:

  • modo de host: uso --net=hostespecificado
  • modo ninguno: use para --net=noneespecificar
  • modo puente: utilice --net=bridgela configuración predeterminada especificada
  • modo contenedor: uso --net=container:NAME_or_IDespecificado

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 .

Inserte la descripción de la imagen aquí

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 addrcomando 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:

Inserte la descripción de la imagen aquí

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í:

  1. 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.

  2. 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
    
  3. 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
    

    Inserte la descripción de la imagen aquí

    docker inspect nginx_bridge
    

    Inserte la descripción de la imagen aquí

    docker network inspect bridge
    

    Inserte la descripción de la imagen aquí

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?

Inserte la descripción de la imagen aquí

Podemos usar --linkpara resolver

docker run -d -P --name tomcat03 --link tomcat02 tomcat

Inserte la descripción de la imagen aquí

Sin embargo, esta conexión es unidireccional:

Inserte la descripción de la imagen aquí

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

Inserte la descripción de la imagen aquí

Se crea nuestra propia red:

docker network inspect mynet

Inserte la descripción de la imagen aquí

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

Inserte la descripción de la imagen aquí

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

Inserte la descripción de la imagen aquí

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

Inserte la descripción de la imagen aquí

Pero tomcat02 todavía no puede hacer ping:

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/dreaming_coder/article/details/113881431
Recomendado
Clasificación