Ubuntu 18.04 Docker镜像应安装哪款Linux headers?
在ubuntu:18.04 Docker镜像中安装匹配的Linux Headers
嘿,这个问题得先搞清楚Docker的内核工作逻辑——容器是共享宿主机内核的,你在容器里执行uname -r得到的4.19.76-linuxkit其实是宿主机(大概率是Docker Desktop)的内核版本,而不是ubuntu:18.04镜像自带的内核(容器本身根本不会独立运行内核)。
这就导致了一个关键问题:ubuntu:18.04默认软件源里的linux-headers包,都是对应Ubuntu 18.04官方支持的内核版本(比如4.15.x系列),你看到的linuxkit定制内核的headers,在默认源里是找不到的。
针对你的需求,这里有几个可行的方案:
- 如果是要编译内核模块:最稳妥的方式是在宿主机上编译模块,然后把编译好的模块文件挂载到容器里使用。因为内核模块必须严格匹配宿主机的内核版本,容器里的环境既没有完整的内核编译依赖,也拿不到对应linuxkit内核的headers包。
- 如果只是需要通用头文件(用户态程序编译):可以安装Ubuntu 18.04默认的通用headers包,执行命令:
这个包会安装对应镜像发行版的内核headers,虽然版本和宿主机的linuxkit内核不一致,但对于大多数用户态程序的编译需求(比如依赖内核头文件的用户态工具)已经够用了。apt-get update && apt-get install linux-headers-generic - 非要在容器里装匹配linuxkit内核的headers:这会比较麻烦,因为linuxkit是Docker定制的内核,你需要手动从linuxkit的代码仓库拉取对应版本的内核源码,然后编译生成headers文件。这种方式步骤繁琐,除非有特殊需求,否则不推荐。
内容的提问来源于stack exchange,提问作者Kintarō




