15 | 容器网络:我修改了/proc/sys/net下的参数,为什么在容器中不起效?
该思维导图由 AI 生成,仅供参考
问题再现
- 深入了解
- 翻译
- 解释
- 总结
本文深入讨论了在容器中修改/proc/sys/net下的参数为何不会生效的问题,并详细解释了Network Namespace的概念和操作。作者首先提出了一个问题,即在容器中运行的应用程序需要修改网络参数时,常常需要修改/proc/sys/net目录下的参数。通过实验发现容器中的参数值并不会继承宿主机Network Namespace里的值,而是继承了原系统的默认值。文章指出了容器中的/proc/sys目录是只读的,因为runC出于安全考虑将其做了read-only mount的处理。然后介绍了如何修改容器中Network Namespace的网络参数,包括使用"nsenter"工具和在容器启动时通过runC sysctl相关的接口进行配置。最后,提出了思考题,鼓励读者分享收获和疑问。 总的来说,本文通过实际问题出发,深入讨论了容器中网络参数配置的相关知识,包括参数继承问题和Network Namespace的概念和操作。读者可以从中了解到容器中网络参数配置的细节和原理,以及如何操作Network Namespace。
《容器实战高手课》,新⼈⾸单¥59
全部留言(18)
- 最新
- 精选
- 莫名# nsenter -t <pid> -n bash -c 'echo 600 > /proc/sys/net/ipv4/tcp_keepalive_time' (root 用户) $ sudo nsenter -t <pid> -n sudo bash -c 'echo 600 > /proc/sys/net/ipv4/tcp_keepalive_time' (非 root 用户) 其中,<pid> 表示容器 init 进程在宿主机上看到的 PID。
作者回复: 对!
2020-12-19215 - 谢哈哈宿主机的进入容器网络地址空间通过nsenter --target $(docker inspect -f {.State.Pid}) --net
作者回复: 是的
2020-12-1937 - aMaMiMoU老师您好,有几个问题能否帮忙解答下,谢谢 1.在/proc/sys/net 的诸多参数里,如何确认哪些是host level 哪些是容器level的呢? 2.对于host level的这些参数,在启动容器的时候通过sysctl能修改么?如果能修改,是不是相当于同时影响了同host里其他容器的运行时参数呢?
作者回复: @AMaMiMou 很好的问题,对于/proc/sys/net下的参数,你在容器中看到的,基本都是network namespace下的。 对于容器启动的时候,runc只允许修改namesapce下的参数值,而不会修改host相关的值。 可以参看一下runc的sysctl validation的代码: https://github.com/opencontainers/runc/blob/ff819c7e9184c13b7c2607fe6c30ae19403a7aff/libcontainer/configs/validate/validator.go#L135
2020-12-2624 - Geek_c2089d老师,咨询一个问题,就是我有一个容器里面有两个服务,映射出8000和9000的端口,在容器内会出现8000端口的服务访问宿主机ip:9000的端口不通,但是我service iptables stop ; seriver docker stop ; server docker start ; 就可以访问了。一旦reboot就不行了。请问是怎么样的问题
作者回复: > service iptables stop 看上去应该是 iptables stop 后把原来的iptables rules flush了,就可以工作了。 你可以查看一下具体是那条iptables规则阻止了访问。
2021-01-223 - Helios这些问题文档上都没写,还是老师功力高,场景多。 请教个问题,对于proc文件系统的其他目录容器怎么隔离的呢,比如在容器里面free命令看到的是宿主机的内存。
作者回复: /proc下的内容大部分是没有隔离的,就想你说的/proc/meminfo, /proc/stat 在容器中看到的都和宿主机上的是一样的。 其他有一些因为namespace不同而不同的/proc的内容, 比如 /proc/<pid>/, 容器下只能看到自己pid namespace里的进程pid。 /proc/mounts的内容和mount namespace相关。 还有IPC namesapce相关的一些/proc下的参数,等等。
2020-12-223 - 🐭既然nsenter与docker exec 原理一样,为啥nsenter修改proc/sys/net不会报错无权限呢
作者回复: docker exec 同时进入了容器的pid/mnt/net namespace, 而 nsenter 修改参数的时候,只是进入了容器的net namespace.
2021-08-032 - 乔纳森我们是在 initContainers 中 执行 如下来修改容器内的内核参数的,需要privileged: true mount -o remount rw /proc/sys sysctl -w net.core.somaxconn=65535
作者回复: 嗯,如果container有privileged的权限,那么在容器中几乎和host有同等权限了。
2021-07-041 - Demon.Lee老师,为啥隔离的这些网络参数不和 /sys/fs/cgroup/net_cls,net_prio,cpu,pid 等一样,统一放在/sys/fs/cgroup/下面,而是跟宿主机共用一套 ?
作者回复: 一个是namespace, 主要是资源隔离 另外一个是cgroup,主要是资源的划分。
2021-07-021 - 程序员老王网卡是通过端口号来区分栈数据吧,命名空间在这里隔离是网络参数配置吗?还是网卡
作者回复: @王传义 你这里说的“端口”是指tcp/udp层的端口号吗?
2020-12-1821 - 小Y来到网络的章节基本不太懂,得多听几遍,多补充补充了😆
编辑回复: 知道了盲区也是好事,可以去补一补。一定可以的~
2022-02-28