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


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.


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.


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.