所以我有一个在docker容器中运行的Nginx,我有一个运行在本地主机上的mysql,我想从我的Nginx中连接到MySql。MySql在本地主机上运行,不向外界公开端口,因此它绑定在本地主机上,而不是绑定到机器的ip地址上。
有没有办法从这个docker容器中连接到这个MySql或本地主机上的任何其他程序?
这个问题不同于“如何从docker容器中获取docker主机的IP地址”,因为docker主机的IP地址可以是网络中的公共IP或私有IP,这些IP可能是也可能无法从docker容器内访问(我指的是托管在AWS或其他地方的公共IP)。即使您拥有docker主机的IP地址,也不意味着您可以在给定该IP地址的情况下从容器内连接到docker主机,因为Docker网络可能是overlay、host、bridge、macvlan等,这限制了该IP地址的可达性。
发布于 2017-04-21 19:33:47
对于macOS和Windows
Docker v18.03及以上(自2018年3月21日起)
使用您的内部IP地址或连接到特殊的DNS名称host.docker.internal它将解析为主机使用的内部IP地址。
Linux支持挂起https://github.com/docker/for-linux/issues/264
Docker早期版本的MacOS
Docker for Mac v17.12至v18.02
与上面相同,但使用docker.for.mac.host.internal取而代之的是。
Docker for Mac v17.06到v17.11
与上面相同,但使用docker.for.mac.localhost取而代之的是。
Docker for Mac 17.05及更低版本
要从docker容器访问主机,必须将IP别名附加到网络接口。你可以绑定任何你想要的IP,只要确保你不会把它用在其他地方就行了。
sudo ifconfig lo0 alias 123.123.123.123/24
然后确保您的服务器正在侦听上面提到的IP,或者0.0.0.0..。如果它正在监听localhost127.0.0.1它将不接受该连接。
然后只需将您的docker容器指向此IP,您就可以访问主机!
要进行测试,您可以运行以下命令curl -X GET 123.123.123.123:3000在容器里面。
别名将在每次重新启动时重置,因此如果需要,请创建启动脚本。
此处提供了解决方案和更多文档:https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds
发布于 2020-07-27 17:52:38
使用
host.docker.internal而不是
localhost作品完美无瑕对我来说。?
发布于 2016-08-04 05:30:40
我做了一个类似于上面的帖子的技巧,让本地IP映射到容器中的别名(DNS)。主要的问题是使用一个简单的脚本来动态获取,该脚本既可以在Linux和OSX主机IP地址..。我编写了这个脚本,它可以在这两种环境中工作(甚至在Linux发行版中也是如此"$LANG" != "en_*"已配置):
ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d: | head -n1因此,使用Docker Compose,完整的配置将是:
启动脚本(docker-run.sh)
export DOCKERHOST=$(ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d: | head -n1)
docker-compose -f docker-compose.yml updocker-compose.yml
myapp:
build: .
ports:
- "80:80"
extra_hosts:
- "dockerhost:$DOCKERHOST"然后改变http://localhost至http://dockerhost在你的代码中。
有关如何自定义DOCKERHOST脚本,看一下此post并解释了它是如何工作的。
https://stackoverflow.com/questions/24319662
复制相似问题