我正在使用名为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"
答案 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服务器的端口暴露给主机,所以如果你可以使用主机访问它,那么可以使用容器访问它。