【问题标题】:accessing host's virtual machine from docker container从 docker 容器访问主机的虚拟机
【发布时间】:2016-10-30 10:51:42
【问题描述】:

我正在使用名为 sqlvm 的旧版虚拟机在本地机器 (Mac) 上工作(意味着我可以通过 http://sqlvm:) 从本地主机访问此 vm。 现在我在应该连接到 vm 的同一本地主机(我的 Mac)中设置了几个 docker 容器(使用 docker-compose)。 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

我需要容器与“外部”和“内部”网络进行通信..

docker-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"

【问题讨论】:

  • 你用的vm是什么网络模式?例如。网桥、主机等
  • 我认为它配置为 NAT
  • @GIRISHRAMNANI 你为什么删除你的答案?你能帮忙吗?
  • 我删除了答案,因为我要写一个不同的答案,因为现在我有更多信息。但我现在要编辑它。
  • 太棒了。乐于助人

标签: networking docker docker-compose


【解决方案1】:

为了快速解决问题,您可以运行带有标志 --net=host 的所有容器,这意味着 docker 容器将使用主机网络接口。更多关于 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 服务器的端口暴露给主机,因此如果您可以使用主机访问它,那么可以使用容器访问它。

【讨论】:

  • 但我不能只将--net=host 添加到docker compose up 对吧?
  • 如何在 docker-compose.yml 文件中实现它?
  • 您也可以共享 docker-compose.yml 文件吗?那真的很有帮助。
  • 刚刚添加了文件
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-17
  • 1970-01-01
  • 1970-01-01
  • 2020-02-17
相关资源
最近更新 更多