Docker - red de contenedores

I. Descripción general

La IP del contenedor cambiará cada vez que se reinicie el contenedor Docker.

Esto también significa que si los contenedores usan direcciones IP para comunicarse, una vez que se reinicia un contenedor, ya no será accesible.

La red Docker puede solucionar este problema.

La red Docker tiene principalmente las dos funciones siguientes:

Interconexión y comunicación entre contenedores y mapeo portuario.

Cuando la IP del contenedor cambia, la comunicación directa de red se puede realizar a través del nombre del servicio sin verse afectada.

Por lo tanto, siempre que los contenedores estén en la misma red Docker, pueden usar el nombre del servicio para acceder directamente sin preocuparse por reiniciar.

Este es también el escenario de aplicación más básico y comúnmente utilizado de la red Docker.

2. Principio de implementación de la red Docker

  1. Docker utiliza el puente de Linux para virtualizar un puente de contenedor acoplable (docker0) en la máquina host
  2. Cuando Docker inicia un contenedor, asignará una dirección IP al contenedor según el segmento de red del puente de Docker, llamado Container-IP.
  3. Al mismo tiempo, el puente Docker es la puerta de enlace predeterminada para cada contenedor. Debido a que todos los contenedores en el mismo host están conectados al mismo puente de red, los contenedores pueden comunicarse directamente a través de la IP del contenedor del contenedor.

El puente acoplable está virtualizado por el host y no es un dispositivo de red real. No puede ser direccionado por la red externa, lo que también significa que la red externa no puede acceder directamente al contenedor a través de Container-IP. Si se quiere acceder al contenedor desde el exterior, se puede habilitar asignando el puerto del contenedor al host (mapeo de puerto), es decir, cuando Docker Run crea el contenedor, se pasa el parámetro -p o -P. Al acceder al contenedor, acceda al contenedor a través de [IP del host]: [Puerto del contenedor].

2. Los cuatro modos de red de Docker

2. Los cuatro modos de red de Docker

Modo de red Método de especificación de comando describir
puente –puente de red En el puente virtual docker0, este también es el modo de red predeterminado
anfitrión –host de red El contenedor no crea su propia tarjeta de red, no configura IP, etc., sino que utiliza la IP y el puerto del host.
envase -red Nombre o ID del contenedor. El contenedor recién 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.
ninguno –red ninguna El contenedor tiene un espacio de nombres de red independiente, pero no se le ha establecido ninguna configuración de red.

Si cree que –network es demasiado larga, también puede utilizar la abreviatura -net, el efecto es el mismo

Cuando se completa la instalación de Docker, generalmente se crearán automáticamente tres redes:

NETWORK ID          NAME                DRIVER              SCOPE
40547f9137a5        bridge              bridge              local
b40bdb8f0356        host                host                local
0c7f9938f868        none                null                local

Puede utilizar el siguiente comando para ver:

docker network ls

2.1 Modo puente – puente

Cuando se inicia el servicio Docker, se creará un puente llamado docker0 de forma predeterminada (con una interfaz interna llamada docker0).

El nombre de la red puente es docker0, que conecta otras tarjetas de red físicas o virtuales en la capa del kernel, lo que coloca todos los contenedores y hosts locales en la misma red física.

Docker especificará la dirección IP y la máscara de subred de docker0 de forma predeterminada para que el host y el contenedor puedan comunicarse entre sí a través de un puente de red.

1) Diagrama esquemático del modo puente

Insertar descripción de la imagen aquí

2) Análisis del modo puente

Docker utiliza puentes de Linux para virtualizar un puente de contenedor Docker (docker0) en la máquina host.

Cada vez que Docker inicia un contenedor, asignará una dirección IP al contenedor según el segmento de red del puente Docker.

Al mismo tiempo, el puente Docker es la puerta de enlace predeterminada para cada contenedor.

Todos los contenedores en el mismo host están conectados al mismo puente de red, de modo que los contenedores pueden comunicarse directamente a través de la IP del contenedor del contenedor.

Cuando Docker Run crea un contenedor, el modo de red predeterminado para contenedores que no especifican una red es puente y se utiliza docker0.

En el host ifconfig, puedes ver docker0 y la red que creaste:

eth0, eth1... representa la tarjeta de red uno, tarjeta de red dos...
lo representa 127.0.0.1 (localhost)
inet addr representa la dirección IP de la tarjeta de red
. Bridge docker0 creará un par de interfaces de dispositivos virtuales pares: una es llamado veth, el otro se llama eth0, Coincidencia en pares.

El modo puente de todo el host es docker0, similar a un conmutador con un montón de interfaces, cada interfaz se llama veth.

Cree una interfaz virtual en el host local y el contenedor respectivamente, y déjelos comunicarse entre sí (este par de interfaces se denomina par quinto);

Cada instancia de contenedor también tiene una tarjeta de red en su interior y cada interfaz se llama eth0;

Cada veth en docker0 coincide con eth0 dentro de una determinada instancia de contenedor, emparejada en pares.

2.2 Modo anfitrión –anfitrión

No se crea ninguna interfaz de red y la dirección IP del host se utiliza directamente para comunicarse con el mundo exterior y no se requiere ninguna conversión NAT adicional.

No se puede publicar el puerto en modo host.

1) Diagrama esquemático del modo host

Insertar descripción de la imagen aquí

2) Análisis del modo host

El contenedor no obtendrá un espacio de nombres de red independiente, pero compartirá el mismo espacio de nombres de red con el host.

El contenedor no virtualizará su propia tarjeta de red, sino que utilizará la IP y el puerto del host.

El contenedor comparte la IP de la red del host, la ventaja de esto es que el host externo y el contenedor pueden comunicarse directamente.

  • Pequeña expansión:

Especifique –network=host o -net=host al iniciar Docker. Si también se especifica -p puerto de mapeo, aparecerá la siguiente advertencia:

NARNING: Los puertos publicados se descartan cuando se utiliza el modo de red host

Y los parámetros establecidos por -p no jugarán ningún papel: el número de puerto se basará en el número de puerto del host y se incrementará cuando se repita. Puede optar por ignorar esta advertencia o utilizar otros modos de red de Docker, como --network=bridge

2.3 Modo contenedor –contenedor

1) Diagrama esquemático del patrón de contenedor

Insertar descripción de la imagen aquí

2) Análisis del modo contenedor

El nuevo contenedor comparte una configuración IP de red con un contenedor existente en lugar de con el host.

El contenedor recién creado no creará su propia tarjeta de red ni configurará su propia IP, sino que compartirá la IP, el rango de puertos, etc. con un contenedor específico.

Además de la red, los dos contenedores están aislados en otros aspectos como sistemas de archivos, listas de procesos, etc.

2.4 modo ninguno

En el modo Ninguno, no se realiza ninguna configuración de red para el contenedor Docker.

En otras palabras, este contenedor Docker no tiene tarjeta de red, IP, enrutamiento y otra información, sino solo una interfaz lo.

El logo lo significa deshabilitar la función de red, es decir: 127.0.0.1, que significa loopback local

Necesitamos agregar tarjetas de red, configurar IP, etc. al contenedor Docker nosotros mismos.
Insertar descripción de la imagen aquí

3. Comandos de uso común

Antes de aprender varios modos de red Docker, primero debe comprender los comandos comunes de la red Docker.

2.1 Ver red

docker network ls

2.2 Crear una red

# 基础用法
docker network create 网络名称

# 创建网络时是可以添加一系列参数的:
# --driver:驱动程序类型
# --gateway:主子网的IPV4和IPV6的网关
# --subnet:代表网段的CIDR格式的子网
# mynet:自定义网络名称
docker network create --driver=bridge --gateway=192.168.137.1 --subnet=192.168.137.0/16 mynet

Cuando no se especifican opciones, el controlador predeterminado (modo de red) también es puente (puente), pero la puerta de enlace y la subred se generarán automáticamente.

2.3 Ver fuentes de datos de red

docker network inspect 网络名称 

2.4 Conecte el contenedor a la red especificada

docker network connect 网络名称 容器名称

2.5 Desconectar el contenedor de la red

docker network disconnect 网络名称 容器名称

2.6 Eliminar todas las redes que ya no están en uso

docker network prune

2.7 Eliminar una o más redes

docker network rm 网络名称 

4. Ejemplos de uso

4.1 Montar la red al crear el contenedor

1) Crear una red tipo puente

docker network create --driver=bridge --gateway=192.168.137.1 --subnet=192.168.137.0/16 myNet1

2) Especifique la red al crear y ejecutar el contenedor.

docker run --name containerName -p 80:80 -d --network myNet1 myNginx

3) Puedes desconectarte de la red cuando no quieras usarla

docker network disconnect myNet1 myNginx

