05 修改内核参数

一 引入问题

runC在创建容器时,出于安全考虑,把容器中/proc、/sys相关的目录默认都作为 read-only mout处理,

所以默认情况下,我们在容器内是无法修改这俩目录下的内容的

[root@test04 ~]# docker container run -ti --rm --name test centos:7 sh
sh-4.2# cat /proc/sys/net/ipv4/ip_forward
1
sh-4.2# echo 0 > /proc/sys/net/ipv4/ip_forward
sh: /proc/sys/net/ipv4/ip_forward: Read-only file system  # 只读文件系统

也就说,只要你的容器部署privileged特权方式启动的,在容器内很多操作都是不允许的,比如在容器内你就无法写/proc与/sys

而/proc/sys/net下包含tcp/ip协议栈的大多数内核参数,容器有自己的独立的网络名称空间,有时候我们需要为其定义自己单独的tcp/ip协议参数

二 储备知识

2.1 容器内网络参数的来源

创建一个新的容器,会为其分配新的网络名称空间,在该网络名称空间内/proc/net下的网络参数并非是重新初始化的,更不是从宿主机的网络名称空间继承而来的,而是原来系统里的默认值

# 1、在宿主机查看内核参数默认值
[root@test04 ~]# cat /proc/sys/net/ipv4/tcp_max_syn_backlog 
1024
# 2、在宿主机的网络空间里修改该参数值
[root@test04 ~]# echo 2048 > /proc/sys/net/ipv4/tcp_max_syn_backlog
[root@test04 ~]# 

# 3、启动容器,发现使用的依然是系统默认值
[root@test04 ~]# docker container run -ti --rm --name test centos:7 sh
sh-4.2# cat /proc/sys/net/ipv4/tcp_max_syn_backlog
1024

2.2 容器网络名称空间

容器网络名称空间隔离了哪些东西

  • 第一种,网络设备,这里指的是 lo,eth0 等网络设备。你可以可以通过 ip link命令看到它们。

  • 第二种是 IPv4 和 IPv6 协议栈。从这里我们可以知道,IP 层以及上面的 TCP 和 UPD 协议栈也是每个 Namespace 独立工作的。

    所以 IP、TCP、PUD 的很多协议,它们的相关参数也是每个 Namespace 独立的,这些参

    数大多数都在 /proc/sys/net/ 目录下面,同时也包括了 TCP 和 UPD 的 port 资源。

  • 第三种,IP 路由表,这个资源也是比较好理解的,你可以在不同的 Network Namespace运行 ip route 命令,就能看到不同的路由表了。

  • 第四种是防火墙规则,其实这里说的就是 iptables 规则了,每个 Namespace 里都可以独立配置 iptables 规则。

  • 最后一种是网络的状态信息,这些信息你可以从 /proc/net 和 /sys/class/net 里得到,这里的状态基本上包括了前面 4 种资源的的状态信息。

三 如何修改容器内网络参数

3.1 以特权模式启动容器

如果我们用特权模式启动,当然是可以修改的,但是开启特权模式会增加安全风险,所以通常不推荐

[root@test04 ~]# docker container run -ti --rm --privileged --name test centos:7 sh
sh-4.2# cat /proc/sys/net/ipv4/ip_forward
1
sh-4.2# echo 0 > /proc/sys/net/ipv4/ip_forward
sh-4.2# cat /proc/sys/net/ipv4/ip_forward
0

注意修改成功后,你去宿主机查看,仍然不变,因为容器拥有自己的独立的网络名称空间

[root@test04 ~]# cat /proc/sys/net/ipv4/ip_forward
1

3.2 在宿主机使用nsenter

如果你可以用root账号登录到宿主机,那么可以借助nsenter命令进入容器名称空间修改,这个方法也不推荐,以为生产环境严格来讲是不允许root用户登录的

而且即便你真的这么做也不行,因为等容器启动之后你再用nsenter去修改了参数,很多建立好的链接都不会生效
这就需要你重启应用,生产环境又不可能让你随便重启应用

使用nsenter来修改

# 1、root 用户
nsenter -t <容器的pid> -n bash -c 'echo 600 > /proc/sys/net/ipv4/tcp_keepalive_time'

# 2、非root用户
sudo nsenter -t <pid> -n sudo bash -c 'echo 600 > /proc/sys/net/ipv4/tcp_keep
alive_time' 

nsenter使用详解

联系管理员微信tutu19192010,注册账号

上一篇
下一篇
Copyright © 2022 Egon的知识星球 egonlin.com 版权所有 帮助IT小伙伴学到真正的技术