为了在 docker 上运行的 Linux (openSUSE Leap 15) 应用程序上执行一些单元测试,我有一个管理器,它通过套接字向 docker 中的应用程序发送命令。
在这种情况下,对于一些测试,我希望能够发送命令以暂时从容器内部禁用网络,要明确命令发送/接收不是问题,但当我收到此类命令时我会做什么,我尝试了
ip link eth0 down/up
和 down
实际上可以工作,但不能启动,这里是一个重现的示例,使用以下 docker 文件:
FROM opensuse/leap:15
# We just need ping and ip
RUN zypper --non-interactive --no-gpg-checks --ignore-unknown --no-cd in --auto-agree-with-licenses --allow-unsigned-rpm ping iproute2
ENTRYPOINT [ "bash" ]
docker build -t opensuse-leap-15-if-down-up:1.0 .
,docker run -dti --cap-add NET_ADMIN --hostname opensuse-leap-15-if-down-up --name opensuse-leap-15-if-down-up opensuse-leap-15-if-down-up:1.0
,docker exec -ti opensuse-leap-15-if-down-up bash
,ping google.com
检查您能否到达,ip link eth0 down
停用 eth0 接口,ping google.com
再次检查您是否不能再这样做:好的,“ping:google.com:名称解析暂时失败”错误,ip link eth0 up
重新激活eth0接口,ping google.com
再次检查是否正常:KO,仍然出现“ping:google.com:名称解析暂时失败”错误。知道为什么这不起作用,或者知道如何从 Linux 容器内部模拟临时网络断开吗?
编辑:我也尝试过
systemctl stop systemd-networkd
但没有成功(ping google.com
停止后仍然回答),我看到也有一个 systemd-networkd-wait-online.service
,不确定它的作用,但停止它也不会断开网络。
Edit2:我也尝试过this,但是
route add default gw 172.17.0.1
给了我SIOCADDRT: Network is unreachable
,而不是我必须安装net-tools-deprecated
包才能获得route
命令,如果可能的话,我不想要什么。但我不太熟悉 ip route
命令,例如 ip r add 172.17.0.1/8 dev eth0
和其他测试总是给我 Error: Invalid prefix for given prefix length
错误。
基于另一个问题中的这个答案给了我一个线索,但是
route add default gw 172.17.0.1
对我不起作用(给我SIOCADDRT: Network is unreachable
错误),最后除了我的问题中的@KamilCuk评论之外,我再次获得了网络:
ip link eth0 up
ip route add default via 172.17.0.1 dev eth0
然后我可以通过以下方式断开连接:
ip link eth0 down
然后依次使用上面的
up
和 route add
重新连接以模拟临时网络断开连接。