从 Docker 容器连接到主机上的服务的规范方法

Posted

技术标签:

【中文标题】从 Docker 容器连接到主机上的服务的规范方法【英文标题】:Canonical Way to Connect to Service on Host from Docker Container 【发布时间】:2015-01-18 05:44:36 【问题描述】:

在 SO 上有一些类似的问题,例如 this one,但据我所知,Docker 生态系统自从被问到之后发生了很大变化,我仍然无法在任何地方找到规范的答案。

那么,如果我的主机上运行着像 Redis 这样的数据库,并且我希望我的容器能够访问它,那么规范的方法是什么?

【问题讨论】:

【参考方案1】:

除非您有防火墙之类的东西阻止它(正如您提到的问题所做的那样),否则您只需连接到它,就好像您在另一台机器上一样。

您的容器将拥有自己的 IP 地址和虚拟以太网设备; Docker 将通过 Docker 桥设置从该设备到主机的路由;它应该一切正常。

我可以想到十几个其他原因让您遇到麻烦,但会让您提及您遇到的具体问题。

【讨论】:

【参考方案2】:

经过大量研究,我发现了两种支持的方式:

    在同一主机上的另一个容器中运行您的服务。然后您可以使用--link 将两者连接起来。更多信息here。 如果像我一样,你想模拟让服务在 Docker 容器之外运行(因为这是你在 prod 中运行的方式,或者因为将服务移动到 docker 容器中太麻烦了,或者任何其他原因),您可以通过将有关您的主机的信息传递给 Docker 来做到这一点,以便它认为它是任何其他计算机。如果你使用 boot2docker,你的主机总是映射到 192.168.59.3,所以我要做的就是创建一个别名,并在运行时使用--add-host 标志告诉 Docker。示例:docker run --add-host=localbox:192.168.59.3 ...。现在让我点击别名“localbox”从 Docker 中访问本地主机上的任何内容。例如,要从 Docker 内部连接到 localhost 上的 mysql,我只需执行 mysql -h localbox

最后,对 #2 的警告:您的服务会将尝试从 Docker 内部连接到本地主机上的服务的内容视为外部进程,因此要使其正常工作,您需要确保服务未在监听仅在 127.0.0.1 上,根据您添加的内容,您需要打开防火墙以允许根据需要进行连接。

【讨论】:

以上是关于从 Docker 容器连接到主机上的服务的规范方法的主要内容,如果未能解决你的问题,请参考以下文章

如何将安装在主机服务器上的 phpmyadmin 连接到正在运行的 docker 容器内的 maria db? [关闭]

如何从 Docker 容器中的 python 脚本连接到 Ubuntu 上的本地 SQL 服务器

Mariadb docker容器无法使用Python连接到主机上的MySQL服务器(111连接被拒绝)

从 docker 容器(linux 上的 docker)访问主机 postgresql

如何从 docker 容器中的 python 脚本连接到 localhost 上的 mysql 数据库

尝试从主机连接到 mysql docker 容器时出现“读取初始通信数据包”错误