首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Docker -流量镜像

Docker -流量镜像
EN

Stack Overflow用户
提问于 2016-08-03 18:13:13
回答 3查看 2.7K关注 0票数 3

我有两个不同的运行容器。我希望能够将到达容器#1的流量镜像到容器#2。

有这样的docker命令吗?

EN

回答 3

Stack Overflow用户

发布于 2016-08-03 22:57:15

linux接口上的流量镜像是可能的,我不相信docker提供了一种方法来设置它。镜像应该通过为每个容器设置的veth接口工作,如果您手动添加它的话。

流量控制

tc允许您以多种方式管理流量,通常用于服务质量类型队列。tc还提供了mirror操作。following匹配所有入站和出站流量,并将其镜像到另一个接口。

代码语言:javascript
复制
tc qdisc add dev vethb692b75@if13 ingress
tc filter add dev vethb692b75@if13 parent ffff: \
   protocol all prio 2 u32 \
   match u32 0 0 flowid 1:1 \
   action mirred egress mirror dev veth4305fdd@if15

tc qdisc replace dev vethb692b75@if13 parent root handle 10: prio
tc filter add dev vethb692b75@if13 parent 10: \
   protocol all prio 2 u32 \
   match u32 0 0 flowid 10:1 \
   action mirred egress mirror dev veth4305fdd@if15

IP表

iptables可以将克隆的数据包转发到可路由的主机。这通常用于将流量镜像到外部主机。

代码语言:javascript
复制
iptables -t mangle -I PREROUTING -i vethb692b75@if13 -j TEE --gateway <monitor_ip>
iptables -t mangle –I POSTROUTING -i vethb692b75@if13 -j TEE --gateway <monitor_ip>

tcpdump

由于linux世界中的大多数网络监控软件都使用tcpdump,因此您也可以通过tcpdump将接口从主机转储到挂载到监控容器中的fifo中。

代码语言:javascript
复制
mkfifo /tmp/remotecapture.fifo 
tcpdump -s 0 -n -w - -U -i vethb692b75@if13 > /tmp/remotecapture.fifo
docker run -v /tmp/remotecapture.fifo:/tmp/remotecapture.fifo <image> netmonitor -f /tmp/remotecapture.fifo

备注

veth名称被分配给每个容器启动,因此捕获需要成为容器启动/停止过程的一部分。您希望删除集装箱停靠站上的所有规则。

在流量被转发到某个地方的情况下,接收方容器/主机不应该将这些数据包中的任何一个路由回或路由到它们的原始目的地。

票数 6
EN

Stack Overflow用户

发布于 2016-08-03 20:12:06

如果将container#2设置为container#1的反向代理会更容易

这意味着container#2可以看到所有流量并将其发送到container#1

您可以用作container#2 traefik.io/。它用于负载平衡,但在您的示例中,您只能定义一个引用container#1的后端(因此没有负载平衡)。

您可以很容易地构建traefik容器(例如,针对arm架构的see this Dockerfile)

票数 2
EN

Stack Overflow用户

发布于 2020-01-14 15:06:58

编辑:如果您仅处理HTTP流,请使用

你可以在第三个容器中运行Nginx,并使用它作为docker容器的入口点。然后使用nginx作为Container 1的反向代理,并使用nginx mirror指令将所有请求也镜像到容器2。

实际上,容器1将接收所有请求并发送响应。容器2也将获得请求,但它的响应不会被发送回发出请求的用户/客户端。

这是一个Nginx配置示例。

代码语言:javascript
复制
upstream logger {
    server app2:3002;
}

upstream app {
    server app1:3002;
}

server {
    listen 8000;
    location / {
        mirror /mirror;
        mirror_request_body on;
        proxy_pass http://app;
    }
    location  = /mirror {
        internal;
        proxy_connect_timeout 200ms;
        proxy_read_timeout 200ms;
        proxy_pass http://logger$request_uri;
        proxy_set_header HOST $http_host;
        proxy_set_header X-FORWARDED-FOR $remote_addr;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38740667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档