我正在使用名为 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/