Differenza tra collegamenti e depend_on in docker_compose.yml


292

Secondo la documentazione del file di composizione di Docker Compose :

  • depends_on - Esprimi la dipendenza tra i servizi.
  • links- Collega ai container in un altro servizio ed esprimi anche la dipendenza tra i servizi nello stesso modo di depend_on .

Non capisco lo scopo del collegamento ad altri contenitori, quindi la differenza tra due opzioni sembra ancora abbastanza difficile per me.

Sarebbe molto più semplice se ci fosse un esempio, ma non riesco a trovarne nessuno.

Ho notato che quando collego il contenitore B con il contenitore A, il contenitore B sarà "pingabile" all'interno della shell del contenitore A.

Ho corso ping Ball'interno del contenitore A bashe ho ottenuto un risultato del genere (solo per riferimento, immagine da Internet)

inserisci qui la descrizione dell'immagine


6
Il --linkflag è ora una funzionalità legacy obsoleta di Docker e la documentazione suggerisce " Docker: collegamenti eventualmente rimovibili" . Si consiglia di non utilizzare la funzione Reti Docker o il metodo di composizione docker. Ho pensato che sarebbe stato utile a chiunque qui venisse a conoscenza di questa funzione.
Una stella,

Risposte:


122

Il post ha bisogno di un aggiornamento dopo che l' linksopzione è diventata obsoleta.

Fondamentalmente, linksnon è più necessario perché il suo scopo principale, rendere il contenitore raggiungibile da un altro aggiungendo la variabile d'ambiente, è incluso implicitamente network. Quando i contenitori vengono inseriti nella stessa rete, sono raggiungibili l'uno dall'altro utilizzando il nome del contenitore e altri alias come host.

Per docker run, --linkè anche deprecato e dovrebbe essere sostituito da una rete personalizzata.

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

depends_onesprime l'ordine di inizio (e implicitamente l'ordine di estrazione dell'immagine), che è stato un buon effetto collaterale di links.


13
StackOverflow comune, perché devo scorrere sotto le risposte a 147 e 43 punti per trovare una risposta a 1 punto che è in realtà la migliore.
dal

3
@ u8it È la natura del tempo e di Internet.
Michael Cole,

Come fare la stessa cosa in docker-compose? Penso che con la finestra mobile componi tutti i servizi siano già nella stessa rete e non sia necessario aggiungere nulla. Il collegamento ancora tra i contenitori non funziona se uno dei contenitori sta tentando di connettersi al contenitore che non si trova nello stato Pronto.
Makkasi,

Non riesco a vedere le informazioni sui link che sono stati deprecati nei documenti versione 3 di docker -compose: docs.docker.com/compose/compose-file/#links . Non vedo l'opzione troppo utile, poiché abbiamo reti condivise e depend_on, ma non è deprecata se leggo correttamente i documenti (menzionano solo il flag --link sul contenitore della finestra mobile).
rideronthestorm,

Nota: i contenitori (in realtà servizi) nella stessa rete sono accessibili per nome del servizio, non per nome del contenitore. Documentazione ufficiale: docs.docker.com/compose/networking/#links
GarryOne,

194

Questa risposta è per docker-compose versione 2 e funziona anche con la versione 3

Puoi ancora accedere ai dati quando usi depend_on.

Se dai un'occhiata ai documenti docker Docker Compose e Django , puoi comunque accedere al database in questo modo:

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

Qual'è la differenza tra links e depend_on?

links:

Quando si crea un contenitore per un database, ad esempio:

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

docker inspect d54cf8a0fb98 |grep HostPort

E potresti trovare

"HostPort": "32777"

Ciò significa che è possibile connettere il database dalla porta 32777 localhost (3306 nel contenitore) ma questa porta cambierà ogni volta che si riavvia o si rimuove il contenitore. Quindi puoi usare i collegamenti per assicurarti di connetterti sempre al database e non devi sapere quale sia la porta.

web:
  links:
   - db

dipende da:

Ho trovato un bel blog di Giorgio Ferraris Docker-compose.yml: dalla V1 alla V2

Quando docker-compose esegue i file V2, creerà automaticamente una rete tra tutti i contenitori definiti nel file e ogni contenitore sarà immediatamente in grado di fare riferimento agli altri semplicemente usando i nomi definiti nel file docker-compose.yml.

