如果我在某台主机上运行了一个mysql数据库,并且该主机也在运行一个docker容器:我如何从主机上运行的docker容器中访问mysql数据库?
例如,有没有办法将主机端口发布到容器(docker run -p的反转)?
Joh*_*one 82
关于如何以一致,易于理解和便携的方式进行此类讨论,有几个长期的讨论.没有完整的解决方案,但我会将您链接到下面的讨论.
在任何情况下,许多人都想尝试使用--add-host选项来停靠运行,以将主机的IP地址添加到容器的/ etc/host文件中.从那里,在任何所需端口上连接到主机是微不足道的:
将条目添加到容器主机文件
您可以使用一个或多个--add-host标志将其他主机添加到容器的/ etc/hosts文件中.此示例为名为docker的主机添加静态地址:
Run Code Online (Sandbox Code Playgroud)$ 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命令来简化此过程:
Run Code Online (Sandbox Code Playgroud)$ 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
Kev*_*hen 48
从18.03文档:
我想从容器连接到主机上的服务
主机具有更改的IP地址(如果您没有网络访问权限,则为无).从18.03开始,我们建议连接到特殊DNS名称
host.docker.internal,该名称解析为主机使用的内部IP地址.网关也可以访问
gateway.docker.internal.
示例:这是我用于容器内的MySQL连接字符串以访问主机上的MySQL实例的内容:
mysql://host.docker.internal:3306/my_awesome_database
Run Code Online (Sandbox Code Playgroud)
小智 30
从Docker 17.06开始,Docker容器中提供了一个特殊的Mac-DNS DNS名称,可解析为主机的IP地址.它是:
docker.for.mac.localhost
文档在这里:https: //docs.docker.com/docker-for-mac/networking/#httphttps-proxy-support
小智 19
从Docker 18.03开始使用host.docker.internal.
其他答案对我而言效果不佳。我的容器无法使用解析主机IP host.docker.internal。有两种方法
共享主机网络--net = host:
docker run -it --net=host myimage
Run Code Online (Sandbox Code Playgroud)使用docker的ip地址,通常是172.17.0.1。您可以通过调用ifconfig命令并抓住docker interface的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
Run Code Online (Sandbox Code Playgroud)一旦有了该IP地址,就可以将其作为参数传递给docker run,然后传递给应用程序,或者像我一样,通过卷将jdbc.properties的位置映射到主机上的目录,以便可以从外部管理文件。
docker run -it -v /host_dir/docker_jdbc_config:${jetty_base}/var/config myimage
Run Code Online (Sandbox Code Playgroud)
注意:您的数据库可能不允许外部连接。对于postgresql,您需要编辑2个文件,如此处和此处所述:
编辑postgresql.conf以侦听所有地址。默认情况下,它将指向localhost。
listen_addresses = '*'
Run Code Online (Sandbox Code Playgroud)编辑pg_hba.conf以允许来自所有地址的连接。在最后一行添加:
host all all 0.0.0.0/0 md5
Run Code Online (Sandbox Code Playgroud)重要说明:建议不要在生产中使用最后一步更新数据库访问权限,除非您确实确定自己在做什么。
| 归档时间: |
|
| 查看次数: |
69083 次 |
| 最近记录: |