Eu tenho dois docker-compose.yml
arquivos separados em duas pastas diferentes:
~/front/docker-compose.yml
~/api/docker-compose.yml
Como posso garantir que um contêiner front
possa enviar solicitações para um contêiner api
?
Eu sei que essa --default-gateway
opção pode ser definida docker run
para um contêiner individual, de modo que um endereço IP específico possa ser atribuído a esse contêiner, mas parece que essa opção não está disponível durante o uso docker-compose
.
Atualmente, acabo fazendo um docker inspect my_api_container_id
e olha o gateway na saída. Funciona, mas o problema é que esse IP é atribuído aleatoriamente, então não posso confiar nele.
Outra forma dessa pergunta pode ser:
- Posso atribuir um endereço IP fixo a um contêiner específico usando o docker-compose?
Mas no final o que eu estou cuidando é:
- Como dois projetos diferentes de composição de encaixe podem se comunicar?
networking
docker
docker-compose
Jivan
fonte
fonte
Respostas:
Você só precisa garantir que os contêineres com os quais você deseja conversar estejam na mesma rede. As redes são uma construção de janela de encaixe de primeira classe e não específica para compor.
...
Eles podem conversar entre si usando o nome do serviço. De
front
você pode fazerping api
e vice-versa.fonte
name
propriedade, o que desativará o prefixo automático com o nome do projeto. Em seguida, qualquer um dos projetos pode usar essa rede e criá-la automaticamente, se ainda não existir.Apenas uma pequena adição à ótima resposta de @ johnharris85, quando você está executando um arquivo de composição do docker, "
default
" uma rede é criada para que você possa adicioná-lo ao outro arquivo de composição como uma rede externa:...
Para mim, essa abordagem foi mais adequada porque eu não possuía o primeiro arquivo de composição de encaixe e queria me comunicar com ele.
fonte
services:
tag, a sintaxe serianetworks:
então aninhadosfront_default:
(remover o "-") e, então, o ninho de um IP estático:ipv4_address: '172.20.0.44'
ATUALIZAÇÃO: A partir da versão 3.5 do arquivo de composição:
Isso agora funciona:
docker-compose up -d
ingressará em uma rede chamada 'custom_network'. Se não existir, será criado!Agora, você pode fazer isso:
Isso criará um contêiner que estará na rede externa.
Ainda não encontrei nenhuma referência nos documentos, mas funciona!
fonte
Todos os contêineres de
api
podem ingressar na redefront
padrão com a seguinte configuração:Consulte o guia de composição do docker: usando uma rede pré-existente (veja na parte inferior)
fonte
As informações das postagens anteriores estão corretas, mas não têm detalhes sobre como vincular contêineres, que devem ser conectados como "external_links".
Espero que este exemplo fique mais claro para você:
Suponha que você tenha app1 / docker-compose.yml, com dois serviços (svc11 e svc12), e app2 / docker-compose.yml com mais dois serviços (svc21 e svc22) e suponha que você precise se conectar de maneira cruzada:
svc11 precisa se conectar ao contêiner de svc22
Portanto, a configuração deve ser assim:
este é app1 / docker-compose.yml:
este é app2 / docker-compose.yml:
fonte
Desde o Compose 1.18 (especificação 3.5), você pode simplesmente substituir a rede padrão usando seu próprio nome personalizado para todos os arquivos do Compose YAML necessários. É tão simples quanto anexar o seguinte a eles:
Outras respostas apontaram o mesmo; este é um resumo simplificado.
fonte
Eu garantiria que todos os contêineres estivessem
docker-compose
na mesma rede, compondo-os juntos ao mesmo tempo, usando:fonte
link
oudepends_on
de um contêiner da frente para um contêiner de API?build path ~/front/api either does not exist or is not accessible
ou com o contrário,build path ~/api/front either does not exist or is not accessible
ATUALIZAÇÃO: A partir da versão 3.5 do arquivo de composição:
Me deparei com o problema semelhante e o resolvi adicionando uma pequena alteração em um dos meus projetos docker-compose.yml.
Por exemplo, temos duas APIs
scoring
ener
.Scoring
A API precisa enviar uma solicitação àner
API para processar a solicitação de entrada. Para fazer isso, ambos devem compartilhar a mesma rede.Nota: Cada contêiner possui sua própria rede, criada automaticamente no momento da execução do aplicativo na janela de encaixe. Por exemplo, a rede ner api será criada como
ner_default
e a pontuação da rede api será nomeada comoscoring default
. Esta solução funcionará para a versão: '3'.Como no cenário acima, minha API de pontuação deseja se comunicar com a ner api, então adicionarei as seguintes linhas. O que significa que sempre que eu crio o contêiner para ner api, ele é automaticamente adicionado à rede scoring_default.
ner / docker-compose.yml
scoring / docker-compose.yml
Podemos ver isso como os contêineres acima agora fazem parte da mesma rede chamada
scoring_default
usando o comando:fonte
Você pode adicionar um
.env
arquivo em todos os seus projetos que contêmCOMPOSE_PROJECT_NAME=somename
.COMPOSE_PROJECT_NAME substitui o prefixo usado para nomear recursos, pois todos os seus projetos usarão
somename_default
como sua rede, possibilitando que os serviços se comuniquem uns com os outros como estavam no mesmo projeto.Nota: você receberá avisos para contêineres "órfãos" criados a partir de outros projetos.
fonte
fonte
segundo docker-compose.yml
fonte
Outra opção é apenas executar o primeiro módulo com o 'docker-compose', verificar o ip relacionado ao módulo e conectar o segundo módulo à rede anterior, como externo, e apontar o ip interno.
exemplo app1 - nova rede criada nas linhas de serviço, marque como externo: true na parte inferior app2 - indique a "nova rede" criada pelo app1 quando subir, marque como externo: verdadeiro na parte inferior e defina na configuração para conectar, o ip que app1 tem nessa rede.
Com isso, você deve poder conversar um com o outro
* esse caminho é apenas para o foco no teste local, para não fazer uma configuração complexa demais ** eu sei que é muito 'remendado', mas funciona para mim e acho tão simples que alguns outros podem tirar proveito disso
fonte
Se você é
Connection refused
ao tentar se comunicar entre dois contêineresE você quer
api_a
comunicar comapi_b
(ou vice-versa) sem a mesma "rede docker"(exemplo abaixo)
você pode usar o "host" do segundo contêiner como o IP do seu computador e a porta mapeada de dentro do contêiner do Docker. Você pode obter o IP do seu computador com este script (em: Localizando endereços IP locais usando o stdlib do Python ):
Exemplo:
project_api_a/docker-compose.yml
:dentro
api_a
contêiner que você está executando no aplicativo Django:manage.py runserver 0.0.0.0:8000
e o segundo docker-compose.yml de outro projeto:
project_api_b/docker-compose-yml
:dentro
api_b
contêiner que você está executando no aplicativo Django:manage.py runserver 0.0.0.0:8001
E tentando conectar-se do contêiner
api_a
aoapi_b
URL deapi_b
contêiner será:http://<get_ip_from_script_above>:8001/
Pode ser especialmente valioso se você estiver usando ainda mais de dois (três ou mais) projetos de composição de encaixe e for difícil fornecer uma rede comum para tudo isso - é uma boa solução e solução alternativa
fonte