如何将来自容器的 HTTP 请求代理到 docker 中的特定地址(:端口)?

How to proxy HTTP request from container to a specific address(:port) in docker?

我目前正在创建一个工具来管理 docker 个容器。
所以我正在寻找一种方法来从容器内连接到 lan 中的 api 服务器。
有几台 api 服务器,运行 在不同的主机上。
api 服务器不在端口 80 上,而是在启动时在随机端口上。
要使用 api,您需要在授权中指定令牌 header。
但是,在这种情况下无法将令牌包含在容器中。
要从容器内使用 api,我想将 192.168.0.2:49152 路由到 api.example.com:80

我已经完成了以下操作。

docker run -it \
  --add-host=api.example.com:192.168.0.2 \
  image:version main.sh

我们认为无法将端口或令牌附加到上述命令,因此我们执行了以下操作。

docker run -it \
  --add-host=api.example.com:192.168.0.10 \
  --env HTTP_PROXY="http://host.docker.internel:49513" \
  image:version main.sh

正如您在上面看到的,我想到了在该工具上附加一个代理服务器。
代理服务器侦听 49513.
等端口 代理服务器自带Authorization,将请求转发到容器中的api

此实现的问题在于它代理了所有 HTTP 通信。
如果代理所有 HTTP 通信,通信会出现延迟,需要 real-time 性能。
由于此工具管理大量容器,因此此问题被认为很严重。
在docker的Proxy中有NO_PROXY,但是没有像YES_PROXY这样的代理白名单,这与此相反。

我正在考虑扩展上述实现。 有什么好的想法请告诉我。

我正在使用翻译器,所以如果您有任何问题,请发表评论,我会尽力解答。如果您有任何问题或意见,请给我留言。

谢谢。

您可以将代理服务器配置为透明的http代理服务器

假设代理服务器IP为192.168.0.20,API服务器IP为192.168.0.10

docker run -it \
  --add-host=api.example.com:192.168.0.20 \
  image:version main.sh

使用nginx配置代理服务器

server {
     listen  80;
     server_name api.example.com;

     location / {
         proxy_pass http://192.168.0.10:xxx;
         proxy_set_header Host $host;
     }
 }

这样,只有api.example.com的请求才会被发送到代理服务器。