我有一个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地址的可达性。
编辑:我最终在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的方法。
这不是对实际问题的回答。这就是我解决类似问题的方法。解决方案完全来自:定义Docker容器网络,以便容器可以通信。感谢Nic Raboy
这里留给其他可能希望在一个容器和另一个容器之间进行REST调用的人。回答问题:在docker环境中使用什么来代替localhost?
了解您的网络看起来像docker网络
创建一个新的网络docker网络创建-d我的网络
启动第一个容器docker运行-d-p 5000:5000--network=“my net”--name“first_container”<MyImage1:v0.1>
查看第一个集装箱码头工人检查first_container的网络设置。“网络”:应该有“我的网”
启动第二个容器docker运行-d-p 6000:6000--network=“my net”--name“second_container”<MyImage2:v0.1>
检查第二个集装箱码头的网络设置,检查second_container。“网络”:应该有“我的网”
ssh到第二个容器docker exec-it secondcontainer sh或docker exec-it secondtainer bash中。
在第二个容器内部,可以通过ping first_container ping第一个容器。此外,您的代码调用如http://localhost:5000可以替换为http://first_container:5000