gpt4 book ai didi

docker - docker 容器中的 tcp_keepalive_time

转载 作者:行者123 更新时间:2023-12-03 03:23:49 24 4
gpt4 key购买 nike

我有一个 docker 主机,已将 net.ipv4.tcp_keepalive_time 内核参数设置为 600。但是当容器运行时,它使用不同的值:

$ sysctl net.ipv4.tcp_keepalive_time
net.ipv4.tcp_keepalive_time = 600

$ docker run --rm ubuntu:latest sysctl net.ipv4.tcp_keepalive_time
net.ipv4.tcp_keepalive_time = 7200

这是为什么?如何更改此值而无需传递 --sysctl 选项?

在我的例子中,我无法传递 --sysctl 的原因是该主机是一个 docker swarm 容器,并且此选项是 currently unsupported在群中。

但是容器不应该只从主机获取这些内核参数吗?我已经重新启动了 docker 服务(及其容器)。

编辑:一些额外的主机信息:

$ uname -r
4.15.0-38-generic
$ docker --version
Docker version 18.06.1-ce, build e68fc7a

最佳答案

这就是网络命名空间(Docker 使用的 Linux 设施)的工作原理。

But shouldn't containers just take these kernel params from the host?

没有。创建网络命名空间时(在您的情况下 - 当 Docker 容器启动时),它不会从初始(您的术语中的“主机”)网络命名空间继承大部分网络内核参数,相反,这些参数是 set to defaultsdefined for the kernel at the compile-time

此外,更改特定网络命名空间(包括初始网络命名空间)中特定网络参数的值不会更改其他网络命名空间中的此参数,因此,更改“主机”net.ipv4.tcp_keepalive_time 的值 参数不会影响任何容器(已经运行或随后启动)。

how can I change this value without having to pass --sysctl option?

考虑到上面的解释,从内核默认值更改容器的此内核参数的唯一方法是从容器的网络命名空间修改此参数。这就是 Docker 在容器启动期间提供 --sysctl 选项时所做的事情。

如果 Swarm 不支持使用此选项启动容器,恐怕您唯一的方法就是从容器的入口点修改此参数,除非您以 --privileged< 身份运行容器,否则这是不可能的。显然,这是一个错误的决定,因为它本质上是一个安全漏洞,允许容器以多种方式影响主机系统。

关于docker - docker 容器中的 tcp_keepalive_time,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54552379/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com