從 Docker 容器內部如何連線到主機的 localhost?
假設您在主機上有一個 Nginx 容器內執行的 Nginx Web 伺服器,並且您在主機上執行一個 MySQL 資料庫。現在,您想從 Nginx 容器訪問主機上的 MySQL 伺服器。並且,MySQL 在您的 localhost 上執行,主機沒有將任何埠暴露給外部世界。因此,我們可以得出結論,MySQL 僅繫結到 localhost 上執行,並且無法訪問外部世界,因為它沒有繫結到 IP 地址。
在本文中,我們將解釋從容器訪問在您的 localhost 或主機上的任何其他程式上執行的 MySQL 的不同方法。
簡而言之,如果您使用的是 Docker for Windows 或 Mac,您可以簡單地使用 host.docker.internal 代替 127.0.0.1 連線到 MySQL。如果您使用 **--add-host host.docker.internal:host-gateway** 選項在本地 Linux 機器上啟動 Docker 容器,您甚至可以在 Linux 主機上的連線中使用 host.docker.internal 字串。
現在,讓我們詳細討論解決方案。
方案 1。
在 Linux 機器上,一個簡單的解決方案是使用 **--network=”host”** 選項以及 Docker run 命令。之後,Docker 容器中的 localhost (127.0.0.1) 將指向主機 Linux 機器。這將執行一個網路設定為主機的 Docker 容器。
此容器將與主機共享網路,並且容器的 localhost 將指向主機。請注意,現在從 Docker 容器暴露的任何埠都在您的主機上開啟,並且無需使用釋出選項。
您可以使用以下命令驗證這一點。
在您的本地機器上 -
$ ip addr show eth0
以及執行容器時 -
$ docker run -it --network=host ubuntu:latest ip addr show eth0
執行這些命令後,您會發現容器和主機具有相同的 IP 地址並共享相同的網路堆疊。
方案 2。
如果您使用的是 Mac 主機,您可以使用 -
HOSTNAME= docker.for.mac.host.internal
或者
HOSTNAME = docker.for.mac.localhost
在您的 Docker run 命令中。然後您可以使用 -
mysql -uroot -hdocker.for.mac.localhost
在您的 Docker 容器內訪問在您的主機上執行的 MySQL。
方案 3。
您還可以使用橋接網路模式從 Docker 容器訪問在主機上執行的 MySQL 服務。為此,您需要確保 MySQL 服務正在積極監聽 172.17.42.1 地址的所有連線。您可以在 MySQL 配置檔案中包含 **bind-address = 172.17.42.1**。
在主機模式下,您可以使用 -
**bind-address = 127.0.0.1** 在您的 MySQL 配置檔案中,然後您可以從您的容器連線到 localhost。
$ docker run --rm -it --network=host mysql mysql -h 127.0.0.1 -uroot -p
總而言之,這些是從 Docker 容器輕鬆連線到主機上執行的 MySQL 服務的各種方法。簡而言之,您可以使用 **--network=host** 將 localhost 與 Docker 容器繫結,並使用主機名“127.0.0.1”從容器內訪問 MySQL 服務。根據您使用的是 Mac、Windows 還是 Linux 主機,您可以選擇最適合您自身需求的解決方案。