Diferença entre links e depende em docker_compose.yml

292

De acordo com a documentação do arquivo de composição do Docker Compose :

  • depends_on - Expressar dependência entre serviços.
  • links- Vincule a contêineres em outro serviço e também expresse dependência entre serviços da mesma maneira que depende_on .

Eu não entendo o propósito de vincular a outros contêineres, portanto a diferença entre duas opções ainda parece bastante difícil para mim.

Seria muito mais fácil se houver um exemplo, mas não consigo encontrar nenhum.

Notei que, quando vinculo o contêiner B ao contêiner A, o contêiner B será "pingável" dentro do shell do contêiner A.

Corri ping Bdentro do container A bashe obtive resultados como este (apenas para referência, imagem da Internet)

insira a descrição da imagem aqui

itsjef
fonte
6
O --linksinalizador agora é um recurso herdado obsoleto do Docker e a documentação sugere "Ele pode ser removido eventualmente" links do contêiner Docker: Legacy . É recomendável não usar o recurso de redes do Docker ou o método de composição do Docker. Achei que isso seria útil para quem está aprendendo sobre esse recurso.
A Star

Respostas:

122

A postagem precisa de uma atualização após a linksopção ser descontinuada.

Basicamente, linksnão é mais necessário porque seu objetivo principal, tornar o contêiner acessível por outro adicionando variável de ambiente, está incluído implicitamente network. Quando os contêineres são colocados na mesma rede, eles podem ser alcançados usando o nome do contêiner e outro alias como host.

Pois docker run, --linktambém está obsoleto e deve ser substituído por uma rede personalizada.

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

depends_onexpressa a ordem inicial (e implicitamente a ordem de puxar a imagem), o que foi um bom efeito colateral de links.

Siyu
fonte
13
StackOverflow comum, por que preciso rolar abaixo das respostas de 147 e 43 pontos para encontrar uma resposta de 1 ponto que seja realmente a melhor.
u8it 01/02/19
3
@ u8it É a natureza do tempo e da internet.
Michael Cole
Como fazer a mesma coisa no docker-compondo? Eu acho que com o docker compor todos os serviços já estão na mesma rede e não há necessidade de adicionar nada. Ainda assim, a vinculação entre os contêineres não funcionará se um deles estiver tentando se conectar ao contêiner que não está no estado Pronto.
makkasi 27/03/19
Não consigo ver informações sobre links descontinuados nos docs do docker-compose versão 3: docs.docker.com/compose/compose-file/#links . Não vejo a opção muito útil, já que compartilhamos redes e depende_on, mas não será preterida se eu ler os documentos corretamente (eles apenas mencionam o sinalizador --link no contêiner do docker).
Rideronthestorm
Nota: os contêineres (atualmente serviços) na mesma rede são acessíveis pelo nome do serviço, não pelo nome do contêiner. Documentação oficial: docs.docker.com/compose/networking/#links
GarryOne 23/12/19
194

Esta resposta é para a versão 2 do docker-compose e também funciona na versão 3

Você ainda pode acessar os dados quando usar o Depend_on.

Se você olhar para o docker docs Docker Compose e Django , ainda poderá acessar o banco de dados assim:

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 é a diferença entre links e depende_on?

links:

Quando você cria um contêiner para um banco de dados, por exemplo:

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

docker inspect d54cf8a0fb98 |grep HostPort

E você pode encontrar

"HostPort": "32777"

Isso significa que você pode conectar o banco de dados a partir da porta 32777 do host local (3306 no contêiner), mas essa porta será alterada toda vez que você reiniciar ou remover o contêiner. Portanto, você pode usar links para garantir que você sempre se conecte ao banco de dados e não precise saber qual é a porta.

web:
  links:
   - db

depende de:

Encontrei um bom blog de Giorgio Ferraris Docker-compose.yml: de V1 a V2

Quando o docker-compose executa arquivos V2, ele cria automaticamente uma rede entre todos os contêineres definidos no arquivo e cada contêiner poderá imediatamente se referir aos outros apenas usando os nomes definidos no arquivo docker-compose.yml.

