RocketMQ中mac上安装docker后启动docker服务docker是没有创建默认的docker0虚拟网桥,mac宿主机无法ping通docker分配给容器的ip,那为什么正常启动容器后在本地能通过127.0.0.1+端口号的方式访问容器呢?
当您使用 Docker 或其他容器运行时工具启动RocketMQ容器时,通常会指定宿主机(本地机器)与容器内部服务端口之间的端口映射。例如,您可以使用 -p 参数将容器内部的RocketMQ服务端口(如9876、10911等)映射到宿主机的某个端口。
在Mac上使用Docker时,Docker不是通过传统的docker0
虚拟网桥与宿主机进行通信的。在Mac上,Docker Desktop使用HyperKit虚拟化技术以及一个名为docker.for.mac.localhost
或host.docker.internal
的特殊DNS条目来实现宿主机与容器之间的网络通信。
当您在Mac上运行Docker容器,并且容器中运行了一个Web服务监听在某个端口上,即使宿主机不能直接通过IP地址ping通容器,但由于Docker Desktop做了网络代理和端口映射,宿主机仍然可以通过localhost
或宿主机IP地址加上映射的端口来访问容器内部的服务。
这是因为Docker Desktop在后台配置了一种网络模式,允许容器对外发布的端口通过端口映射技术直接暴露给宿主机。例如,如果您在运行容器时指定了-p 8080:80
,这意味着容器内部的80端口被映射到了宿主机的8080端口,因此在宿主机上访问http://localhost:8080
就可以访问到容器内部运行的应用服务。
至于为何不能通过ping命令从宿主机直接ping通容器内部IP,是因为Docker在Mac上的网络配置与Linux下的传统bridge网络有所不同,它并不支持所有类型的网络通信,特别是在默认配置下,ICMP(ping命令)通常会被禁止。然而,这并不会影响通过TCP/IP协议栈进行的HTTP、HTTPS或其他服务端口的通信。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
涵盖 RocketMQ、Kafka、RabbitMQ、MQTT、轻量消息队列(原MNS) 的消息队列产品体系,全系产品 Serverless 化。RocketMQ 一站式学习:https://rocketmq.io/