4.2 Conectarse a una nueva red cuando el contenedor ya existe

1) Crear una red tipo puente

docker network create --driver=bridge --gateway=192.168.137.1 --subnet=192.168.137.0/16 myNet2

2) Conecte el contenedor a una nueva red.

# 执行后myNginx容器的网络就变成了myNet2
docker network connect myNet2 myNginx

3) Puedes desconectarte de la red cuando no quieras usarla

docker network disconnect myNet2 myNginx

4.3 Utilice docker-compose para montar la red en un grupo de contenedores

Existe el siguiente archivo docker-compose.yml.
En términos generales, cuando utiliza el siguiente comando para organizar un grupo de contenedores, se creará una red de forma predeterminada y todos los contenedores de este grupo se agregarán a la red.

docker-compose up -d

Esta es también la razón por la que este grupo de contenedores puede utilizar directamente nombres de servicios para comunicarse directamente.

version: '3'
services:
  nginx:
    image: nginx:alpine
    container_name: nginx-dev
    environment:
      - TZ=Asia/Shanghai
    ports:
      - "80:80"
    volumes:
      - /usr/local/docker/workspace/nginx/html:/usr/share/nginx/html
      - /usr/local/docker/workspace/nginx/conf/nginx.conf:/etc/nginx/conf.d/default.conf
      
  mysql:
    image: mysql:8
    container_name: mysql-dev
    environment:
      - TZ=Asia/Shanghai
      - MYSQL_ROOT_PASSWORD=89225300
      - MYSQL_DATABASE=nacos_config
      - MYSQL_USER=gddst
      - MYSQL_PASSWORD=123456
    ports:
      - "3306:3306"
    volumes:
      - /usr/docker/docker/workspace/mysql/data:/var/lib/mysql
      - /usr/docker/docker/workspace/mysql/mysql.cnf:/etc/mysql/conf.d/mysql.cnf
      - /usr/docker/docker/workspace/mysql/initdb:/docker-entrypoint-initdb.d

Pero si desea mostrar la red especificada, puede consultar la siguiente configuración:

networks:
  mynet:
    driver: bridge
    ipam:
      config:
        - subnet: "192.168.0.101/16"
          gateway: 192.168.0.100

Después de configurar la red, puede especificar la red que se utilizará en cada servicio. Aquí está nginx como ejemplo:

version: '3'
services:
  nginx:
    image: nginx:alpine
    container_name: nginx-dev
    environment:
      - TZ=Asia/Shanghai
    ports:
      - "80:80"
    volumes:
      - /usr/local/docker/workspace/nginx/html:/usr/share/nginx/html
      - /usr/local/docker/workspace/nginx/conf/nginx.conf:/etc/nginx/conf.d/default.conf
    networks:
      - mynet
      
networks:
  mynet:
    driver: bridge
    ipam:
      config:
        - subnet: "192.168.0.101/16"
          gateway: 192.168.0.100

De esta manera, al organizar contenedores, todos los contenedores se unirán a la red personalizada mynet.

5. Mapeo de puertos de red Docker

En Docker, el mapeo de redes internas y externas es un concepto muy importante. Este artículo le presentará cómo asignar la intranet y la red externa en Docker. En Docker, cada contenedor tiene su propia dirección IP. Esta dirección IP se usa internamente dentro de Docker y no se puede acceder a ella directamente desde el exterior. Sin embargo, para que las aplicaciones que se ejecutan dentro de un contenedor sean accesibles a través de la red, necesitamos mapear los puertos del contenedor.

Para el mapeo de intranet, podemos usar la función de mapeo de puertos de Docker. Esta función puede asignar el puerto del host al puerto del contenedor, de modo que se pueda acceder a la aplicación que se ejecuta en el contenedor desde la red del host. Por ejemplo, podemos usar el siguiente comando para asignar el puerto 8080 del host al puerto 80 del contenedor:

docker run -p 8080:80 nginx

Este comando iniciará un contenedor NGINX y asignará su puerto 80 al puerto 8080 del host. Ahora podemos acceder a NGINX que se ejecuta en el contenedor a través de http://localhost:8080 en el navegador del host.

Además, al realizar el mapeo de la intranet, también debemos prestar atención al firewall dentro del contenedor. En algunos casos, es necesario abrir un puerto dentro del contenedor para acceder a la aplicación dentro del contenedor . Por ejemplo, podemos usar el siguiente comando dentro del contenedor: comando de parámetro expose para abrir el puerto del contenedor y exponer 80
http://<host IP>:80 para acceder al servidor que se ejecuta en el contenedor.

