Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从docker容器访问主机数据库_Docker - Fatal编程技术网

从docker容器访问主机数据库

从docker容器访问主机数据库,docker,Docker,如果我有一个mysql数据库在某台主机上运行,而该主机也在运行docker容器:我如何从主机上运行的docker容器中访问mysql数据库 例如,是否有一种方法可以将主机端口发布到容器中(与docker run-p的功能相反)?关于如何以一致、易于理解和可移植的方式执行此操作,有一些长期的讨论。没有完整的解决方案,但我会将您链接到下面的讨论 在任何情况下,您都希望尝试使用--add host选项来运行docker,将主机的ip地址添加到容器的/etc/host文件中。从这里连接到任何所需端口上的

如果我有一个mysql数据库在某台主机上运行,而该主机也在运行docker容器:我如何从主机上运行的docker容器中访问mysql数据库


例如,是否有一种方法可以将主机端口发布到容器中(与docker run-p的功能相反)?

关于如何以一致、易于理解和可移植的方式执行此操作,有一些长期的讨论。没有完整的解决方案,但我会将您链接到下面的讨论

在任何情况下,您都希望尝试使用--add host选项来运行docker,将主机的ip地址添加到容器的/etc/host文件中。从这里连接到任何所需端口上的主机都很简单:

向容器主机文件添加条目

您可以使用将其他主机添加到容器的/etc/hosts文件中 一个或多个--添加主机标志。此示例为 名为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
文件:

关于从容器访问主机的讨论:


从Docker 17.06起,Docker容器中有一个专用的仅限Mac的DNS名称,解析为主机的IP地址。它是:

docker.for.mac.localhost

文件如下:

从docker 18.03开始使用主机.docker.internal。

从docker 18.03开始:

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

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

网关也可以通过
gateway.docker.internal
访问

例如: 以下是我在容器中使用的MySQL连接字符串,用于访问主机上的MySQL实例:

mysql://host.docker.internal:3306/my_awesome_database

其他答案对我来说不太合适。我的容器无法使用host.docker.internal解析主机ip。有两种方法

  • 共享主机网络--网络=主机:

    docker run -it --net=host  myimage
    
  • 使用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个文件,如下所述:

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

    listen_addresses = '*'
    
  • 编辑pg_hba.conf以允许从所有地址进行连接。在最后一行添加:

    host     all             all             0.0.0.0/0               md5
    

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

    如果您希望访问存在DB的Docker容器,则必须添加bash:

    docker exec -it postgresql bash
    
    postgresql是容器名称

    进入后,从bash访问数据库,例如:

    $psql -U postgres
    

    如果MySQL服务器正在侦听某个端口,那么容器不能像任何其他internet连接一样连接到该端口上的主机吗?
    docker.for.mac.host.internal
    from
    docker 17.12.0 ce
    docker.for.mac.localhost
    如何在
    18.03.1-ce-mac65上工作?你能举一个如何使用它的例子吗?为什么不运行一个DockerMySQL?DockerVersion18.03.0-ce,build 0520e24不适合我,想象一下下面的场景,在开发环境中,你有一些数据库在生产环境中监听127.0.0.1:3306,你的数据库监听127.0.0.1:3306,在本地它是本地数据库,生产它是云的代理,您必须在本地docker mysql,并为生产找到另一个解决方案,或者您可以从docker连接到端口,它对这两种情况都有效Docker.for.mac.localhost在
    18.03.1-ce-mac65上对我有效,正如提示:这只对mac有效,并且迄今为止赢得了投票。不仅仅是因为答案,而是因为你应该知道如何在一个例子中使用它。我几乎花了2个小时来实现这一点,非常感谢。对于那些好奇的人来说,@flp写的仍然没有linux支持。这是.NET中的.This是我的连接字符串,它无法从docker中找到数据库“server=gateway.docker.internal;user=root;database=mydb;port=3306;password=”也尝试了“host.docker.internal”-NET=host在CI环境中为我工作,非常感谢!它是否也会在NGINX反向代理后工作?这并不能回答这个问题。OP询问如何从需要连接的容器连接到主机上运行的PSQL数据库。您的解决方案完全相反,您正在将一个shell附加到运行PSQL的容器。