Diferencia entre enlaces y dependen_on en docker_compose.yml

292

De acuerdo con la documentación del archivo de composición de Docker Compose :

  • depends_on - Expresar dependencia entre servicios.
  • links- Enlace a contenedores en otro servicio y también expresa dependencia entre servicios de la misma manera que dependen_on .

No entiendo el propósito de vincular a otros contenedores, por lo que la diferencia entre dos opciones todavía me parece bastante difícil.

Sería mucho más fácil si hubiera un ejemplo, pero no puedo encontrar ninguno.

Me di cuenta, cuando vinculo el contenedor B con el contenedor A, entonces el contenedor B será "pingable" dentro del caparazón del contenedor A.

Corrí ping Bdentro del contenedor A bashy obtuve un resultado como este (solo como referencia, imagen de Internet)

ingrese la descripción de la imagen aquí

itsjef
fuente
66
El --linkindicador ahora es una característica heredada en desuso de Docker y la documentación sugiere " Docker eventualmente se eliminará" Docker: enlaces de contenedores heredados . Se sugiere no utilizar la función de redes de Docker o el método de composición de Docker . Pensé que esto sería útil para cualquiera que esté aquí aprendiendo sobre esta característica.
Una estrella

Respuestas:

122

La publicación necesita una actualización después de que la linksopción está en desuso.

Básicamente, linksya no es necesario porque su propósito principal, hacer que el contenedor sea accesible por otro agregando variable de entorno, se incluye implícitamente con network. Cuando los contenedores se colocan en la misma red, son accesibles entre sí utilizando su nombre de contenedor y otro alias como host.

For docker run, --linktambién está en desuso y debe ser reemplazado por una red personalizada.

docker network create mynet
docker run -d --net mynet --name container1 my_image
docker run -it --net mynet --name container1 another_image

depends_onexpresa el orden de inicio (e implícitamente el orden de extracción de imágenes), que fue un buen efecto secundario de links.

Siyu
fuente
13
StackOverflow común, ¿por qué tengo que desplazarme hacia abajo por debajo de las respuestas de 147 y 43 puntos para encontrar una respuesta de 1 punto que sea realmente la mejor?
u8it
3
@ u8it Es la naturaleza del tiempo e internet.
Michael Cole
¿Cómo hacer lo mismo en docker-compose? Creo que con Docker Comose todos los servicios están en la misma red y no hay necesidad de agregar nada. Aún así, el enlace entre los contenedores no funciona si uno de los contenedores intenta conectarse al contenedor que no está en el estado Listo.
makkasi
No puedo ver información sobre los enlaces que están en desuso en docker-compose versión 3 docs: docs.docker.com/compose/compose-file/#links . No veo la opción demasiado útil, ya que hemos compartido redes y depende de ella, pero no está en desuso si leo los documentos correctamente (solo mencionan --la bandera de enlace en el contenedor de la ventana acoplable).
rideronthestorm
Nota: los contenedores (en realidad servicios) en la misma red son accesibles por nombre de servicio, no por nombre de contenedor. Documentación oficial: docs.docker.com/compose/networking/#links
GarryOne
194

Esta respuesta es para docker-compose versión 2 y también funciona en la versión 3

Todavía puede acceder a los datos cuando utiliza depede_on.

Si observa los documentos de Docker Docker Compose y Django , aún puede acceder a la base de datos de esta manera:

version: '2'
services:
  db:
    image: postgres
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

¿Cuál es la diferencia entre links y dependen_on?

Enlaces:

Cuando crea un contenedor para una base de datos, por ejemplo:

docker run -d --name=test-mysql --env="MYSQL_ROOT_PASSWORD=mypassword" -P mysql

docker inspect d54cf8a0fb98 |grep HostPort

Y puedes encontrar

"HostPort": "32777"

Esto significa que puede conectar la base de datos desde su puerto localhost 32777 (3306 en el contenedor) pero este puerto cambiará cada vez que reinicie o elimine el contenedor. Por lo tanto, puede usar enlaces para asegurarse de que siempre se conectará a la base de datos y no tiene que saber qué puerto es.

web:
  links:
   - db

depende de:

Encontré un buen blog de Giorgio Ferraris Docker-compose.yml: de V1 a V2

Cuando docker-compose ejecuta archivos V2, construirá automáticamente una red entre todos los contenedores definidos en el archivo, y cada contenedor podrá referirse inmediatamente a los demás simplemente usando los nombres definidos en el archivo docker-compose.yml.

Y

Entonces ya no necesitamos enlaces; los enlaces se usaron para iniciar una comunicación de red entre nuestro contenedor de db y nuestro contenedor de servidor web, pero esto ya lo hace docker-compose

Actualizar

depende de

Expresar dependencia entre servicios, que tiene dos efectos:

  • docker-compose upiniciará los servicios en orden de dependencia. En el siguiente ejemplo, db y redis se iniciarán antes que la web.
  • docker-compose up SERVICEincluirá automáticamente las dependencias de SERVICIO. En el siguiente ejemplo, docker-compose up web también creará e iniciará db y redis.

Ejemplo simple:

version: '2'
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres

Nota: depende_on no esperará a que db y redis estén "listos" antes de iniciar la web, solo hasta que se hayan iniciado. Si necesita esperar a que un servicio esté listo, consulte Control del orden de inicio para obtener más información sobre este problema y las estrategias para resolverlo.

Windsooon
fuente
He actualizado mi respuesta para aclarar que la respuesta estaba destinada a componer el archivo v1.
Xiongbing Jin
1
¿Sigue siendo válido para la versión 3?
fabiomaia
Sí, puede echar un vistazo ahttps://docs.docker.com/compose/compose-file/compose-versioning/
Windsooon
"Esto significa que puede conectar la base de datos desde su puerto localhost 32777 (3306 en el contenedor) Pero este puerto cambiará cada vez que reinicie o elimine el contenedor", no si especifica el enlace del puerto en el archivo docker-compose-file, no . Y dado que esta pregunta es específicamente sobre Docker-compose, creo que el ejemplo docker runaquí es completamente irrelevante, de todos modos no es así como se ejecutará el contenedor. ¿Qué me estoy perdiendo?
Andrew Savinykh
Sí, tiene razón si especifica el puerto. Mi docker run ejemplo quiero señalar por qué necesitamos usar depende_on o enlaces en lugar de codificar un número de puerto. Solo porque si no lo especifica, cambiará cada vez. Creo que esto permitirá que la gente entienda más sobre depende_on o enlaces.
Windsooon
50

[Actualización de septiembre de 2016]: esta respuesta estaba destinada a docker compose file v1 (como se muestra en el archivo de compilación de muestra a continuación). Para v2, vea la otra respuesta de @Windsooon.

[Respuesta original]:

Está bastante claro en la documentación. depends_ondecide la dependencia y el orden de creación del contenedor y linksno solo lo hace, sino también

Se podrá acceder a los contenedores para el servicio vinculado con un nombre de host idéntico al alias o el nombre del servicio si no se especificó ningún alias.

Por ejemplo, suponiendo el siguiente docker-compose.ymlarchivo:

web:
  image: example/my_web_app:latest
  links:
    - db
    - cache

db:
  image: postgres:latest

cache:
  image: redis:latest

Con links, el código interno webpodrá acceder a la base de datos utilizando db:5432, suponiendo que el puerto 5432 esté expuesto en la dbimagen. Si depends_onse usaran, esto no sería posible, pero el orden de inicio de los contenedores sería correcto.

Xiongbing Jin
fuente
¿Puedes darme un ejemplo? Porque esa parte es lo que aún no tengo claro. Tal vez hay otras opciones de componer archivos que pueden hacerlo más específico. Por favor proporcione más detalles. ¡Gracias!
itsjef
¡Muchas gracias! Lo tengo. Una última pregunta, por favor. Por lo tanto, en mi caso particular, estoy desplegar mi aplicación rieles, debo usar linkso depends_ono ninguno de los dos está bien? Mis docker-compose.ymlusos actuales depends_ony las cosas parecen funcionar bien. :)
itsjef
Si no necesita acceder directamente al otro contenedor a través de, name:portentonces depends_onestá bien.
Xiongbing Jin
99
nombre: el puerto funciona incluso sin vinculación cuando usa la exposición:
Amit Goldstein
77
"Si se utiliza dependen_on, esto no sería posible, pero el orden de inicio de los contenedores sería correcto". Esto no es correcto. Funcionaría si solo usa depend_on. Todavía puede acceder a su dben el webnombre de host de las bases de datos.
Prog.Dusan