华为 黄强——华为使用Docker支持系统容器的优化实践
2020-02-27 170浏览
- 1.Docker系统容器实践 黄强 / h.huangqiang@huawei.com 华为软件工程师
- 2.
- 3.
- 4.
- 5.概述 实现 增强 限制和约束 总结
- 6.什么是系统容器 • Pid 1进程通常是/sbin/init • 容器内通常有一些系统服务 • 像使用虚拟机一样使用容器
- 7.系统容器 VS 应用容器 容器性能 启动时间 资源损耗 镜像大小 应用适配 系统容器 高 慢 较低 较大 高 应用容器 高 快 低 小 低
- 8.为什么需要系统容器 • From VM to container • Legacy application • Legacy application • Legacy application
- 9.概述 实现 增强 限制和约束 总结
- 10.--system-container • Dockerfile • Seccomp • Capabilities • Env • Oci-systemd-hook/other hooks • Reboot
- 11.Oci-systemd-hook •https://github.com/projectatomic/oci-systemd-hook• OCI systemd hook enables users to run systemd in docker and OCI compatible runtimes such as runc without requiring --privileged flag. • it does thefollowing:• Mounts a tmpfs on /run and /tmp • If there is content in the container image's /run and /tmp that content will be copied onto the tmpfs. • Creates a /etc/machine-id based on the the containers UUID • Mounts the hosts /sys/fs/cgroups file systemd read-only into the container • /sys/fs/cgroup/systemd will be mounted read/write into the container.
- 12.概述 实现 增强 限制和约束 总结
- 13.资源信息隔离 • 容器内的资源信息隔离 • 容器内看到自己的/proc/meminfo, /proc/stat等 • 容器内可以使用top命令 • 解决方案 • lxcfs
- 14.容器内使用cgroup • 容器内使用cgroup • 不能修改容器自身的cgroup配置 • 容器内可以创建和管理新的cgroup • 解决方案 • Kernel:Cgroup namespace • Docker run --cgroup private host “”container:id• 限制 • 需要--privileged
- 15.动态添加设备 •https://github.com/moby/moby/pull/8348• 实现: • Nsenter – mknod • Modify cgroup • “Docker update –add/del-device” or “docker-tools”
- 16.动态挂卷(1 •http://jpetazzo.github.io/2015/01/13/docker-mount-dynamicvolumes/• 实现 • Find filesystem • Find the device • Nsenter – mknod – mount to tmp – bind mount – unmounts tmp
- 17.动态挂卷(2 • 限制 • 只能针对块设备上的目录 • 存在安全隐患
- 18.SELinux(1 • 容器内使用SELinux • 容器内支持SELinux的所有操作 • 使用容器rootfs自己的SELinux规则 • 难点 • SELinux没有隔离
- 19.SELinux(2 • 实现 • 隔离容器和host的SELinux开关 (https://chromium-review.googlesource.com/c/361464/• 容器内挂载SELinuxfs • Relabel容器rootfs • 修改docker二进制的安全上下文
- 20.SELinux(3 • 问题和限制 • SELinux依然没有隔离 • host和container共用同一套规则,如果rootfs不兼容,需要在host上 关闭SELinux • 容器间共用同一套规则 • 修改了host上的docker二进制安全上下文,影响host上的 docker SELinux policy
- 21.容器内使用Systemd(1 • 新版本systemd(>=231 会破坏容器的io •https://github.com/moby/moby/issues/27202• 原因 • Systemd close /dev/console breaks io copy
- 22.容器内使用Systemd(2 • 解决(workaround • 修改containerd处理io copy的方式,循环处理io.Copy • 社区解决方案 • 修改io处理方式,改用epoll来实现 •https://github.com/containerd/console/pull/10•https://github.com/containerd/containerd/pull/1259
- 23.概述 实现 增强 限制和约束 总结
- 24.容器内使用LVM • LVM、fdisk等操作在docker容器中无法正常使用 • 容器的/dev使用tmpfs而不是devtmpfs • 现代的devtmpfs(2.6.32之后 负责创建device node,而不是udev • 解决方案 • 容器中要运行udev相关服务(容器中的udev可以收到udev kernel events • 需要定制化容器中的udev rule • 终极方案 •https://www.linuxplumbersconf.org/2014/ocw/system/presentations/2157/original/Dynamic%20Device%20Management-v3.pdf
- 25.容器内的特权操作 • 建议非--privileged模式 • 默认只使能支持系统容器的最小权能 • 如果容器内需要其他操作(比如mount ,需要自己通 过--cap-add和--security-opt来修改权限控制
- 26.插入内核模块 • 没有对内核隔离性上做更多增强,新插入的内核模块将 依赖所属子系统的内核隔离情况 • 不建议在启动多容器的环境上在容器中运行依赖内核模 块的应用
- 27.概述 实现 增强 限制和约束 总结
- 28.总结 • 通过适配和增强,docker容器也可以支持系统容器,实 现更广泛的应用适配 • 在一些特性上还是存在限制,无法完全实现使用虚拟机 的效果
- 29.