如何将端口从一个docker容器转发到另一个?

Mar*_* An 11 portforwarding docker

我经常看到将docker容器的端口暴露给主机的解决方案.

在我的情况下,我想将一个本地端口从一个容器转发到另一个容器.假设我在容器A上运行一个服务,该服务具有硬编码配置以访问localhost 3306上的db.但我想在容器B上运行db服务器.

从A-localhost向前移动的最佳方式是什么:3306到B-IP:3306

Tar*_*ani 17

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

socat TCP-LISTEN:3306,fork TCP:B-IP:3306 &
Run Code Online (Sandbox Code Playgroud)

这将在您的3306上本地收听并双向传递任何流量B-IP:3306.socat在名为socat的软件包中提供.因此,您将运行以下任何命令来安装它

$ yum install -y socat
$ apt install -y socat
$ apk add socat
Run Code Online (Sandbox Code Playgroud)

编辑-1

您甚至可以通过不触摸原始容器来完成此操作

Dockerfile

FROM alpine
RUN apk update && apk add socat
Run Code Online (Sandbox Code Playgroud)

按如下方式构建文件

docker build -t socat .
Run Code Online (Sandbox Code Playgroud)

现在运行一个容器

docker run --name mysql-bridge-a-to-b --net=container:<containerAid> socat socat TCP-LISTEN:3306,fork TCP:BIP:3306
Run Code Online (Sandbox Code Playgroud)

这将在A的网络上运行此容器.因此,当它在A的网络上收听时,localhost:3306即使没有触及容器,也会在A中可用.

  • Docker Hub 上有一个 Alpine socat 镜像:https://hub.docker.com/r/alpine/socat/ (3认同)

Lei*_*och 16

如果您希望容器 B 的端口作为容器 A 上的本地主机端口公开,您可以启动容器 B,并将network选项设置为containermode 以在容器 A 的网络命名空间上启动容器 B。

例子:

docker run --net=container:A postgres
Run Code Online (Sandbox Code Playgroud)

在哪里:

  • A 是要映射到的容器的名称或标识符。

这将在与 相同网络命名空间的容器中启动 postgres A,因此在 postgres 容器中打开的任何端口都将在与 相同的接口上打开,A并且它应该localhost在容器 A 内部可用。

  • 在我看来,这比“docker run --network=host”更合适 (4认同)

yam*_*enk 8

您可以简单地以等于主机的网络模式运行容器。

docker run --network=host ...
Run Code Online (Sandbox Code Playgroud)

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

  • 仅 Linux 支持:https://docs.docker.com/network/host/ (2认同)