6. cortafuegos acoplable

Los firewalls de Docker se utilizan a menudo para proteger las aplicaciones en contenedores Docker de ataques maliciosos. Los firewalls mantienen la seguridad de las aplicaciones filtrando el tráfico de red entrante y saliente. En Docker, las reglas relacionadas con el firewall se implementan en función de iptables. Por lo tanto, debe conocer los conocimientos relevantes de iptables antes de utilizar el firewall Docker.
El archivo de configuración principal daemon.json en el firewall Docker.

/etc/docker/daemon.json
/etc/docker/conf.d/daemon.json

En este archivo de configuración, puede definir reglas de firewall y el comportamiento predeterminado del firewall. A continuación se muestran algunas configuraciones de uso común:

{
    "iptables": false,
    "ip-masq": true,
    "iptables-snat": true
}

En el archivo de configuración anterior, "iptables": false significa desactivar iptables, mientras que las otras dos opciones son configuraciones para habilitar la función iptables.

Construyendo un firewall Docker

Los pasos para construir un firewall Docker son los siguientes:

1. Instalar iptables

Primero, necesitas instalar iptables, puedes usar el siguiente comando para instalarlo:

sudo apt-get instalar iptables

2. Configurar reglas de iptables

A continuación, debe configurar las reglas de iptables para garantizar que las aplicaciones en los contenedores Docker puedan ejecutarse de forma segura. Aquí hay un ejemplo simple de una regla de iptables:

# 允许从所有地址接受TCP和UDP连接
iptables -A INPUT -p tcp -j ACCEPT
iptables -A INPUT -p udp -j ACCEPT

# 允许从特定地址接受SSH连接
iptables -A INPUT -p tcp -s 192.168.0.1 --dport 22 -j ACCEPT

# 允许从特定地址通过HTTP访问
iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 80 -j ACCEPT

# 默认设置为DROP
iptables -P INPUT DROP
iptables -P FORWARD DROP

3. Agregue reglas a daemon.json

Antes de agregar reglas al archivo daemon.json, debe confirmar que el comportamiento predeterminado del firewall es correcto. Normalmente, se recomienda utilizar el comportamiento predeterminado de iptables, DROP.

A continuación, debe agregar reglas de iptables al archivo daemon.json:

{
    "iptables": true,
    "iptables-forward": true,
    "iptables-default": "DROP",
    "iptables-nat": false,
    "iptables-filter": [
        {
            "name": "allow-all",
            "rule": [
                "-j ACCEPT"
            ],
            "chain": "DOCKER-USER"
        },
        {
            "name": "allow-ssh",
            "rule": [
                "-p tcp --dport 22 -j ACCEPT"
            ],
            "chain": "DOCKER-USER"
        }
    ]
}

En el archivo de configuración anterior, "iptables": true significa activar iptables, "iptables-default": "DROP" significa configurar el comportamiento predeterminado de iptables en DROP, e iptables-filter es la regla de iptables para los contenedores Docker, correspondiente a " permitir: hay dos reglas: "todos" y "permitir-ssh", la primera permite todo el tráfico y la segunda permite conexiones SSH.

Usando el cortafuegos Docker

El uso del firewall Docker es una operación muy importante: si se usa incorrectamente, es posible que la aplicación no se ejecute o sea atacada. A continuación se ofrecen algunos consejos para utilizar el firewall de Docker:

1. Permitir puertos específicos

Si necesita permitir un puerto específico a través del firewall de Docker, puede usar el siguiente comando:

iptables -A INPUT -p tcp --dport 80 -j ACCEPT

2. Reglas de visualización

Puede utilizar el siguiente comando para mostrar todas las reglas de iptables:

iptables -L

3. Modificar las reglas

Puede utilizar el siguiente comando para modificar las reglas de iptables:

iptables -R INPUT 1 -p tcp --dport 22 -j DROP

4. Reglas claras

Puede utilizar el siguiente comando para borrar todas las reglas de iptables:

iptables -F

Mantener y optimizar el firewall Docker

Mantener y optimizar su firewall Docker es muy importante, aquí hay algunos consejos que puede utilizar:

1. Reglas de respaldo regulares

Dado que las reglas de iptables son muy complejas, se recomienda realizar copias de seguridad de las reglas con regularidad para evitar la pérdida de datos. Se puede hacer una copia de seguridad de las reglas usando el siguiente comando:

