解决Mac中的Docker宿主机与容器不能通信问题

本文介绍了在Mac环境下,Docker的宿主机与容器无法通信的问题及其解决方案。问题源于默认的网络设置导致的网络隔离。通过安装docker-connector并配置路由,将Docker bridge网络添加到路由中,使得宿主机与容器能够相互通信。具体步骤包括安装docker-connector,启动服务,并确保容器内的服务如Mysql和Redis可以正常连接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题说明

解决:Mac中的Docker宿主机与容器不能通信!

之前我遇到一个问题,好久不能得到解答,前几天终于茅塞顿开,为此我在放假期间,特意学了一遍Docker,Dockerfile、数据存储volume、网络通信 从数据卷、网络方面入手,我当时所困惑的问题是为什么用客户端从外网可以访问,但是我容器中的PHP代码不能访问呢?

访问代码:

$redis = new Redis();
try{
    $redis->connect('172.17.0.4',6379 );
    echo "Connection to server successfully".PHP_EOL;
//查看服务是否运行
    echo "Server is running: " . $redis->ping().PHP_EOL;
}catch ( Exception $e ){
    echo $e->getMessage();
}

“Connection refused”报错信息,是因为没有开启服务端,或者网络不通。我想尽办法都还是不行。

后来知道了底层的网络原理,原因是这样的,Docker的通信默认是网桥,宿主机和容器不在同一个网桥里,Mac的网桥里少了Docker0网段,外部部署的网络之所以能通是因为访问服务时,网段进行了网络的Nat的自动转换,原来是这样。

知道的原理确实是不一样的,之后我也遇见过类似的问题,便可轻松化解,下面我说一下这个问题的解决办法。

1. 使用 docker-connector,然后执行以下命令把 docker 的所有 bridge 网络都添加到路由中。

brew install wenjunxiao/brew/docker-connector
docker network ls --filter driver=bridge --format "{{.ID}}" | xargs docker network inspect --format "route {{range .IPAM.Config}}{{.Subnet}}{{end}}" >> /usr/local/etc/docker-connector.conf

也可以手动修改 /usr/local/etc/docker-connector.conf 文件中的路由,格式是:

route 172.17.0.0/16

配置完成,直接启动服务(需要 sudo,路由配置启动之后仍然可以修改,并且无需重启服务立即生效)

sudo brew services start docker-connector
docker run -it -d --restart always --net host --cap-add NET_ADMIN --name connector wenjunxiao/mac-docker-connector

查看容器,启动成功了,问题就解决了,访问时把容器Ip绑定在Dns上就可以了。

~ docker ps
7c25a002e978 wenjunxiao/mac-docker-connector   "mac-receiver"          

测试一下,Mysql、Redis都可以链接了!

$redis = new Redis();
try{
    $redis->connect('172.17.0.4',6379 );
    echo "Connection to server successfully".PHP_EOL;
//查看服务是否运行
    echo "Server is running: " . $redis->ping().PHP_EOL;
}catch ( Exception $e ){
    echo $e->getMessage();
}
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

stark张宇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值