tag run remove name hub example dockers container change docker

run - docker tag example



¿Cómo crear un enlace bidireccional entre contenedores? (5)

Tengo que vincular dos contenedores para que puedan verse. Por supuesto, lo siguiente ...

docker run -i -t --name container1 --link container2:container2 ubuntu:trusty /bin/bash docker run -i -t --name container2 --link container1:container1 ubuntu:trusty /bin/bash

... falla en la línea 1 porque un contenedor necesita estar en funcionamiento para ser un objetivo de enlace:

2014/08/15 03:20:27 Error response from daemon: Could not find entity for container2

¿Cuál es la forma más simple de crear un enlace bidireccional?


Así es como he resuelto esto por mí mismo:

Primero, reviso todos mis contenedores (que necesitan conocerse unos a otros) y creo entradas de dnsmasq como estas:

for f in container1 container2 container3; do IP=`docker inspect --format ''{{ .NetworkSettings.IPAddress }}'' $f 2>/dev/null` if [ -n "$IP" ]; then echo $f "$IP" echo "host-record=$f,$IP" > /etc/dnsmasq.d/0host_$f else rm -f /etc/dnsmasq.d/0host_$f fi done

Luego, inicio un contenedor dns que tiene dnsmasq-base instalado e inicia el servicio dnsmasq:

docker run -d -P -h dns --name dns -v /etc/dnsmasq.d:/etc/dnsmasq.d:ro dns

luego obtengo la dirección IP de este contenedor:

DNS_IP=`docker inspect --format ''{{ .NetworkSettings.IPAddress }}'' dns`

Y comience los contenedores así:

docker run -d -P -h container1 --name container1 --dns $DNS_IP container1 docker run -d -P -h container2 --name container2 --dns $DNS_IP container2 docker run -d -P -h container3 --name container3 --dns $DNS_IP container3

Esta es una versión simplificada de mi configuración, pero muestra la esencia. También agregué un mecanismo que obliga a dnsmasq a volver a explorar cuando los archivos en /etc/dnsmasq.d cambian a través de inotify-tools. De esta forma, todos los contenedores obtienen la nueva dirección IP cada vez que se reinicia un contenedor.


Como no hay un enlace bidireccional, resolví este problema con el argumento --net . De esta forma, utilizan la misma pila de red y, por lo tanto, pueden acceder entre sí a través del dispositivo de bucle invertido (servidor local).

docker run -d --name web me/myserver docker run -d --name selenium --net container:web me/myotherserver

De modo que puedo acceder desde la web al servidor de selenio (puerto 4444) y mi servidor de selenio puede acceder a mi servidor web (puerto 80).


Docker 1.10 soluciona esto muy bien al introducir una red avanzada de contenedores. (Detalles: https://docs.docker.com/engine/userguide/networking/dockernetworks/ )

Primero, crea una red. El siguiente ejemplo crea una red básica de "puente", que funciona solo en un host. Puede consultar la documentación más completa de Docker para hacer esto en los hosts utilizando una red de superposición.

docker network create my-fancy-network

Las redes Docker en 1.10 ahora crean una resolución DNS especial dentro de contenedores que pueden resolver los nombres de una manera especial. Primero, puede seguir usando --link, pero como ha señalado, su ejemplo no funciona. Lo que recomiendo es usar --net-alias = en los comandos de ejecución de su acoplador:

docker run -i -t --name container1 --net=my-fancy-network --net-alias=container1 ubuntu:trusty /bin/bash docker run -i -t --name container2 --net=my-fancy-network --net-alias=container2 ubuntu:trusty /bin/bash

Tenga en cuenta que tener --name container2 es establecer el nombre del contenedor, que también crea una entrada DNS y --net-alias = container2 solo crea una entrada DNS en la red, por lo que en este ejemplo en particular podría omitir --net-alias pero Lo dejé allí en caso de que quisieras cambiar el nombre de tus contenedores y aún tener un alias de DNS que no coincida con tu nombre de contenedor.

(Detalles aquí: https://docs.docker.com/engine/userguide/networking/configure-dns/ )

Y aquí tienes:

root@4dff6c762785:/# ping container1 PING container1 (172.19.0.2) 56(84) bytes of data. 64 bytes from container1.my-fancy-network (172.19.0.2): icmp_seq=1 ttl=64 time=0.101 ms 64 bytes from container1.my-fancy-network (172.19.0.2): icmp_seq=2 ttl=64 time=0.074 ms 64 bytes from container1.my-fancy-network (172.19.0.2): icmp_seq=3 ttl=64 time=0.072 ms

Y desde container1

root@4f16381fca06:/# ping container2 PING container2 (172.19.0.3) 56(84) bytes of data. 64 bytes from container2.my-fancy-network (172.19.0.3): icmp_seq=1 ttl=64 time=0.060 ms 64 bytes from container2.my-fancy-network (172.19.0.3): icmp_seq=2 ttl=64 time=0.069 ms 64 bytes from container2.my-fancy-network (172.19.0.3): icmp_seq=3 ttl=64 time=0.062 ms


Lo resolví agregando una tabla ip en / etc / hosts de cada contenedor, por example


No hay un enlace bidireccional ya que no se puede vincular a un contenedor que no se está ejecutando.

A menos que esté deshabilitando la comunicación entre contenedores , todos los contenedores en el mismo host pueden ver cualquier otro contenedor en la red. Todo lo que necesita es proporcionarles la dirección IP del contenedor al que desea contactar.

La forma más sencilla de conocer la dirección IP de un contenedor es ejecutar:

docker inspect --format ''{{ .NetworkSettings.IPAddress }}'' container1

Puede buscarlo después de iniciar ambos contenedores (simplemente no use --link ).

Si necesita conocer la IP de container2 desde container1 automáticamente, hay algunas opciones:

  1. Monte el conector docker como un volumen y use la API remota

    docker run -i -t --name container1 -v /var/run/docker.sock:docker.sock ubuntu: trusty / bin / bash echo -e "GET / containers / container2 / json HTTP / 1.0 / r / n" | nc -U /docker.sock | sed ''s /. IPAddress ":" ([0-9.] ). * / / 1 / ''

  2. Use un servicio de orquestación ... hay tantos para elegir, pero personalmente me gustan los basados ​​en DNS como Skydock o registrator y los contenedores de acceso por nombre de DNS.

  3. Use un servicio de administración de acopladores (como dockerize.it -disclaimer: estoy trabajando en ello) que configurará los servicios DNS para usted.