É possível ter uma porta de acesso ao contêiner do Docker aberta pelo host? Concretamente, tenho o MongoDB e o RabbitMQ em execução no host e gostaria de executar um processo em um contêiner do Docker para ouvir a fila e (opcionalmente) gravar no banco de dados.
Eu sei que posso encaminhar uma porta do contêiner para o host (através da opção -p) e ter uma conexão com o mundo externo (por exemplo, internet) de dentro do contêiner Docker, mas gostaria de não expor as portas RabbitMQ e MongoDB do host para o mundo exterior.
EDIT: alguns esclarecimentos:
Starting Nmap 5.21 ( http://nmap.org ) at 2013-07-22 22:39 CEST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00027s latency).
PORT STATE SERVICE
6311/tcp open unknown
joelkuiper@vps20528 ~ % docker run -i -t base /bin/bash
root@f043b4b235a7:/# apt-get install nmap
root@f043b4b235a7:/# nmap 172.16.42.1 -p 6311 # IP found via docker inspect -> gateway
Starting Nmap 6.00 ( http://nmap.org ) at 2013-07-22 20:43 UTC
Nmap scan report for 172.16.42.1
Host is up (0.000060s latency).
PORT STATE SERVICE
6311/tcp filtered unknown
MAC Address: E2:69:9C:11:42:65 (Unknown)
Nmap done: 1 IP address (1 host up) scanned in 13.31 seconds
Eu tive que fazer esse truque para obter qualquer conexão com a Internet dentro do contêiner: Meu firewall está bloqueando as conexões de rede do contêiner do Docker para fora
EDIT : Eventualmente, eu fui com a criação de uma ponte personalizada usando tubulações e fazendo com que os serviços escutassem os IPs da ponte. Eu segui essa abordagem em vez de o MongoDB e o RabbitMQ ouvirem na ponte de encaixe, porque ela oferece mais flexibilidade.
fonte
lo
eeth0
.Uma maneira simples, mas relativamente insegura, seria usar a
--net=host
opçãodocker run
.Essa opção permite que o contêiner use a pilha de rede do host. Em seguida, você pode se conectar aos serviços em execução no host simplesmente usando "localhost" como o nome do host.
Isso é mais fácil de configurar, porque você não precisará configurar o serviço para aceitar conexões do endereço IP do seu contêiner de docker e não precisará informar ao contêiner de docking um endereço IP ou nome de host específico ao qual se conectar, apenas uma porta.
Por exemplo, você pode testá-lo executando o seguinte comando, que assume que sua imagem é chamada
my_image
, sua imagem inclui otelnet
utilitário e o serviço ao qual você deseja se conectar está na porta 25:Se você pensa em fazê-lo dessa maneira, consulte os cuidados sobre segurança nesta página:
https://docs.docker.com/articles/networking/
Diz:
fonte
--net=host
não funciona para permitir que o processo do contêiner se conecte à máquina host usandolocalhost
. Em vez disso, faça com que seu contêiner se conecte ao nomedocker.for.mac.host.internal
do host especial do MacOS apenas em vez delocalhost
. Não são necessários parâmetros extrasdocker run
para que isso funcione. Você pode passar isso como uma var env usando-e
se quiser manter sua plataforma de contêiner independente. Dessa forma, você pode se conectar ao host nomeado no env var e transmitirdocker.for.mac.host.internal
no MacOS elocalhost
no Linux.host.docker.internal
, consulte docdocker run --rm -it --net=host postgres bash
entãopsql -h host.docker.internal -U postgres
Você também pode criar um túnel ssh.
docker-compose.yml
:docker/Dockerfile.tunnel
:config/ssh/config
:Dessa forma, ele
elasticsearch
possui um túnel para o servidor com o serviço em execução (Elasticsearch, MongoDB, PostgreSQL) e expõe a porta 9200 com esse serviço.fonte
Eu tive um problema semelhante ao acessar um servidor LDAP a partir de um contêiner de docker. Eu configurei um IP fixo para o contêiner e adicionei uma regra de firewall.
docker-compose.yml:
regra do iptables:
iptables -A INPUT -j ACCEPT -p tcp -s 192.168.50.2 -d $192.168.50.1 --dport portnumberOnHost
Dentro do acesso ao contêiner
dockerhost:portnumberOnHost
fonte
Se o MongoDB e o RabbitMQ estiverem em execução no host, a porta já deverá estar exposta, pois não está no Docker.
Você não precisa da
-p
opção para expor portas do contêiner para o host. Por padrão, todas as portas estão expostas. A-p
opção permite expor uma porta do contêiner para a parte externa do host.Então, meu palpite é que você não precisa de
-p
nada e deve estar funcionando bem :)fonte