1. 程式人生 > 程式設計 >Docker容器使用宿主機上的mongod/redis等服務詳解

Docker容器使用宿主機上的mongod/redis等服務詳解

我們在本地的開發中為了保證大家都開發環境一直,PHP 的擴充套件,版本保持一致,我們使用了 docker .但是由於redis/mongodb 在宿主機上,所以通過 127.0.0.1 是連線不上的

前提說明

這個是在 docker 執行容器時使用的橋接模式(預設) 時才會發生以上問題.如果使用 host 模式就沒有.

所以,我們就是要把是 docker 的網路模式設定為 host 模式.

具體實現

~ docker run --network host php56

補充說明

使用了 host 模式後,則表示宿主機與容器共享宿主機的 IP,埠. 如果不希望與宿主機共享,則不能使用這種方式

如果你的電腦是 Mac,並且你的docker 版本大於18.03,則你可以在程式碼中使用 docker.for.mac.localhost 來連線宿主機上的服務.

//使用示例

//以連線 mongod 為例

$mongodb = new \MongoDB\Driver\Manager('mongodb://docker.for.mac.localhost/:27017');

Windows 跟 Linux 暫時還沒有發現可以在橋接模式下可以通過特使字元來使用宿主機上服務的方法。

如果各位有好的方法,歡迎留言討論。

補充知識:Docker無法連線宿主機資料庫

redis

已經修改過為宿主機 ifconfig命令下 docker0的 172.17.0.1 連線地址,還是無法連線redis

docker中redis配置資訊

 # redis配置資訊
 REDIS_HOST = '172.17.0.1'
 REDIS_PORT = 6379
 LEVEL_NAME = logging.DEBUG

 # session配置
 SESSION_TYPE = 'redis' # 設定redis儲存的型別
 SESSION_REDIS = StrictRedis(host=REDIS_HOST,port=REDIS_PORT) # 指定session儲存的redis伺服器
 SESSION_USE_SIGNER = True # 設定簽名儲存

不利用守護方式啟動容器,可以看到redis、mysql連線資料庫報錯

Docker容器使用宿主機上的mongod/redis等服務詳解

解決辦法

修改redis.conf檔案第69行,把 bind 127.0.0.1 改為 0.0.0.0

Docker容器使用宿主機上的mongod/redis等服務詳解

redis恢復連線

mysql

class ProductConfig(Config):
 # 資料庫配置資訊
 SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:[email protected]:3306/information'
 SQLALCHEMY_TRACK_MODIFICATIONS = False
 SQLALCHEMY_COMMIT_ON_TEARDOWN = True # 每當改變資料內容之後,在檢視函式結束的時候會自動提交

 DEBUG = False
 LEVEL_NAME = logging.ERROR

以許可權使用者root登入

選擇mysql庫

檢視mysql庫中的user表的host值(即可進行連線訪問的主機/IP名稱)

改host值(以萬用字元%的內容增加主機/IP地址),當然也可以直接增加IP地址

重新整理MySQL的系統許可權相關表

MariaDB [(none)]> use mysql;
MariaDB [mysql]> SELECT user,host FROM mysql.user
MariaDB [mysql]> update user set host = '%' where user ='root' and host='localhost';
MariaDB [(mysql)]> flush privileges;

測試一下

問題解決

Docker容器使用宿主機上的mongod/redis等服務詳解

這兩種開放所有地址訪問都會有安全隱患

以上這篇Docker容器使用宿主機上的mongod/redis等服務詳解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。