Recentemente, brinquei com o Docker e o QGIS e instalei um contêiner seguindo as instruções em neste tutorial .
Tudo funciona muito bem, embora eu não consiga me conectar a um banco de dados localhost postgres que contém todos os meus dados GIS. Eu acho que isso ocorre porque meu banco de dados do postgres não está configurado para aceitar conexões remotas e foi editando os arquivos conf do postgres para permitir conexões remotas usando as instruções deste artigo .
Ainda estou recebendo uma mensagem de erro quando tento me conectar ao meu banco de dados executando o QGIS no Docker: não foi possível conectar ao servidor: Connection refused Is the server running on host "localhost" (::1) and accepting TCP/IP connections to port 5433?
o servidor do postgres está em execução e editei meu pg_hba.conf arquivo para permitir conexões de vários Endereços IP (172.17.0.0/32). Eu havia consultado anteriormente o endereço IP do contêiner do docker usando docker ps
e, embora o endereço IP tenha sido alterado, ele até agora sempre esteve no intervalo 172.17.0.x
Alguma idéia de por que não consigo me conectar a este banco de dados? Provavelmente algo muito simples, eu imagino!
Estou executando o Ubuntu 14.04; Postgres 9.3
fonte
pg_hba.conf
para o endereço que você sugeriu, mas ainda recebe a mesma mensagem de erro de conexão após parar e reiniciar o serviço postgres. Adicionei a linha em minhas conexões ipv4 - existe algum outro lugar que devo adicionar o endereço que você sugere? Como alternativa, no meu aplicativo QGIS em execução no Docker, preciso alterar as informações de conexão do postgres? Por exemplo, se eu estiver conectando de dentro de um contêiner de docker, o host ainda será 'localhost'?localhost
não é o sistema host dentro do contêiner do Docker. Tente conectar-se ao endereço IP público do sistema host. Para manter o contêiner portátil, você também pode iniciá-lo com--add-host=database:<host-ip>
e simplesmente usardatabase
como nome do host para conectar-se ao seu host PostgreSQL de dentro do contêiner Docker./etc/postgresql/9.3/main/postgresql.conf
e adicionar oeth0
endereço IP do meu servidorlisten_addresses
. Por padrãolisten_addresses
, o postgres é vinculadolocalhost
apenas.host-ip
é o endereço IP da máquina virtual ou do container docker?Solução Docker para Mac
17.06 em diante
Graças ao comentário do @Birchlabs, agora é muito mais fácil com este nome DNS especial somente para Mac disponível :
A partir de 17.12.0-cd-mac46,
docker.for.mac.host.internal
deve ser usado em vez dedocker.for.mac.localhost
. Consulte a nota de lançamento para obter detalhes.Versão mais antiga
A resposta de @ helmbert explica bem o problema. Mas o Docker para Mac não expõe a rede da ponte , então tive que fazer esse truque para solucionar a limitação:
Abra
/usr/local/var/postgres/pg_hba.conf
e adicione esta linha:Abrir
/usr/local/var/postgres/postgresql.conf
e editar alteraçõeslisten_addresses
:Recarregue o serviço e inicie seu contêiner:
O que essa solução alternativa faz é basicamente o mesmo com a resposta do @ helmbert, mas usa um endereço IP anexado ao
lo0
invés dadocker0
interface de rede.fonte
docker.for.mac.localhost
. esse é o IP da sua máquina host. procure sua entrada no banco de dados de hosts do contêiner da seguinte forma:docker run alpine /bin/sh -c 'getent hosts docker.for.mac.localhost'
host.docker.internal
desde 18.03, outras opções ainda estão disponíveis, mas estão obsoletas ( Origem ).Solução simples para mac:
A versão mais recente do docker (18.03) oferece uma solução integrada de encaminhamento de porta. Dentro do contêiner do docker, basta definir o host db
host.docker.internal
. Isso será encaminhado para o host no qual o contêiner do docker está sendo executado.A documentação para isso está aqui: https://docs.docker.com/docker-for-mac/networking/#i-want-to-connect-from-a-container-to-a-service-on-the-host
fonte
host.docker.internal
limitado apenas a macs?Solução simples
Basta adicionar
--network=host
adocker run
. Isso é tudo!Este recipiente maneira usará rede do host, então
localhost
e127.0.0.1
irá apontar para o host (por padrão, eles apontam para um recipiente). Exemplo:fonte
No Ubuntu:
Primeiro, você deve verificar se a porta do banco de dados do Docker está disponível no sistema seguindo o comando -
Saída de amostra:
Aqui
3306
é usado como porta do banco de dados do Docker no IP 172.17.0.2, se essa porta não estiver disponível Execute o seguinte comando -Agora, você pode acessar facilmente o banco de dados do Docker a partir do sistema local seguindo a configuração
No CentOS:
Primeiro, verifique se a porta do banco de dados do Docker está disponível no firewall seguindo o comando -
Saída de amostra:
Aqui
3307
é usado como porta do banco de dados do Docker no IP 172.17.0.2, se essa porta não estiver disponível Execute o seguinte comando -No servidor, você pode adicionar a porta permanentemente
Agora, você pode acessar facilmente o banco de dados do Docker a partir do seu sistema local pela configuração acima.
fonte
A solução postada aqui não funciona para mim. Portanto, estou postando esta resposta para ajudar alguém que enfrenta um problema semelhante.
OS: Ubuntu 18
PostgreSQL: 9.5 (Hospedado no Ubuntu)
Docker: Aplicativo de Servidor (que se conecta ao PostgreSQL)
Estou usando o docker-compose.yml para criar aplicativos.
PASSO 1: Por favor, adicione
host.docker.internal:<docker0 IP>
Para encontrar o IP da janela de encaixe,
i.e. 172.17.0.1 (in my case)
você pode usar:OU
PASSO 2: No postgresql.conf, altere listen_addresses para
listen_addresses = '*'
PASSO 3: No pg_hba.conf, adicione esta linha
PASSO 4: Agora reinicie o serviço postgresql usando,
sudo service postgresql restart
ETAPA 5: Por favor, use o
host.docker.internal
nome do host para conectar o banco de dados a partir do Aplicativo do Servidor.Ex:
jdbc:postgresql://host.docker.internal:5432/bankDB
Aproveitar!!
fonte
para docker-compor você pode tentar apenas adicionar
exemplo:
https://docs.docker.com/compose/compose-file/#network_mode
fonte
Para configurar algo simples que permita uma conexão Postgresql do contêiner do docker ao meu host local, usei isso no postgresql.conf:
E adicionou este pg_hba.conf:
Depois, reinicie. Meu cliente do contêiner do docker (que estava em 172.17.0.2) pôde se conectar ao Postgresql em execução no meu host local usando o host: senha, banco de dados, nome de usuário e senha.
fonte
Mais uma coisa necessária para a minha configuração foi adicionar
para
/etc/hosts
para que o Docker aponte
172.17.0.1
como o nome do host do banco de dados e não dependa de um IP externo alterado para encontrar o banco de dados. Espero que isso ajude alguém com esse problema!fonte
database
host--add-host=database:172.17.0.1
ao executar o contêiner. Em seguida, aponte seu aplicativo para esse host. Isso evita a codificação embutida de um endereço IP dentro de um contêiner.--add-host=database:172.17.0.1
é preferívelA outra solução é o volume de serviço. Você pode definir um volume de serviço e montar o diretório de dados PostgreSQL do host nesse volume. Confira o arquivo de composição fornecido para obter detalhes.
Ao fazer isso, outro serviço PostgreSQL será executado no contêiner, mas usa o mesmo diretório de dados que o serviço PostgreSQL host está usando.
fonte