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

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

在我的情况下,我想将本地端口从一个容器转发到另一个容器。

假设我在 容器 A 上运行一个服务,该服务具有硬编码配置以访问 localhost 3306 上的 db。但我想在 container B 上运行 db 服务器。

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

最佳答案

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

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

这将在您的 3306 上本地监听并将任何流量双向传递到 B-IP:3306。 socat 在名为 socat 的包中可用。因此,您将运行以下任何命令来安装它

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

Edit-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 的网络上运行此容器。因此,当它在 A 的网络上监听时,即使 A 容器未被触及,localhost:3306 也会在 A 中可用。

https://stackoverflow.com/questions/46099874/

相关文章:

node.js - node_modules 上的 docker-compose 卷但为空

ssl - 在 Synology NAS 上使用 Docker 在 GitLab 上启用 SSL

docker - Artifactory 作为 docker 注册表

linux - 如何删除所有 Docker 容器

java - 如何减小我的 java/gradle docker 镜像大小?

spring - Docker Compose + Spring Boot + Postgres 连

bash - 如何在 ENTRYPOINT 等待 postgres 启动?

mysql - 如何通过 SSH 连接到 MySQL Docker 容器?

docker - Alpine Linux 处理证书的方式与 Busybox 不同吗?

docker - 如何使用 Jenkins 管道在 docker 容器中安装 Jenkins 工作区