2017-09-07 151 views
1

我通常會看到將Docker容器的端口暴露給主機的解決方案。如何將一個端口從一個碼頭集裝箱轉發到另一個碼頭集裝箱?

在我的情況下,我想將本地端口從一個容器轉發到另一個容器。假設我在集裝箱A上運行服務,該服務具有硬編碼配置,以訪問本地主機上的數據庫3306。但我想在容器B上運行db服務器。

什麼是端口轉發的最佳方式form A-localhost:3306 to B-IP:3306

回答

2

在容器中,並在啓動時運行

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中可用。

0

您可以使用Docker-Compose來完成。

泊塢窗,compose.yml例如:

version: '3' 
services: 
    web: 
    build: .web 
    ports: 
    - "5000:5000" 
    mysql: 
    build: .mysql 
    ports: 
    - "3306:3306" 

在這裏,你有2個搬運工實例:網絡和MySQL,因此每個搬運工人實例可以使用你定義爲服務的名稱看到對方。

希望這有助於

2

您可以簡單地運行網絡模式等於主機的容器。

在這種情況下,從容器的角度來看,localhost或127.0.0.1會引用主機。因此,如果您的數據庫運行在另一個容器B上偵聽3306,則容器A中的localhost:3306的地址將衝擊容器B中的數據庫。

相關問題