Não é possível vincular a um contêiner em execução iniciado por docker-compose

99

Estou configurando meu ambiente de desenvolvimento local com contêineres docker. O docker-compose.yml é como seguir

version: '2'

services:
  db:
    image: mongo:3
  mq:
    image: rabbitmq:3
  api:
    build: .
    image: my_app/api
    ports:
      - "3000:3000"
    links:
      - db
      - mq
    environment:
      - NODE_ENV=development

Tudo começa sem erros. E o docker lista 3 contêineres em execução

docker-compose up -d
docker ps

e90e5a8b5d33        my_app/api    "/usr/local/bin/node "   0.0.0.0:3000->3000/tcp               my_app_api_1
42bfcd971b16        mongo:3       "/entrypoint.sh mongo"   27017/tcp                            my_app_db_1
a0685a816c47        rabbitmq:3    "/docker-entrypoint.s"   4369/tcp, 5671-5672/tcp, 25672/tcp   my_app_mq_1

No entanto, quando tento vincular a esses contêineres em execução de outro contêiner

docker run --link my_app_mq_1:mq --link my_app_db_1:db -it worker 

Eu recebo erro

 docker: Error response from daemon: Cannot link to /my_app_mq_1, as it does not belong to the default network.

Eu também tentei

 docker run --link my_app_mq_1:mq --link my_app_db_1:db -it --net default worker 

Mesmo erro.

Então, como posso vincular a um contêiner em execução iniciado por docker-compose?

Byte de Despertar
fonte

Respostas:

196

Ok, encontrei a resposta para isso. Caso mais alguém encontre o mesmo problema, basta fazer

docker network ls

Este comando lista todas as redes docker. docker-compose criará uma nova rede quando você executar docker-compose up. No meu caso, a rede é nomeada como myapp_default.

Observação: a rede do seu aplicativo recebe um nome com base no “nome do projeto”, que é baseado no nome do diretório em que ele reside. Você pode substituir o nome do projeto pelo sinalizador --project-name ou pela variável de ambiente COMPOSE_PROJECT_NAME . Networking in Compose

Portanto, a maneira correta de vincular a esses contêineres é

docker run --link my_app_mq_1:mq --link my_app_db_1:db -it --net myapp_default worker 
Byte de Despertar
fonte
9
Para quem não percebeu tem que colocar o --netantes do comando. Eu encontrei esse problema ao tentar executar a imagem docker oficial do Redis.
mistertee
3
Tive que usar o sinalizador --network, em vez do --net. Use-o no início do comando de execução. Eu espero que isso ajude. A referência está disponível aqui: docs.docker.com/engine/reference/run/#network-settings .
Erizo
11

meu comando para executar links

docker run --network=YOUR_NETWORK --link SERVICE -t -i app command
Gabriel Borges Oliveira
fonte
2

Quando você usa a definição de serviço versão 2 e mais, docker-composecria uma rede definida pelo usuário. A resolução de nomes em uma rede definida pelo usuário funciona por meio do servidor DNS integrado Docker. Aqui está a citação relacionada da documentação :

O servidor DNS incorporado do Docker permite a resolução de nomes para contêineres conectados a uma determinada rede [definida pelo usuário]. Isso significa que qualquer contêiner conectado pode executar ping em outro contêiner na mesma rede por seu nome de contêiner.

Os contêineres também estão disponíveis por aliases de rede que docker-composecria. Pode ser verificado por comandos como:

docker inspect \
  -f '{{json .NetworkSettings.Networks.myapp_default.Aliases}}' my_app_db_1

Ele imprime ["db","$CONTAINER_ID"].

O fornecimento de links --linknão terá nenhum efeito no caso de uma rede definida pelo usuário existente. Você pode ter certeza e olhar /etc/hosts, que não terá as linhas correspondentes.

Assim, o seguinte comando é suficiente:

docker run -it --net myapp_default worker
saaj
fonte