从Docker容器中访问主机的虚拟机

我正在使用本地计算机(Mac)和传统的虚拟机(称为sqlvm)(意思是我可以通过http:// sqlvm :)从本地主机访问这个虚拟机。 现在我在同一个本地主机(我的Mac)中设置了几个docker容器(使用docker-compose),它应该连接到虚拟机。 pymysql引发一个exception:

 OperationalError: (OperationalError) (2003, "Can't connect to MySQL server on 'sqlvm' ([Errno -2] Name or service not known)") None None 

我怎样才能暴露外部“sqlvm”内部dockernetworking?

编辑:我试图添加net: "host"的相关容器在yml文件中,并得到以下错误(在docker-compose up ):

 ERROR: for defaultworker Cannot create container for service defaultworker: Conflicting options: host type networking can't be used with links. This would result in undefined behavior 

我需要容器与“外部”和“内部”networking进行通信。

泊坞窗,compose.yml:

 recommendation-rabbit: image: rabbitmq:3-management hostname: my-rabbit ports: - "8080:15672" - "5672:5672" command: bash -c "rabbitmq-server start" defaultworker: image: rcom-worker hostname: rcom-worker-host environment: - CELERY_BROKER_URL=amqp://user:pass@my-rabbit:5672 command: bash -c "celery worker -A app -l info -Q default -c 2 -n defaultworker -Ofair" links: - recommendation-rabbit:rabbit net: "host" 

对于一个快速的解决scheme,你可以运行标志--net=host所有容器,这意味着--net=host容器将使用主机networking接口。 dockernetworking的更多信息可以在这里find。

你可以用vm做同样的事情。 所以现在VM和pymysql容器将有相同的networking接口,因此pymysql将工作。

还有其他方法可以做到这一点。

编辑 – 当你使用 – --net=host那么你有权访问主机networking接口,并不会需要链接之间的容器,因为他们已经有一个命令接口。

 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000 link/ether a0:48:1c:10:43:97 brd ff:ff:ff:ff:ff:ff 3: wlan1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000 link/ether fc:4d:d4:50:23:04 brd ff:ff:ff:ff:ff:ff inet 192.168.1.107/24 brd 192.168.1.255 scope global wlan1 valid_lft forever preferred_lft forever inet6 fe80::fe4d:d4ff:fe50:2304/64 scope link valid_lft forever preferred_lft forever 4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN link/ether 02:42:c8:46:60:1c brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 scope global docker0 valid_lft forever preferred_lft forever inet6 fe80::42:c8ff:fe46:601c/64 scope link valid_lft forever preferred_lft forever 

这对我来说是这样的。 所以可以观察到主机的networking接口wlan1存在。 现在vm应该将mysql服务器的端口暴露给主机,所以如果你可以使用主机访问它,那么可以使用容器来访问它。