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

标签 networking docker docker-compose

我正在使用名为 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 网络?

编辑:
我尝试添加 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

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

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"

最佳答案

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

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

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

编辑 - 当您使用 --net=host然后您可以访问主机网络接口(interface)并且不需要容器之间的链接,因为它们已经具有命令接口(interface)。

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存在,它是主机的网络接口(interface)。
现在 vm 应该将 mysql 服务器的端口暴露给主机,因此如果您可以使用主机访问它,那么可以使用容器访问它。

关于networking - 从 docker 容器访问主机的虚拟机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40328300/

相关文章:

linux - 如果您在一个 eth 设备上设置了多个 ip,那么端口是否允许为 1 个 eth 或 1 个 ip 共享?

PHP FPM Docker ZF1 : The session has already been started. 必须先设置 session ID

docker - 在 Docker Compose 中,.env 中的环境变量是捆绑在镜像内还是仅可用于容器?

docker - 根工作区的含义-执行docker run命令

java - 通过snmp获取设备名称和型号

java - 如何控制连接到 RMI 服务器的多个客户端线程

Python:如何 ping 一个 IP 地址范围?

docker - Circle CI Docker 服务不缓存 COPY

reactjs - 容器化的 ReactJs 应用程序(来自 nginx 图像)不提供所有路由

wordpress - WordPress 的 Docker 慢