从docker容器访问主机数据库

时间:2015-01-20 22:45:12

标签: docker

如果我在某台主机上运行了mysql数据库,并且该主机也在运行docker容器:我如何从主机上运行的docker容器中访问mysql数据库?

例如,有没有办法将主机端口发布到容器(docker run -p的反转)?

6 个答案:

答案 0 :(得分:76)

关于如何以一致,易于理解和便携的方式进行讨论,有几个长期的讨论。没有完整的解决方案,但我会将您链接到下面的讨论。

在任何情况下,许多人都想尝试使用--add-host选项进行docker run以将主机的ip地址添加到容器的/ etc / host文件中。从那里可以轻松连接到任何所需端口上的主机:

  

将条目添加到容器主文件

     

您可以使用以下方法将其他主机添加到容器的/ etc / hosts文件中   一个或多个--add-host标志。此示例为a添加静态地址   主机名为docker:

 $ docker run --add-host=docker:10.180.0.1 --rm -it debian
    $$ ping docker
    PING docker (10.180.0.1): 48 data bytes
    56 bytes from 10.180.0.1: icmp_seq=0 ttl=254 time=7.600 ms
    56 bytes from 10.180.0.1: icmp_seq=1 ttl=254 time=30.705 ms
    ^C--- docker ping statistics ---
    2 packets transmitted, 2 packets received, 0% packet loss
    round-trip min/avg/max/stddev = 7.600/19.152/30.705/11.553 ms
     

注意:有时您需要连接到Docker主机,这意味着   获取主机的IP地址。您可以使用以下shell   用于简化此过程的命令:

 $ alias hostip="ip route show 0.0.0.0/0 | grep -Eo 'via \S+' | awk '{ print $2 }'"
 $ docker run  --add-host=docker:$(hostip) --rm -it debian

文档:

https://docs.docker.com/engine/reference/commandline/run/

讨论从容器访问主机:

https://github.com/docker/docker/issues/1143

https://github.com/docker/docker/issues/10023

答案 1 :(得分:31)

来自18.03文档:

  

我想从容器连接到主机上的服务

     

主机具有更改的IP地址(如果您没有网络访问权限,则为无)。从18.03开始,我们建议连接到特殊DNS名称gateway.docker.internal,该名称解析为主机使用的内部IP地址。

     

网关也可以mysql://host.docker.internal:3306/my_awesome_database 访问。

实施例: 这是我在容器中用于访问MySQL实例的MySQL连接字符串的内容:

PreparedStatement statement = con.prepareStatement("insert into table 
 (jsonColumn) values (?::json)");
 statement.setString(1, jsonStr);

答案 2 :(得分:28)

从Docker 17.06起,Docker容器中提供了一个特殊的Mac-DNS DNS名称,可解析为主机的IP地址。它是:

<强> docker.for.mac.localhost

文档在这里: https://docs.docker.com/docker-for-mac/networking/#httphttps-proxy-support

答案 3 :(得分:13)

从Docker 18.03开始使用 host.docker.internal

答案 4 :(得分:4)

其他答案对我而言效果不佳。我的容器无法使用 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
    

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

答案 5 :(得分:-2)

如果要访问有数据库的Docker容器,则必须添加bash:

docker exec -it postgresql bash

postgresql是容器名称。

从内部通过bash访问DB,例如:

$psql -U postgres