容器相比于 VM 虚拟机是属于弱隔离,在某些场景下需要增强容器的隔离或扩展应用场景来解决新的问题,如下场景在云原生实践过程中也经常会遇见,本文收集并分析了目前主流的容器嵌套方法,可根据当前团队的现状来综合评估后选择。
- 使用容器来提供传统的操作系统运行环境。VMLC(类虚拟机容器) 是 VM Like Container 的缩写,其设计目标是为开发者在容器中提供类似虚拟机的环境,包括:systemd服务管理能力,sshd远程登录能力,docker/k8s嵌套能力等。
- 在容器中嵌套运行容器,提供沙盒环境。
- 在容器/POD 中运行 Kubernetes 集群。
- 在流水线执行时任务本身是封装在容器中,但是流水线的执行过程可能会包含镜像的拉取、构建、上传、运行等任务场景。
- 在 Jenkins 中,使用 Docker 容器作为构建的 Slave 节点。
- 在短期使用环境运行容器时,例如学习容器的基本使用,可以快速创建和回收环境,并减少资源的消耗。
- 在产品快速体验或 POC 场景下,将容器服务运行在容器中进行打包,快速部署运行。
在 Docker 中运行 Docker 目前可提供三类方法
- 方法1:共享宿主机 dockerd 服务
- 方法2:独立隔离的容器运行环境
- 方法3:使用 Sysbox 运行时
方法1:共享宿主机 dockerd 服务
dockerd 服务在启动时会提供基于 socket 的连接方式,docker client 客户端可以选择使用 Socket 文件或 TCP/IP 的方式连接 Socket 来访问 dockerd 进行使用和管理功能,默认会使用 /var/run/docker.sock
的 socket 文件接口方式连接。
当在宿主机上运行容器 Container0 后,需要在该容器内继续运行 docker 命令来使用容器功能,可以参考如下步骤:
- 准备 Container0 的容器镜像,该镜像提前安装好 docker 客户端命令;或者也可以直接使用 docker 官方提供的镜像
docker:latest
- 基于上述镜像来运行 Container0 的容器,该步骤需要配置宿主机 dockerd 连接方式。
- 在 Container0 中使用 docker 客户端命令进行容器的使用和管理
容器的嵌套和管理示意图: