Diferencia entre enlaces y depende_on en docker_compose.yml

Resuelto itsjef asked hace 8 años • 4 respuestas

Según la documentación de redacción de archivos de Docker Compose :

  • depends_on- Dependencia expresa entre servicios.
  • links- Enlace a contenedores en otro servicio y también expresa dependencia entre servicios de la misma manera que depende_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 encuentro ninguno.

Me di cuenta de que cuando vinculo el contenedor B con el contenedor A, el contenedor B será "pingable" dentro del shell del contenedor A.

Ejecuté 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 avatar Mar 07 '16 03:03 itsjef
Aceptado

La publicación necesita una actualización después de que la linksopción quede obsoleta.

Básicamente, linksya no es necesario porque su propósito principal, hacer que otro pueda acceder al contenedor agregando una variable de entorno, está incluido implícitamente en network. Cuando los contenedores se colocan en la misma red, se puede acceder a ellos entre sí utilizando su nombre de contenedor y otro alias como host.

For docker run, --linktambién está en desuso y debe reemplazarse 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 la imagen), lo cual fue un buen efecto secundario de links.

Siyu avatar Jan 18 '2019 09:01 Siyu

Esta respuesta es para la versión 2 de Docker-Compose y también funciona en la versión 3.

Aún puedes acceder a los datos cuando usas depend_on.

Si observa los documentos de 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 enlaces y depende_de?

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 el puerto 32777 de su host local (3306 en el contenedor), pero este puerto cambiará cada vez que reinicie o elimine el contenedor. Por lo tanto, puede utilizar enlaces para asegurarse de conectarse siempre a la base de datos y no tener 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, creará automáticamente una red entre todos los contenedores definidos en el archivo, y cada contenedor podrá hacer referencia inmediatamente a los demás simplemente usando los nombres definidos en el archivo docker-compose.yml.

Y

Entonces ya no necesitamos enlaces; Se utilizaron enlaces para iniciar una comunicación de red entre nuestro contenedor de base de datos y nuestro contenedor de servidor web, pero esto ya lo hace Docker-compose.

Actualizar

depende de

Dependencia expresa 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 web.
  • docker-compose up SERVICEincluirá automáticamente las dependencias del SERVICIO. En el siguiente ejemplo, docker-compose up web también creará e iniciará db y redis.

Ejemplo sencillo:

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

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

Windsooon avatar Sep 23 '2016 10:09 Windsooon

[Actualización de septiembre de 2016]: Esta respuesta estaba destinada al archivo de redacción de Docker v1 (como se muestra en el archivo de redacció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 los hace, sino también

Se podrá acceder a los contenedores del servicio vinculado en un nombre de host idéntico al alias, o al 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 usando 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 avatar Mar 06 '2016 20:03 Xiongbing Jin