日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

如何解決Mac中的Docker宿主機與容器無法通信(MacOS下解決宿主機和docker容器網絡互通)

作者:stark張宇 更新時間: 2022-03-23 編程語言

問題說明

解決: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();
}


原文鏈接:https://stark.blog.csdn.net/article/details/122979690

欄目分類
最近更新