Docker-流量镜像

Docker-流量镜像,docker,Docker,我有两个不同的运行容器。 我希望能够将到达集装箱1的流量镜像到集装箱2 是否有用于此的docker命令?如果更容易将容器2设置为容器1的反向代理,则 这意味着container#2查看所有流量并将其发送到container#1 您可以将其用作容器#2。它用于负载平衡,但在您的情况下,只能定义一个引用容器1的后端(因此没有负载平衡)。 您可以非常轻松地构建traefik容器(例如,对于arm体系结构)在linux界面上可以进行流量镜像,但我不相信docker提供了一种设置方法。如果手动添加,镜像应

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


是否有用于此的docker命令?

如果更容易将容器2设置为容器1的反向代理,则

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

您可以将其用作容器#2。它用于负载平衡,但在您的情况下,只能定义一个引用容器1的后端(因此没有负载平衡)。

您可以非常轻松地构建traefik容器(例如,对于arm体系结构)

在linux界面上可以进行流量镜像,但我不相信docker提供了一种设置方法。如果手动添加,镜像应通过docker为每个容器设置的
veth
接口工作

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

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
可以将克隆的数据包转发到可路由的主机。这通常用于将流量镜像到外部主机

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>
iptables-t mangle-I预路由-Ivethb692b75@if13-j三通——网关
iptables-t mangle-I后路由-Ivethb692b75@if13-j三通——网关
命令 由于linux世界中的大多数网络监控软件都使用tcpdump,因此您也可以将接口从主机tcpdump到安装在监控容器中的fifo中

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
mkfifo/tmp/remotecapture.fifo
tcpdump-s0-n-w--U-ivethb692b75@if13>/tmp/remotecapture.fifo
docker run-v/tmp/remotecapture.fifo:/tmp/remotecapture.fifo netmonitor-f/tmp/remotecapture.fifo
笔记
veth
名称分配给每个容器启动,因此捕获需要成为容器启动/停止过程的一部分。您希望删除容器停止上的任何规则


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

编辑:如果您只处理HTTP流量

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

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

这是一个Nginx配置示例

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;
    }
}

你说的“镜像交通”是什么意思?流量镜像通常在比docker容器运行的网络级别更低的网络级别上完成。也许你的意思是“负载平衡流量”?谢谢。我不希望容器#2设置为反向代理,因为这意味着如果它失败,那么主容器将无法获得任何流量\=有其他解决方案吗?@efratevy您可以直接在容器#1中安装traefik,并将流量发送到容器#1主服务器和容器#2,这可能更合适(比我的答案),考虑OP的问题+1谢谢!!这是非常有用的。请回答另一个问题,如果给定容器的名称,我如何获得网桥名称?@efratevy将作为另一个问题提交。但这可能是UDP通信,而不是HTTP。@Dmytro是的,这只适用于HTTP,我将遵循matt关于TCP的回答