Docker中无法运行CentOS 6交互式会话,CentOS 7正常运行求助
你遇到的情况是:在Docker 18.03.0-ce环境中运行centos:6的交互式会话时,容器会直接退出回到终端,但centos:7却能正常启动并进入交互式shell。即使尝试了降级Docker版本、拉取不同子版本的CentOS 6镜像(6.6/6.7/6.8等),问题依然存在。
核心原因
CentOS 6的系统基础库(尤其是glibc 2.12)和内核版本过于老旧,与Docker 1.13及以后版本默认使用的runc运行时存在兼容性冲突。runc依赖的部分系统调用和安全特性(比如seccomp过滤器)在CentOS 6的环境中无法正常工作,导致容器内的bash进程无法完成启动流程,直接退出。
可行解决方案
这里提供几个经过社区验证的解决方法,按推荐优先级排序:
1. 禁用seccomp过滤器启动容器
启动CentOS 6容器时添加--security-opt seccomp=unconfined参数,关闭seccomp的安全限制,让容器兼容旧系统库的运行需求:
docker run -it --security-opt seccomp=unconfined centos:6
这个方法无需修改Docker全局配置,是最快的临时解决方式。
2. 切换到lxc运行时(适用于Docker 1.13-18.x版本)
如果禁用seccomp无效,可以尝试切换到对旧系统兼容性更好的lxc运行时:
- 首先安装lxc驱动:
yum install -y lxc - 启动容器时指定
--runtime=lxc参数:docker run -it --runtime=lxc centos:6
注意:部分Docker版本需要先在/etc/docker/daemon.json中配置启用lxc运行时,配置完成后重启Docker服务:
{ "runtimes": { "lxc": { "path": "/usr/bin/lxc" } } }
3. 降级到Docker 1.12.x版本
Docker 1.12及更早版本默认使用的是docker-runc的旧分支,对CentOS 6的兼容性更好。如果你需要长期稳定运行CentOS 6容器,可以考虑降级到Docker 1.12.6这类稳定旧版本,降级后直接运行docker run -it centos:6即可正常启动交互式会话。
额外建议
CentOS 6已经在2020年11月结束了官方支持,不仅存在未修复的安全漏洞,而且与现代容器生态的兼容性会持续恶化。如果业务允许,建议尽早迁移到CentOS 7或更高版本的镜像,从根源上避免这类兼容性问题。
内容的提问来源于stack exchange,提问作者Mathieu Westphal

