AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 705600
Accepted
Maestro
Maestro
Asked: 2022-06-10 11:16:00 +0800 CST2022-06-10 11:16:00 +0800 CST 2022-06-10 11:16:00 +0800 CST

Alcance a porta do host do contêiner quando o proxy userland estiver desabilitado

  • 772

Eu tenho um contêiner em uma rede em ponte. Ele pode alcançar o host sem problemas e conectar-se a todas as portas do host, EXCETO para portas que foram publicadas por outros contêineres.

Eu tenho o proxy userland desabilitado, então acho que pode ter algo a ver com a forma como o docker configura as regras do iptable.

Existe uma maneira simples de permitir que o contêiner alcance as portas publicadas por outros contêineres (executando em diferentes redes em ponte)?

Gostaria de evitar colocar os dois contêineres na mesma rede ou alternar para a rede de host.

docker
  • 1 1 respostas
  • 144 Views

1 respostas

  • Voted
  1. Best Answer
    larsks
    2022-06-10T12:22:38+08:002022-06-10T12:22:38+08:00

    Não consigo reproduzir seu problema.

    Eu tenho duas redes em ponte do Docker definidas:

    eecf335e7600   net1                   bridge    local
    5c7ca74637b0   net2                   bridge    local
    

    Eu inicio o container c1na rede net1, publicando a porta do container para a porta 8080do host 8081:

    $ docker run -d --rm --net net1 -p 8081:8080 --name c1 \
      --add-host host.docker.local:host-gateway  alpinelinux/darkhttpd
    

    Eu inicio o container c2na rede net2, publicando a porta do container para a porta 8080do host 8082:

    $ docker run -d --rm --net net2 -p 8082:8080 --name c2 \
      --add-host host.docker.local:host-gateway  alpinelinux/darkhttpd
    

    Agora de dentro do container c1eu posso acessar o web service no container c2acessando host port 8082:

    $ docker exec c1 wget -O- http://host.docker.local:8082
    Connecting to host.docker.local:8082 (172.17.0.1:8082)
    writing to stdout
    -                    100% |********************************|   191  0:00:00 ETA
    written to stdout
    <html>
    <head>
    ...
    

    E do container c2eu posso acessar o web service no container c1acessando host port 8081:

    $ docker exec c2 wget -O- http://host.docker.local:8081
    Connecting to host.docker.local:8081 (172.17.0.1:8081)
    writing to stdout
    -                    100% |********************************|   191  0:00:00 ETA
    written to stdout
    <html>
    <head>
    ...
    

    Tudo parece funcionar como anunciado. Se você obtiver resultados diferentes repetindo o mesmo conjunto de etapas, a primeira coisa que eu verificaria é ver se você tem regras de firewall em seu host que podem estar interferindo no tráfego.

    Atualizar

    Como esperado, o comportamento é o mesmo se eu apenas escolher um endereço de host em vez de usar a --add-hostopção. Por exemplo, se eu tiver:

    $ ip -o addr |grep -o '.*inet [^ ]*'
    1: lo    inet 127.0.0.1/8
    2: eth0    inet 192.168.123.106/24
    4: docker_gwbridge    inet 172.23.0.1/16
    8: br-70f125dc5b7d    inet 192.168.208.1/20
    15: br-a87cc1462629    inet 172.29.0.1/16
    18: docker0    inet 172.17.0.1/16
    35: br-eecf335e7600    inet 172.18.0.1/16
    36: br-5c7ca74637b0    inet 172.19.0.1/16
    

    Então tudo isso funciona:

    $ docker exec c2 wget -O- 192.168.123.106:8081 | head -3
    Connecting to 192.168.123.106:8081 (192.168.123.106:8081)
    writing to stdout
    -                    100% |********************************|   191  0:00:00 ETA
    written to stdout
    <html>
    <head>
     <title>/</title>
    $ docker exec c2 wget -O- 172.29.0.1:8081 | head -3
    Connecting to 172.29.0.1:8081 (172.29.0.1:8081)
    writing to stdout
    -                    100% |********************************|   191  0:00:00 ETA
    written to stdout
    <html>
    <head>
     <title>/</title>
    $ docker exec c2 wget -O- 172.18.0.1:8081 | head -3
    Connecting to 172.18.0.1:8081 (172.18.0.1:8081)
    writing to stdout
    -                    100% |********************************|   191  0:00:00 ETA
    written to stdout
    <html>
    <head>
     <title>/</title>
    

    etc.

    Eu não mencionei isso na pergunta, porque eu tinha certeza que já tinha esse problema antes de desativá-lo ...

    Essa é uma mudança de configuração bastante substancial em relação ao padrão :).

    Se eu desabilitar o proxy userland, tudo para de funcionar.

    Este artigo pode ser interessante:

    Na seção anterior, identificamos dois cenários em que o Docker não pode usar as regras de NAT do iptables para mapear uma porta publicada para um serviço de contêiner:

    • Quando um contêiner conectado a outra rede Docker tenta acessar o serviço (o Docker está bloqueando a comunicação direta entre as redes Docker);
    • Quando um processo local tenta acessar o serviço por meio da interface de loopback.

    Em ambos os casos, o Docker usa um proxy TCP ou UDP userland (processo Linux). Você pode identificar facilmente o proxy com o comando netstat depois de iniciar um contêiner com uma porta publicada (mais uma vez usaremos nosso aplicativo Flask padrão):

    • 1

relate perguntas

  • incapaz de extrair imagens no kubernetes do registro privado

  • Conectando-se a um host docker!

  • Qual é o propósito da instrução VOLUME em um Dockerfile?

  • Como instalo o docker no RHEL 7 offline?

  • Preciso executar este arquivo de script apenas uma vez?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve