我有2个不同的运行容器。 我希望能够将来到容器#1的流量镜像到容器#2中。
这是否有docker命令?
答案 0 :(得分:5)
在linux界面上可以进行流量镜像,我不相信docker提供了一种设置方法。如果您手动添加镜像,则镜像应该通过veth
接口为每个容器设置的docker设置。
tc
允许您以多种方式管理流量,通常用于服务质量类型排队。 tc
还提供了mirror
操作。 following匹配所有入站和出站流量,并将其镜像到另一个接口。
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
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>
由于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
veth
名称分配给每个容器启动,因此捕获将需要成为容器启动/停止过程的一部分。您想要删除容器停止的任何规则。
在某处转发流量的情况下,收件人容器/主机不应将任何这些数据包路由回原始目的地。
答案 1 :(得分:2)
如果更容易将容器#2设置为容器#1的反向代理
这意味着容器#2会查看所有流量并将其发送到容器#1
您可以使用容器#2 traefik.io/
。它用于负载平衡,但在您的情况下,您只能定义一个后端(因此没有负载平衡)引用容器#1。
您可以非常轻松地构建一个traefik容器(例如,see this Dockerfile用于arm架构)
答案 2 :(得分:0)
编辑:如果您仅处理HTTP流量
您可以在第3个容器中运行Nginx,并使用该入口点作为Docker容器。然后将nginx用作容器1的反向代理,并使用nginx mirror指令将所有请求也镜像到容器2。
有效地,容器1将接收所有请求并发送响应。容器2也将获得请求,但其响应不会发送回发出请求的用户/客户端。
这是一个示例Nginx Config。
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;
}
}