E

Quindi non abbiamo più bisogno di collegamenti; i collegamenti sono stati usati per avviare una comunicazione di rete tra il nostro contenitore db e il nostro contenitore web-server, ma questo è già fatto da docker-compose

Aggiornare

dipende da

Esprimi la dipendenza tra i servizi, che ha due effetti:

  • docker-compose upavvierà i servizi in ordine di dipendenza. Nel seguente esempio, db e redis verranno avviati prima del web.
  • docker-compose up SERVICEincluderà automaticamente le dipendenze di SERVICE. Nel seguente esempio, la finestra mobile composta da Web creerà e avvierà anche db e redis.

Esempio semplice:

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

Nota: depend_on non attenderà che db e redis siano “pronti” prima di avviare il web - solo fino a quando non saranno stati avviati. Se è necessario attendere che un servizio sia pronto, consultare Controllo dell'ordine di avvio per ulteriori informazioni su questo problema e sulle strategie per risolverlo.


Ho aggiornato la mia risposta per chiarire che la risposta era destinata al file di composizione v1.
Xiongbing Jin,

1
È ancora valido per la versione 3?
fabiomaia,

Sì, potresti dare un'occhiata ahttps://docs.docker.com/compose/compose-file/compose-versioning/
Windsooon

"Questo significa che è possibile connettere il database dalla porta localhost 32777 (3306 nel contenitore) Ma questa porta cambierà ogni volta che si riavvia o rimuove il contenitore" non se si specifica l'associazione della porta nel file docker-compose, non . E poiché questa domanda riguarda in particolare la composizione docker, ritengo che l'esempio con docker runqui sia completamente irrilevante, non è così che verrà eseguito il contenitore. Cosa mi sto perdendo?
Andrew Savinykh,

Sì, hai ragione se specifichi la porta. Il mio docker run esempio vuole sottolineare il motivo per cui dobbiamo usare depend_on o links anziché hard-code un numero di porta. Solo perché se non lo si specifica, cambia ogni volta. Penso che questo permetterà alle persone di capire di più su depend_on o collegamenti.
Windsooon,

50

[Aggiornamento settembre 2016]: questa risposta era intesa per il file di composizione docker v1 (come mostrato dal file di composizione di esempio riportato di seguito). Per v2, vedi l'altra risposta di @Windsooon.

[Risposta originale]:

È abbastanza chiaro nella documentazione. depends_ondecide la dipendenza e l'ordine di creazione del contenitore e linksnon solo li fa, ma anche

I contenitori per il servizio collegato saranno raggiungibili con un nome host identico all'alias o il nome del servizio se non è stato specificato alcun alias.

Ad esempio, assumendo il seguente docker-compose.ymlfile:

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

db:
  image: postgres:latest

cache:
  image: redis:latest

Con links, il codice interno websarà in grado di accedere al database usando db:5432, supponendo che la porta 5432 sia esposta dbnell'immagine. Se depends_onfossero utilizzati, ciò non sarebbe possibile, ma l'ordine di avvio dei contenitori sarebbe corretto.


Puoi farmi un esempio? Perché quella parte è ciò di cui non sono ancora chiaro. Forse ci sono altre opzioni per comporre file che potrebbero renderlo più specifico. Si prega di fornire ulteriori dettagli. Grazie!
itsjef

Grazie mille! Capito. Un'ultima domanda, per favore. Quindi, nel mio caso particolare, sto implementando la mia app Rails, dovrei usare linkso depends_ono uno di loro è ok? I miei docker-compose.ymlusi attuali depends_one le cose sembrano funzionare bene. :)
itsjef

Se non è necessario accedere direttamente all'altro contenitore tramite, name:portallora depends_onè ok.
Xiongbing Jin

9
nome: porta funziona anche senza collegamento quando si utilizza esporre:
Amit Goldstein

7
"Se fosse usato depend_on, ciò non sarebbe possibile, ma l'ordine di avvio dei contenitori sarebbe corretto.". Questo non è corretto Funzionerebbe se usi solo depend_on. È ancora possibile accedere dbal webnome host utilizzando i database.
prog.Dusan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.