E

Portanto, não precisamos mais de links; Os links foram usados ​​para iniciar uma comunicação de rede entre o contêiner db e o contêiner do servidor da web, mas isso já é feito pelo docker-compose

Atualizar

depende de

Expressar dependência entre serviços, que tem dois efeitos:

  • docker-compose upiniciará os serviços em ordem de dependência. No exemplo a seguir, db e redis serão iniciados antes da web.
  • docker-compose up SERVICEincluirá automaticamente as dependências do SERVIÇO. No exemplo a seguir, a docker-compose up web também criará e iniciará db e redis.

Exemplo simples:

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

Nota: depende_on não esperará que db e redis estejam "prontos" antes de iniciar a Web - somente até que eles tenham sido iniciados. Se você precisar esperar que um serviço esteja pronto, consulte Controlando o Pedido de Inicialização para obter mais informações sobre este problema e estratégias para resolvê-lo.

Windsooon
fonte
Atualizei minha resposta para esclarecer que a resposta se destinava ao arquivo de composição v1.
Xiongbing Jin
1
Isso ainda é válido para a versão 3?
Fabiomaia # 20/17
Sim, você pode dar uma olhadahttps://docs.docker.com/compose/compose-file/compose-versioning/
Windsooon 20/17/17
"Isso significa que você pode conectar o banco de dados a partir da porta 32777 do host local (3306 no contêiner). Mas essa porta será alterada toda vez que você reiniciar ou remover o contêiner". . E como essa pergunta é especificamente sobre composição de encaixe, sinto que o exemplo docker runaqui é completamente irrelevante, não é assim que o contêiner será executado de qualquer maneira. o que estou perdendo?
Andrew Savinykh
Sim, você está certo se especificar a porta. Meu docker run exemplo quer mostrar por que precisamos usar o Depend_on ou os links, em vez de codificar um número de porta. Apenas porque, se você não o especificar, ele será alterado sempre. Eu acho que isso permitirá que as pessoas entendam mais sobre dependências ou links.
Windsooon
50

[Atualizar em setembro de 2016]: esta resposta foi planejada para o arquivo de composição docker v1 (conforme mostrado pelo exemplo de arquivo de composição abaixo). Para a v2, consulte a outra resposta de @Windsooon.

[Resposta original]:

É bastante claro na documentação. depends_ondecide a dependência e a ordem de criação do contêiner e linksnão apenas isso, mas também

Os contêineres para o serviço vinculado estarão acessíveis em um nome de host idêntico ao alias ou no nome do serviço se nenhum alias tiver sido especificado.

Por exemplo, supondo o seguinte docker-compose.ymlarquivo:

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

db:
  image: postgres:latest

cache:
  image: redis:latest

Com links, o código interno webpoderá acessar o banco de dados usando db:5432, assumindo que a porta 5432 esteja exposta na dbimagem. Se depends_onfosse usado, isso não seria possível, mas a ordem de inicialização dos contêineres estaria correta.

Xiongbing Jin
fonte
Você pode me dar um exemplo? Porque essa parte ainda é incerta. Talvez haja outras opções de composição de arquivos que possam torná-lo mais específico. Por favor dê mais detalhes. Obrigado!
itsjef
Muito obrigado! Deixa comigo. Uma pergunta final, por favor. Então, no meu caso particular, estou implantando meu aplicativo de trilhos, devo usar linksou depends_onou qualquer um deles está ok? Meus docker-compose.ymlusos depends_one coisas atuais parecem funcionar bem. :)
itsjef
Se você não precisar acessar diretamente o outro contêiner via, name:portentão depends_onestá ok.
Xiongbing Jin
9
nome: port funciona mesmo sem vinculação quando você usa expor:
Amit Goldstein 21/08
7
"Se depend_on fosse usado, isso não seria possível, mas a ordem de inicialização dos contêineres estaria correta." Isso não está correto. Funcionaria se você apenas usar o Depend_on. Você ainda pode acessar o seu dbno webnome de host usando bancos de dados.
usar o seguinte código