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中可用.
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 ...
Run Code Online (Sandbox Code Playgroud)
在这种情况下,从容器的角度来看,localhost或127.0.0.1将引用主机。因此,如果您的数据库正在另一个侦听3306的容器B中运行,则容器A中localhost:3306的地址将访问容器B中的数据库。
| 归档时间: |
|
| 查看次数: |
5748 次 |
| 最近记录: |