網站首頁 編程語言 正文
問題說明
解決: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
相關推薦
- 2023-07-24 E6新語法for of 和ES3的for in 有什么區別?useState為什么是用數組結構而不用
- 2022-08-23 .net中的DI框架AutoFac簡單介紹_實用技巧
- 2022-11-23 Qt采用線程以隊列方式實現下發數據_C 語言
- 2024-03-01 【Typescript】tsconfig 常用配置項(常用or總結)
- 2022-10-19 為什么不要在?Flutter?中使用全局變量_Android
- 2022-08-10 C#對WPF數據綁定的菜單插入Seperator分隔_C#教程
- 2022-12-21 Kotlin?launch原理全面分析_Android
- 2022-04-11 用python的哈希函數對密碼加密_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支