如何将一个端口从一个docker集装箱转发到另一个docker集装箱?

我通常会看到将Docker容器的端口暴露给主机的解决scheme。

在我的情况下,我想转发本地端口从一个容器,到另一个。 假设我在容器A上运行一个具有硬编码configuration的服务来访问本地主机3306上的数据库 。 但我想在容器B上运行数据库服务器。

什么是端口转发formsA-localhost:3306到B-IP:3306的最佳方式是什么?

在您的容器中安装socat并在启动时运行

 socat TCP-LISTEN:3306,fork TCP:B-IP:3306 & 

这将在您的3306本地监听,并将任何stream量双向传递到B-IP:3306 。 socat可以在包名为socat中find。 所以你会运行下面的命令来安装它

 $ yum install -y socat $ apt install -y socat $ apk add socat 

编辑-1

你甚至可以通过不接触你原来的容器来做到这一点

Dockerfile

 FROM alpine RUN apk update && apk add socat 

build立如下文件

 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的networking上运行这个容器。 所以当它在A的networking上监听时,即使一个容器没有被触摸, localhost:3306也将在A中可用。

您可以简单地使用与主机相同的networking模式运行容器。

 docker run --network=host ... 

在这种情况下,从容器的angular度来看,localhost或127.0.0.1将引用主机。 因此,如果您的数据库运行在另一个容器B上侦听3306,则容器A中的localhost:3306的地址将冲击容器B中的数据库。

你可以用Docker-Compose来完成 。

docker-compose.yml例子:

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

这里有两个docker实例:web和mysql,因此每个docker实例都可以使用您定义的服务名称来查看对方。

希望这可以帮助