当前位置: 首页 > 知识库问答 >
问题:

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

韦俊英
2023-03-14

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

共有1个答案

邢杰
2023-03-14

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

您可以对虚拟机做同样的事情。所以现在vm和docker容器将有相同的网络接口,因此< code>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服务器的端口暴露给主机,因此如果您可以使用主机访问它,那么它可以使用容器访问。

 类似资料:
  • 我有一个docker应用程序,我使用以下docker compose。yml运行它: 我有一个没有docker化的服务器在我的机器上运行,我可以通过访问它。我希望我的服务能够访问它。 我发现有人建议在我的服务配置中添加以下内容: 但是当我添加这个时,并尝试,我得到。当我尝试<code>curl时,也会出现同样的错误http://host.docker.internal:3000。 我拼命地尝试将端

  • 问题内容: 如何在使用Vagrant / Virtualbox的2 centos VM与使用docker for mac的docker容器之间设置网络。他们都需要能够相互访问。 目前,我无法从Docker容器中访问虚拟机。 流浪汉设置: 虚拟机可以互相访问,但Docker容器无法访问虚拟机 问题答案: 您需要连接运行docker容器的网络和将无业游民的VM引导到主机上同一桥设备的网络: 1. 创建

  • 问题内容: 我是Docker的新手。 我运行了一个10节点的图像,并在运行的容器中克隆了一个存储库,运行了使用文件监视程序启动服务器的应用程序。我需要访问容器内的代码库,并在Windows主机上运行的IDE中打开它。如果完成了,那么我还希望当我在IDE中更改文件时,这些更改会在容器中引起文件监视程序。 任何帮助表示赞赏。谢谢, 问题答案: 您正在寻找的概念称为卷。您需要启动一个容器并在其中安装主机

  • 问题内容: 使用ubuntu tusty,在远程计算机上运行了一项服务,我可以通过SSH隧道通过端口转发访问该服务。 我正在运行一个Docker容器。我需要通过主机的隧道从容器内部访问该远程服务。 我尝试使用进行从容器到主机的隧道传输,然后从容器内部通过访问服务失败。为了检查端口映射是否打开,我尝试了 在此之后,parag。2,但即使 在集装箱处也没有察觉的交流 我还尝试通过映射端口,但是这报告绑

  • 我有一个码头集装箱在运行。我需要通过主机的隧道从容器内访问远程服务。 我尝试用从容器中隧道到主机,然后通过从容器中访问服务失败。为了检查端口映射是否打开,我尝试 接下来,帕拉格。2但是,即使在容器上执行也没有感觉到通信 2-测试连接是否正常的快速方法是什么?最好是通过巴什。 谢了。

  • 问题内容: 如果我在某个主机上运行mysql数据库,并且该主机也正在运行docker容器:我如何从主机上运行的docker容器中访问mysql数据库? 例如,是否有一种方法可以将主机端口发布到容器(与docker run -p的作用相反)? 问题答案: 关于如何以一致的,易于理解的和可移植的方式执行此操作的问题已有很长时间的讨论。尚无完整的解决方案,但我会将您链接到下面的讨论。 无论如何,您都想尝