从docker容器访问主机的虚拟机

时间:2016-10-30 10:51:42

标签: networking docker docker-compose

我正在使用名为sqlvm的遗留虚拟机的本地计算机(Mac)上工作(意味着我可以通过http://sqlvm :)从本地主机访问此虚拟机。 现在我在同一个本地主机(我的Mac)中设置了几个docker容器(使用docker-compose),它应该连接到vm。 pymysql引发异常:

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

我如何揭露外部' sqlvm'到内部docker网络?

修改 我已尝试在yml文件中为相关容器添加net: "host" 并获得以下错误(在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

我需要容器与外面的'和'内部'网络..

搬运工-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"

1 个答案:

答案 0 :(得分:2)

为了快速解决,您可以使用标志--net=host运行所有容器,这意味着docker容器将使用主机网络接口。有关码头网络的更多信息可以找到here

你可以用vm做同样的事情。所以现在vm和docker容器将具有相同的网络接口,因此pymysql将起作用。

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

编辑 - 当您使用--net=host时,您可以访问主机网络接口,并且不需要在容器之间进行链接,因为它们已经具有命令界面。

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

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