iptables-save > /root/iptables.save

2. Limpiar viejas reglas

Dado que las reglas de iptables son muy complejas, se recomienda limpiar las reglas antiguas con regularidad para mantener el sistema en buen estado. Puede utilizar el siguiente comando para limpiar reglas antiguas:

iptables -L --line-numbers | grep DROP | awk '{print$1}' | xargs -I{} iptables -D INPUT {}

3. Reglas de compresión

Cuantas más reglas de iptables haya, mayor será la carga del sistema. Por lo tanto, se recomienda comprimir las reglas para reducir la carga. El siguiente es un ejemplo sencillo de reglas de compresión:

iptables-save | python -c "import re, sys; chain = ''; iptables = sys.stdin.readlines(); [print(f'{l.strip()}') if 'ACCEPT' in l or '\n' in l else exec(f'chain = re.match(r\'\:([A-Z]+)\', l).group(1)'); print(l.strip()) for l in iptables if l.strip() != '' ]" | iptables-restore

Los anteriores son algunos consejos de optimización y mantenimiento del firewall de Docker, que pueden ayudar a los usuarios a mantener mejor el sistema y optimizar las reglas de iptables.

7. Pruebe el puerto de red

Método 1, telnet

telnet ip port

Método 2, ssh

SSH es actualmente un protocolo más confiable diseñado para brindar seguridad para sesiones de inicio de sesión remotas y otros servicios de red. En Linux, puede usar el comando ssh para probar la conectividad del puerto. El formato de uso específico es el siguiente:

ssh -v -p port username@ip

Descripción:
-v modo de depuración (se imprimirá el registro)
-p especifica el puerto
nombre de usuario: usuario de inicio de sesión
ip del host remoto: host remoto

Si el host remoto ha abierto el puerto correspondiente, aparecerá un mensaje de establecimiento exitoso como se muestra en la siguiente figura.

Insertar descripción de la imagen aquí

Si el host remoto no abre el puerto correspondiente, como se muestra en la siguiente figura
Insertar descripción de la imagen aquí

Método tres, rizo

Curl es una herramienta de transferencia de archivos de código abierto que utiliza la sintaxis de URL para funcionar en modo de línea de comandos. También se puede utilizar para probar la conectividad del puerto.Uso específico:

curl ip:port

Nota:
ip: es la dirección IP del host de prueba
puerto: es el puerto, como 80

Si se abre el puerto correspondiente en el host remoto, se generará información. Si no se abre el puerto correspondiente, no habrá ningún mensaje y se requiere CTRL + C para desconectarse. .
Insertar descripción de la imagen aquí

Método 4, wget

Wget es una herramienta gratuita que descarga automáticamente archivos de Internet. Admite la descarga a través de los tres protocolos TCP/IP más comunes: HTTP, HTTPS y FTP, y puede utilizar el proxy HTTP. El origen del nombre wget es
la combinación de "World Wide Web" y "get". También se puede utilizar para probar la conectividad del puerto. Uso específico:
wget ip:
descripción del puerto:
ip: es la dirección IP del puerto del host de prueba
: es el puerto, como 80

Si el puerto no existe en el host remoto, siempre se le solicitará que se conecte al host.
Insertar descripción de la imagen aquí
Si existe un puerto en el host remoto, verá la información correspondiente, como se muestra en la siguiente figura.

Insertar descripción de la imagen aquí

Ocho preguntas frecuentes sobre la red de contenedores Docker

1.No se puede acceder al contenedor Docker

El vm host no puede acceder al contenedor;
no se puede acceder a la máquina virtual curl localhost;
la asignación de puertos es normal;
luego verifique la versión del kernel y la versión de Docker y no hay ningún problema;
luego reinicie Docker incluido el contenedor y finalice el proceso. lo he intentado todo pero sin éxito;

2. Solución final

systemctl stop docker # 停止docker 服务
pkill docker # 杀掉docker进程
iptables -t nat -F # 清理iptables
ip link set docker0 down # 停止docker0网卡
brctl delbr docker0 # 删除docker0网卡--重点!
systemctl start docker # 启动docker服务

Al final resultó que el problema era efectivamente la tarjeta de red docker0, y era inútil reiniciar la tarjeta de red sin borrarla, solo se podía borrar;

Supongo que te gusta

Origin blog.csdn.net/tian830937/article/details/132264112
Recomendado
Clasificación