我通常會看到將Docker容器的端口暴露給主機的解決方案。如何將一個端口從一個碼頭集裝箱轉發到另一個碼頭集裝箱?
在我的情況下,我想將本地端口從一個容器轉發到另一個容器。假設我在集裝箱A上運行服務,該服務具有硬編碼配置,以訪問本地主機上的數據庫3306。但我想在容器B上運行db服務器。
什麼是端口轉發的最佳方式form A-localhost:3306 to B-IP:3306?
我通常會看到將Docker容器的端口暴露給主機的解決方案。如何將一個端口從一個碼頭集裝箱轉發到另一個碼頭集裝箱?
在我的情況下,我想將本地端口從一個容器轉發到另一個容器。假設我在集裝箱A上運行服務,該服務具有硬編碼配置,以訪問本地主機上的數據庫3306。但我想在容器B上運行db服務器。
什麼是端口轉發的最佳方式form A-localhost:3306 to B-IP:3306?
在容器中,並在啓動時運行
socat TCP-LISTEN:3306,fork TCP:B-IP:3306 &
安裝socat
這將在您的本地3306監聽和雙向傳遞任何流量B-IP:3306
。 socat可以在名爲socat的軟件包中找到。所以,你會運行任何以下命令來安裝它
$ yum install -y socat
$ apt install -y socat
$ apk add socat
編輯-1
你甚至可以不碰你原來的容器
Dockerfile
FROM alpine
RUN apk update && apk add socat
做到這一點
構建如下文件
docker build -t socat .
現在運行從同一
docker run --name mysql-bridge-a-to-b --net=container:<containerAid> socat socat TCP-LISTEN:3306,fork TCP:BIP:3306
這是一個容器將運行的網絡上此容器。因此,當它在A的網絡上收聽時,即使未觸摸容器,localhost:3306
也將在A中可用。
您可以使用Docker-Compose來完成。
泊塢窗,compose.yml例如:
version: '3'
services:
web:
build: .web
ports:
- "5000:5000"
mysql:
build: .mysql
ports:
- "3306:3306"
在這裏,你有2個搬運工實例:網絡和MySQL,因此每個搬運工人實例可以使用你定義爲服務的名稱看到對方。
希望這有助於
您可以簡單地運行網絡模式等於主機的容器。
在這種情況下,從容器的角度來看,localhost或127.0.0.1會引用主機。因此,如果您的數據庫運行在另一個容器B上偵聽3306,則容器A中的localhost:3306的地址將衝擊容器B中的數據庫。