将 HTTP 请求发送到另一个仅本地主机的 Docker 容器?

将 HTTP 请求发送到另一个仅本地主机的 Docker 容器?

我正在构建一个新的微服务,这是一个 Python Flask 应用程序,由 gunicorn 提供前端,可以接收和响应 HTTP get 请求。它有点像外部 API 的本地代理服务。我在端口 5000 上运行 gunicorn 应用程序。我想将端口重新映射到与我的其他服务类似的端口,但我还想限制此容器,以便它只能由我主机上的其他容器访问,我永远不希望外部世界可以访问此容器。但是,它需要能够进入外部世界才能发出 API 请求。

所以我想我应该绑定一个与我的容器使用的端口一致的端口,并通过像下面这样运行容器将其限制到本地主机:

docker run --name proxy-app --env SECRET="MYSECRET" -p 9000:5000 -d killerkode/proxy-app

在主机系统上,我可以通过运行以下命令成功地将请求发送到容器:

curl -XPOST -H "Content-type: application/json" -d '{"message": "test"}' 'http://127.0.0.1:9000/send_message'

但是然后我运行另一个容器,当我执行该容器并运行相同的 curl 命令时,它看不到 localhost - 我认为这是因为容器内部的 localhost 与容器外部不同。

因此,我研究了 docker 网络并决定创建一个桥接网络。我将两个容器放在同一个桥接网络上,然后尝试使用代理容器 IP(为了便于参数说明,假设为172.30.1.2)执行相同的命令,但我遇到的问题是请求在端口 5000 上有效,但在端口 9000 上无效。我根本不想让第二个容器看到端口 5000,我希望它只看到端口 9000,并将其作为代理容器的唯一访问权限。就像主机系统看不到端口 5000 但可以向端口 9000 发送请求一样。

curl -XPOST -H "Content-type: application/json" -d '{"message": "test"}' 'http://172.30.1.2:5000/send_message'

TL;DR;是,我试图在 1 个主机上运行 2 个容器。第一个容器(代理容器)需要将其应用端口从 5000 重新映射到 9000,然后它只能由主机系统或主机系统上的其他容器从端口 9000 访问。我该如何实现这一点?

答案1

在另一个容器中,您只需在 curl 命令中将 127.0.0.1 替换为主机的 ip。

为了阻止其他主机的访问,你可以使用 iptables 进行过滤。例如-A INPUT -j DROP -i eth0 --dport 9000

相关内容