我有一个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地址的可达性。


当前回答

首先查看此答案,了解解决此问题所需的选项。但如果使用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
...

其他回答

编辑:我最终在GitHub上制作了这个概念的原型。退房:https://github.com/sivabudh/system-in-a-box


首先,我的答案面向两组人:使用Mac的人和使用Linux的人。

主机网络模式在Mac上不起作用。您必须使用IP别名,请参阅:https://stackoverflow.com/a/43541681/2713729

什么是主机网络模式?参见:https://docs.docker.com/engine/reference/run/#/network-设置

其次,对于那些正在使用Linux的人(我的直接经验是Ubuntu 14.04 LTS,我很快就会升级到16.04 LTS),是的,您可以让Docker容器中运行的服务连接到Docker主机上运行的localhost服务(例如,您的笔记本电脑)。

How?

关键是当你运行Docker容器时,你必须以主机模式运行它。命令如下所示:

docker run--network=“host”-id<docker image id>

当你在容器中执行ifconfig(你需要apt-get-install-net-tools你的容器才能调用ifconfig)时,你会看到网络接口与Docker主机上的相同(例如你的笔记本电脑)。

需要注意的是,我是Mac用户,但我在Parallels下运行Ubuntu,所以使用Mac不是缺点

这就是将NGINX容器连接到本地主机上运行的MySQL的方法。

Mac OSX最简单的解决方案

只需使用Mac的IP地址。在Mac上,运行以下命令以获取IP地址并在容器中使用:

ifconfig | grep 'inet 192'| awk '{ print $2}'

只要在Mac上本地运行的服务器或在另一个docker容器中运行的服务器正在侦听0.0.0.0,docker容器就可以到达该地址。

如果您只想访问另一个侦听0.0.0.0的docker容器,可以使用172.17.0.1

在Windows 10 Home上使用Docker Toolbox时,没有一个答案对我有效,但10.0.2.2有效,因为它使用VirtualBox,将主机暴露给该地址上的VM。

尽管有很多冗长而令人困惑的答案,但还是有一个简短的答案。如果您的docker网桥网络为172.17.0.0/16,请执行以下操作:

将容器绑定到172.17.0.1,例如-p 172.17.0.1:8080:8080(Docker网桥网络中的网关)只需访问172.17.0.1端口8080,例如curlhttp://172.17.0.1:8080/来自其他容器

您可以使用alpine映像获取主机ip

docker run --rm alpine ip route | awk 'NR==1 {print $3}'

这将更加一致,因为您总是使用alpine来运行命令。

类似于Mariano的回答,您可以使用相同的命令设置环境变量

DOCKER_HOST=$(docker run --rm alpine ip route | awk 'NR==1 {print $3}') docker-compose up