tag run remove hub example compose docker docker-networking

run - docker-compose



Iniciar contenedor con mĂșltiples interfaces de red (4)

¿Alguien sigue buscando la respuesta a este problema? Hay 2 soluciones para hacer esto: la primera es la que se detalla casi por completo aquí, pero funciona con las versiones actuales de la ventana acoplable. El tutorial completo se puede encontrar aquí .

La solución 2 es hacer todo en la capa de fondo de roca. He incluido la sección de comentarios detallados del enlace anterior, que también copio aquí: dado que la ventana acoplable también utiliza los espacios de nombres de red de linux, también puede hacer esto en la capa inferior. Desafortunadamente, Docker intenta ocultarlo al usuario, pero los espacios de nombres aún existen bajo el capó. Para que sean gestionados por la herramienta ip netns, haga lo siguiente:

  1. obtenga el id de proceso (pid) de su contenedor en ejecución:

$ sudo docker inspect -f ''{{.State.Pid}}'' <container name>

<container name> no es su label:tag nombre de la label:tag , es el nombre que la ventana acoplable le asigna automáticamente una vez que se activa el contenedor - obtenga el suyo mediante el comando docker ps y busque la última columna (NOMBRE).

  1. cree un enlace simbólico desde / proc / filesystem a / var / run / 2.1. Primero, cree un directorio netns en / var / run / $ sudo mkdir -p /var/run/netns

2.2. Usando el PID que acaba de obtener, cree el enlace simbólico $ sudo ln -sf /proc/<PID>/ns/net /var/run/netns/<YOUR DESIRED NETNS NAME FOR YOU CONTAINER>

Ahora, si ejecuta la ip netns list , verá el espacio de nombres de red de su contenedor.

A partir de ahora, no hay elementos específicos de la ventana acoplable, solo cree un par de veth, créelos y adjunte un extremo al contenedor y $ sudo ip link add veth1_container type veth peer name veth1_root bien: $ sudo ip link add veth1_container type veth peer name veth1_root

$ sudo ifconfig veth1_container up

$ sudo ifconfig veth1_root up

$ sudo ip link set veth1_container netns <YOUR NETNS NAME>

$ sudo ip netns exec <YOUR NETNS NAME> ifconfig veth1_container up

El último comando puede ser un poco demasiado complicado, pero parece que no es posible abrir esta interfaz de forma nativa en el contenedor debido a la falta de permisos :)

Tenga en cuenta que la dirección MAC también podría cambiarse de la misma manera que he mostrado en la solución 1, antes de adjuntarla al contenedor, o después, realmente no importa, solo se deben usar diferentes comandos (recuerde el problema de permisos que acabo de mencionar) ).

Espero que ayude.

Con 1.9, ¿hay una manera de iniciar un contenedor directamente con dos o más interfaces de red?

Puede hacerlo después de que se inicie el contenedor con "docker network connect", pero significa que el proceso ya se está ejecutando y puede que se pierda la creación del nuevo.


Como contestó @gesellix, actualmente no es posible.

Puede encontrar este problema en https://github.com/docker/docker/issues/17750

Hay algunas mejoras pendientes en esta área. Como veo en las discusiones, la idea actual es crear un contenedor (con la creación de ventana acoplable), adjuntar redes (conexión de red de la ventana acoplable) y luego iniciar (inicio de la ventana acoplable).

Puede verificar el razonamiento en los comentarios de https://github.com/docker/docker/pull/17796

UPD: # 17750 está cerrado y estará disponible en 1.10


Esta pregunta es superior haciendo una búsqueda con respecto a la ventana acoplable y múltiples interfaces de red. Aunque no es la versión requerida en la pregunta os dejo aquí algo de información:

Con Docker 1.12+ es posible agregar más de una interfaz de red a un contenedor de la ventana acoplable, pero es necesario crear primero el contenedor y luego adjuntar las NIC de la segunda red (y la subsecuencia) antes de iniciar el contenedor:

$ docker create --network=network1 --name container_name containerimage:latest $ docker network connect network2 container_name $ docker start container_name

Es necesario crear las redes primero:

$ docker network create --driver=bridge network1 --subnet=172.19.0.0/24 $ docker network create --driver=bridge network2 --subnet=172.19.1.0/24

Además, puede iniciar el contenedor adjuntando las interfaces de red de dockerhost utilizando el argumento --network = host en la ejecución de docker:

$ docker run --net=host containerimage:latest


No, esto no es posible. Los documentos también muestran que la opción de línea de comando necesaria --net solo acepta un solo nombre de red: http://docs.docker.com/engine/reference/run/#network-settings

También tenga en cuenta que Docker 1.9 actualiza constantemente el /etc/hosts dentro de sus contenedores, de modo que un proceso en ejecución no puede depender del estado inicial de ese archivo. La mejor manera sería hacer que su proceso esté al tanto de las actualizaciones, ya sea leyendo manualmente el /etc/hosts o consultando un servidor DNS. De esa manera, no tendrías problemas cuando la segunda red esté conectada.