我有一个将net.ipv4.tcp_keepalive_time
内核参数设置为600的docker主机。但是,当容器运行时,它将使用另一个值:
$ 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容器,而swarm中的此选项是currently unsupported。
但是容器不应该只是从主机获取这些内核参数吗?我已经重新启动了docker服务(及其容器)。
编辑:一些额外的主机信息:
$ uname -r
4.15.0-38-generic
$ docker --version
Docker version 18.06.1-ce, build e68fc7a
答案 0 :(得分:0)
这就是网络名称空间(Docker使用的Linux工具)的工作方式。
但是容器不应该只是从主机获取这些内核参数吗?
不。创建网络名称空间时(在您的情况下-启动Docker容器时),它不会从初始(用您的术语“主机”表示)网络名称空间继承大多数网络内核参数,而是,这些参数为{{ 3}}是set to defaults。
此外,更改特定网络名称空间(包括初始名称)中特定网络参数的值不会更改其他网络名称空间中的此参数,因此,更改“主机” net.ipv4.tcp_keepalive_time
参数的值不会影响任何容器(已经运行或随后启动)。
如何在不通过--sysctl选项的情况下更改此值?
考虑到上面的解释,从内核的默认值更改容器的此内核参数的唯一方法是在容器的网络名称空间中修改此参数 。这就是提供--sysctl
选项时Docker在容器启动期间所做的事情。
如果Swarm不支持使用此选项启动容器,那么恐怕您唯一的方法是从容器的入口点修改此参数,除非您以--privileged
的身份运行容器,否则这是不可能的。显然,这是一个错误的决定,因为它本质上是一个安全漏洞,它允许容器以多种方式影响主机系统。