Docker從容器中項目如何訪問到宿主機MYSQL

一、說明

        使用 Docker 能實現服務的容器化,並使用容器間網絡在它們之間進行通信。有時您可能需要一個容器來與宿主機上非容器化的服務通信。以下是如何從 Docker 容器中訪問本地主機或 127.0.0.1的具體方法。

 

二、方法1:簡單的選擇

        適用於 Windows 和 Mac 的 Docker Desktop 18.03+ 支持 host.docker.internal 作爲 localhost 的功能別名。在您的容器中使用此字符串來訪問您的主機。注意,這裏區分實體的辦法

指定通信個體 別名
解釋成容器 localhost或127.0.0.1 
解釋成主機 host.docker.internal 

       比如,您在主機上運行 MySQL 服務器,Docker 容器可以通過網絡訪問連接到主機的mysql 具體名爲host.docker.internal:3306 。當您在 Windows 或 Mac 計算機上工作時,這是最簡單的技術。

        Linux 上的 Docker 引擎用戶也可以通過 docker run 的 --add-host 標誌啓用主機的默認名稱 host.docker.internal。使用此標誌啓動容器以公開主機字符串:     

展例:

docker run -d --add-host host.docker.internal:host-gateway -p 80:80 -p 443:443 dzq:latest

使用(連接宿主機數據庫):

host.docker.internal:3306 

 

 --add-host 標誌向容器的 /etc/hosts 文件添加一個條目。上面顯示的值將 host.docker.internal 映射到容器的主機網關,這與真實的 localhost 值相匹配。如果您願意,可以用您的主機真實名稱替換 host.docker.internal 。

方法2:連接到主機網絡

        Docker 提供了一個主機網絡,讓容器可以共享主機的網絡堆棧。這種方法意味着容器內的本地主機解析爲物理主機,而不是容器本身。

        通過添加 --network=host 標誌與主機網絡一起啓動容器:

    docker run -d --network=host my-container:latest

        現在您的容器可以直接引用本地主機或 127.0.0.1。

        如果您使用的是 Docker Compose,請修改容器的服務定義以包含 network_mode 字段:

services:my-service:network_mode: host

        這種方法有幾個注意事項。在使用它之前考慮所有的影響很重要。容器通常會獲得自己的私有網絡,該網絡獨立於主機的堆棧。來自主機的設置。

        容器公開的任何端口都將在主機上公開,即使它們沒有使用 -p 標誌明確聲明。

        主機網絡可能是一個安全問題,它打破了 Docker 容器的隔離模型。在您確信正在運行的容器不會相互衝突或導致主機環境出現問題的情況下,它仍然很有用。主機網絡模式也比默認橋接模式更快,因爲沒有供流量通過的虛擬化層。

方法3:使用默認橋接模式訪問主機

        您的主機仍然可以在默認橋接網絡模式下從容器訪問。您只需要通過其 Docker 網絡 IP 引用它,而不是 localhost 或 127.0.0.1。

        大多數 Docker 引擎安裝會將主機表示爲默認 docker0 橋接網絡上的 172.17.0.1。您可以通過在主機上運行以下命令來檢查自己的 IP:

ip addr show docker0

        您的主機的 Docker IP 將顯示在 inet 行上。從您的容器中連接到此 IP 地址以成功訪問在您的主機上運行的服務。

這種方法的一個缺陷是您可能無法連接到直接綁定到本地主機的服務。您會在容器中看到連接被拒絕或類似錯誤。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章