Nenhuma rota para hospedar no contêiner de docker

8

Estou executando um contêiner de janela de encaixe Debian em uma máquina Windows 10 que precisa acessar um URL específico na porta 9000 ( 164.16.240.30:9000)

A máquina host pode acessá-lo bem através do browser, no entanto, quando eu faça o login para o terminal e executar wget 172.17.240.30:9000recebo failed: No route to host.

Na tentativa de resolver isso, adicionei:

ports:
  - 9000:9000

para o arquivo docker-compose.yml, no entanto, isso não parece ter feito diferença.

Caso você não consiga adivinhar que sou novo nisso, o que você tentaria a seguir?

Arquivo docker-compose.yml inteiro:

version: '3.4'

services:
  tokengeneratorapi:
    network_mode: host
    image: ${DOCKER_REGISTRY}tokengeneratorapi
    build:
      context: .
      dockerfile: TokenGeneratorApi/Dockerfile
    ports:
      - 5000:80
      - 9000
    environment:
      ASPNETCORE_ENVIRONMENT: local
      SSM_PATH: /ic/env1/tokengeneratorapi/
      AWS_ACCESS_KEY_ID: 
      AWS_SECRET_ACCESS_KEY: 

Comando que estou executando:

docker-compose build --build-arg BRANCH=featuretest --build-arg CHANGE_ID=99 --build-arg CHANGE_TARGET=develop --build-arg SONAR_SERVER=164.16.240.30
m.edmondson
fonte
Tente simular o navegador via wget, como stackoverflow.com/questions/43182879/using-wget-to-fake-browser Pode ser um firewall que corta a conexão. Tente também desativar o ufw ( wiki.debian.org/Uncomplicated%20Firewall%20%28ufw%29 ): "sudo service ufw stop" se estiver instalado e ativado.
Janes Botis
1
Seu contêiner precisa de acesso 164.16.240.30:9000, que não está sendo executado em sua máquina. Seu navegador tem acesso a esse 164.16.240.30:9000recurso, mas o contêiner não. Estou certo? Por que você está tentando obter recursos diferentes 172.17.240.30:9000do terminal e não 164.16.240.30:9000?
Jan Garaj
Verifique se você não possui nenhuma entrada de proxy no seu arquivo ~ / .wgetrc.
Gautam
até onde eu entendi, o proxy tokengeneratorapi solicita a algum servidor de sonar. Isso está correto? Temos certeza de que o tokengeneratorapi encaminha corretamente para a porta 9000? o próximo passo pode ser fazer login no contêiner e segmentar com obter ou enrolar o servidor de sonar: 9000. E se estiver bem, para direcionar seu "aplicativo" tokengeneratorapi como 127.0.0.1:9000 e garantir que ele avance corretamente (ainda dentro do contêiner)
grodzi 14/03
Ainda não está claro o seu problema, você está dizendo que 'do contêiner não é possível acessar 164.16.240.30:9000? Quando você diz que I log in to the terminal and runestá dentro do contêiner? e por que você está usando IP 172.17.240.30 diferente vs 164.16.240.30
Vikrant Pawar

Respostas:

1

Parece que o contêiner está com problemas de conectividade, portanto é provável que sua solução proposta não funcione, pois é apenas o mapeamento de uma porta de host para uma porta de contêiner (considerando que o URL de destino não é o host real).

Confira https://docs.docker.com/compose/compose-file/#network_mode e tente configurá-lo como host.

agermain
fonte
Tentei isso sem sucesso, por favor, consulte a pergunta atualizada
m.edmondson
Para adicionar isso, parece que 'host' não funciona em um host não-linux docs.docker.com/network/network-tutorial-host
m.edmondson
Boa captura, minhas desculpas por isso! Você pode verificar se não é um problema de firewall? O firewall precisa permitir conexões dos contêineres do docker através do host.
agermain 8/03
Não tenho certeza de como eu faria isso, já que o host é o Windows 10. Além disso, as conexões com a Internet funcionam por exemplo, wget www.google.co.ukretornam 200. Talvez isso seja uma coisa do Linux, talvez o iptables?
m.edmondson 8/03
Você está por trás de um proxy da empresa? Tente docker network prune. Além disso, em que a imagem se baseia?
agermain 8/03
1

Seu navegador tem acesso 164.16.240.30:9000, porque está passando por proxy (ambiente típico de empresa), e the proxytambém por conectividade de rede 164.16.240.30. Isso não significa que também o seu host tenha a mesma conectividade de rede. Na verdade, parece que seu host não possui esse. Essa é a razão pela qual o wget direto do contêiner ou do terminal tem erro No route to host.

Tudo deve passar pelo proxy. Tente configurar o proxy corretamente - os aplicativos Linux http_proxy,https_proxygeralmente usam variáveis ​​de ambiente , mas os aplicativos podem ter uma opção própria para configurar o proxy; eventualmente, você pode configurá-lo no nível do código-fonte. Depende do aplicativo / código usado.

Jan Garaj
fonte
1

Acho que o problema é que você usa o modo host no seu arquivo de configuração de composição do docker e você tem o firewall IPTABLES permitido para as portas na máquina debian? E as janelas?

network_mode: host 

que na verdade ignora completamente a ponte da janela de encaixe para que a seção de portas especificada não seja aplicada. Todas as portas serão abertas no sistema host. Você pode verificar com

nestat -tunlp | grep 5000

E você verá que a porta 5000 não está aberta e mapeada para os 80 da janela de encaixe, como seria de esperar. No entanto, as portas 80 e 9000 devem estar abertas na rede debian, mas não ligadas a nenhuma ponte docker apenas ao ip debian.

A partir daqui: https://docs.docker.com/network/host/

AVISO: As portas publicadas são descartadas ao usar o modo de rede host

Como solução poderia ser remover a linha network_mode e funcionará conforme o esperado.

Jinxmcg
fonte
0

Seu código não permite que seu contêiner acesse 164.16.240.30:9000. Você deve 164.16.240.30:9000sair do terminal em vez de 172.17.240.30:9000.

boi yeet
fonte