如何从Docker容器访问主机数据库?

时间:2017-06-13 14:42:18

标签: postgresql docker

我有本地运行的PostgreSQL数据库和一个想要连接的应用程序的Docker容器。

如何从docker内部访问localhost数据库?

docker run --rm -e "DATABASE_URL=postgresql://postgres:postgres@127.0.0.1:5432/my_db" --network="host" -p 4000:4000 my_image

以上似乎不起作用。这个都不是:From inside of a Docker container, how do I connect to the localhost of the machine?

3 个答案:

答案 0 :(得分:0)

我认为你的问题在于param net。在文档中谈论--network

docker run --rm -e "DATABASE_URL=postgresql://postgres:postgres@127.0.0.1:5432/my_db" --network="host" -p 4000:4000 my_image

答案 1 :(得分:0)

您拥有的设置应该可以正常工作,因此问题可能出在PostgreSQL的配置上。我能想到的第一个可能的配置设置是bind address。默认情况下,这被设置为仅接受来自localhost的连接,但由于Docker容器将拥有自己的ip地址,因此PostgreSQL不会接受来自容器的流量。尝试将其设置为listen_addresses(0.0.0.0)以查看是否可以解决您的问题。

另请注意始终使用127.0.0.1作为地址,因为localhost并不总是有效。

答案 2 :(得分:0)

我会窃here中的答案:

其他答案对我而言效果不佳。我的容器无法使用 host.docker.internal 解析主机ip。有两种方法

  1. 共享主机网络--net = host:

    docker run -it --net=host  myimage
    
  2. 使用docker的ip地址,通常为 172.17.0.1 。 您可以通过调用ifconfig命令并抓住docker接口的inet addr来检查它

    user@ubuntu:~$ ifconfig
    docker0   Link encap:Ethernet  HWaddr 02:42:a4:a2:b2:f1  
      inet addr:172.17.0.1  Bcast:0.0.0.0  Mask:255.255.0.0
      inet6 addr: fe80::42:a4ff:fea2:b2f1/64 Scope:Link
    

一旦有了该IP地址,就可以将其作为参数传递给docker run,然后传递给应用程序,或者像我一样,通过卷将jdbc.properties的位置映射到主机上的目录,以便进行管理外部文件。

  docker run -it -v /host_dir/docker_jdbc_config:${jetty_base}/var/config myimage

注意:您的数据库可能不允许外部连接。对于postgresql,您需要编辑2个文件,如herehere所述:

  1. 编辑postgresql.conf以侦听所有地址。默认情况下,它将指向localhost。

    listen_addresses = '*'
    
  2. 编辑pg_hba.conf以允许来自所有地址的连接。在最后一行添加:

    host     all             all             0.0.0.0/0               md5
    

重要提示:不建议在生产中使用最后一步更新数据库访问权限,除非您确实确定自己在做什么。