我有一个Nginx在码头集装箱里运行。我在主机系统上运行了MySql。我想从我的容器中连接到MySql。MySql仅绑定到本地主机设备。
是否有任何方法可以从这个docker容器连接到这个MySql或本地主机上的任何其他程序?
这个问题与“如何从docker容器中获取docker主机的IP地址”不同,因为docker主机IP地址可以是网络中的公共IP或私有IP,而这些IP可能在docker容器内无法访问(如果托管在AWS或其他地方,我指的是公共IP)。即使你有docker主机的IP地址,这并不意味着你可以从容器内连接到docker主机,因为你的docker网络可能是overlay、host、bridge、macvlan、none等,这限制了该IP地址的可达性。
我做了一个类似于上述帖子的黑客,获取本地IP以映射到容器中的别名(DNS)。主要问题是使用一个在Linux和OSX中都有效的简单脚本动态获取主机IP地址。我在两种环境中都使用了这个脚本(即使在配置了“$LANG”!=“en_*”的Linux发行版中也是如此):
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 up
docker-compose.yml文件:
myapp:
build: .
ports:
- "80:80"
extra_hosts:
- "dockerhost:$DOCKERHOST"
然后改变http://localhost到http://dockerhost在您的代码中。
有关如何定制DOCKERHOST脚本的更高级指南,请阅读本文并解释其工作原理。
Windows 10解决方案
Docker社区版17.06.0-ce-2018 2017-06-28(稳定)
您可以使用主机docker.for.win.localhost的DNS名称解析为内部IP。(警告一些消息来源提到了窗口,但应该是赢家)
概述我需要做类似的事情,即从Docker容器连接到运行Azure Storage Emulator和CosmosDB Emulator的本地主机。
Azure Storage Emulator默认监听127.0.0.1,虽然您也可以更改IP的绑定,但我正在寻找一个可以使用默认设置的解决方案。
这也适用于从Docker容器连接到SQL Server和IIS,两者都在我的主机上以默认端口设置本地运行。
首先查看此答案,了解解决此问题所需的选项。但如果使用docker compose,则可以将network_mode:host添加到服务中,然后使用127.0.0.1连接到本地主机。这只是上述答案中描述的选项之一。下面你可以看到我是如何修改docker-compose.yml的https://github.com/geerlingguy/php-apache-container.git:
---
version: "3"
services:
php-apache:
+ network_mode: host
image: geerlingguy/php-apache:latest
container_name: php-apache
...
+表示我添加的行。
[附加信息]这在2.2版中也有效。和“host”或“host”都在docker compose中工作。
---
version: "2.2"
services:
php-apache:
+ network_mode: "host"
or
+ network_mode: host
...