Solución:
Esta respuesta es para docker-compose versión 2 y también funciona en versión 3
Aún puede acceder a los datos cuando usa depende_en.
Si observa los documentos de la ventana acoplable 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_en?
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 tendrá 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á inmediatamente hacer referencia a los demás 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 base de datos 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 up
iniciará los servicios en orden de dependencia. En el siguiente ejemplo, db y redis se iniciarán antes que web. -
docker-compose up SERVICE
incluirá automáticamente las dependencias de SERVICE. 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: depends_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 Control del orden de inicio para obtener más información sobre este problema y estrategias para resolverlo.
La publicación necesita una actualización después de la links
La opción está obsoleta.
Básicamente, links
ya no es necesario porque su propósito principal, hacer que otro contenedor sea accesible mediante la adición de una variable de entorno, se incluye implícitamente con network
. Cuando los contenedores se colocan en la misma red, los demás pueden acceder a ellos utilizando su nombre de contenedor y otro alias como host.
Para docker run
, --link
también está en desuso y debería 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_on
expresa el orden de inicio (e implícitamente el orden de extracción de imágenes), que fue un buen efecto secundario de links
.
[Update Sep 2016]: Esta respuesta estaba destinada al archivo de composición de la ventana acoplable v1 (como se muestra en el archivo de composición de muestra a continuación). Para v2, vea la otra respuesta de @Windsooon.
[Original answer]:
Está bastante claro en la documentación. depends_on
decide la dependencia y el orden de creación del contenedor y links
no solo estos, sino también
Se podrá acceder a los contenedores para el servicio vinculado con un nombre de host idéntico al alias, o al nombre del servicio si no se especificó un alias.
Por ejemplo, asumiendo lo siguiente docker-compose.yml
expediente:
web:
image: example/my_web_app:latest
links:
- db
- cache
db:
image: postgres:latest
cache:
image: redis:latest
Con links
, código dentro web
podrá acceder a la base de datos utilizando db:5432
, suponiendo que el puerto 5432 esté expuesto en el db
imagen. Si depends_on
se utilizaron, esto no sería posible, pero el orden de inicio de los contenedores sería correcto.