繁体   English   中英

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

[英]How to access host DB from Docker container?

我有本地运行的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

以上似乎不起作用。 这两个: 从Docker容器内部,我如何连接到机器的本地主机?

我认为你的问题在于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

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

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

我将从这里抄袭我自己的答案:

其他答案对我来说效果不佳。 我的容器无法使用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的位置通过volume映射到主机上的目录,这样就可以从外部管理文件。

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

注意:您的数据库可能不允许外部连接。 在PostgreSQL的情况下,你需要编辑2个文件,描述在这里这里

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

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

     host all all 0.0.0.0/0 md5 

重要信息:除非您确定要执行的操作,否则不建议将更新数据库访问的最后一步用于生产。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM