首页 > 其他分享 >Docker容器底层技术

Docker容器底层技术

时间:2022-10-16 23:31:38浏览次数:64  
标签:容器 PID namespace 网卡 cgroup Docker cpu 底层

前戏

为了更好地理解容器的特性,可以刨析容器的底层实现技术。​​cgroup​​​和​​namespace​​是最重要的两种技术。cgroup实现资源限额,namespace实现资源隔离。

 cgroup

cgroup全称Control Group。Linux操作系统通过cgroup可以设置进程使用CPU、内存和IO资源的限额,例如: --cpu-shares、-m、--device-write-bps实际上就是在配置cgroup

cgroup是什么样的?我们可以在 /sys/fs/cgroup中找到它。还是用例子来说明,启动一个容器,设置 --cpu-shares=512

Docker容器底层技术_linux

查看容器的ID

Docker容器底层技术_linux_02

在 /sys/fs/cgroup/cpu/docker目录中,Linux会为每个容器创建一个cgroup目录,以容器长ID命名

Docker容器底层技术_linux_03

注:

​目录中包含所有与cpu相关的cgroup配置,文件cpu.shares保存的就是 --cpu-shares的配置,值为512。同样的,/sys/fs/cgroup/memory/docker和 /sys/fs/cgroup/blkio/docker中保存的是内存以及Block IO的cgroup配置。

namespace

简介:

在每个容器中,我们都可以看到文件系统、网卡等资源,这些资源看上去是容器自己的。拿网卡来说,每个容器都会认为自己有一块独立的网卡,即使宿主机上只有一块物理网卡。这种方式非常好,它使得容器更像一个独立的计算机。


Linux实现这种方式的技术是namespace。namespace管理着host中全局唯一的资源,并可以让每个容器都觉得只有自己在使用它。换句话说,namespace实现了容器间资源的隔离。


inux使用了6种namespace,分别对应6种资源:Mount、UTS、IPC、PID、Network和User

Mount namespace

Mount namespace让容器看上去拥有整个文件系统(用来隔离文件系统的挂载点)。容器有自己的/目录,可以执行mount和umount命令。当然我们知道这些操作只在当前容器中生效,不会影响到host和其他容器。

UTS namespace

UTS namespace让容器有自己的hostname(主机名)。默认情况下,容器的hostname是它的短ID,可以通过 -h或 --hostname参数设置

IPC namespace

IPC namespace让容器拥有自己的共享内存和信号量(semaphore)来实现进程间通信,而不会与host和其他容器的IPC混在一起。

PID namespace

容器在宿主机中以进程的形式运行

Docker容器底层技术_linux_04

Docker容器底层技术_linux_05

注:所有容器的进程都挂在dockerd进程下,同时也可以看到容器自己的子进程。

进程的PID不同于host中对应进程的PID,容器中PID=1的进程当然也不是host的init进程。也就是说:容器拥有自己独立的一套PID,这就是PID namespace提供的功能。

Network namespace

Network namespace让容器拥有自己独立的网卡、IP、路由等资

User namespace

User namespace让容器能够管理自己的用户,宿主机不能看到容器中创建的用户

注:在容器中创建了用户cjk,但宿主机t中并不会创建相应的用户

Docker容器底层技术_docker_06

标签:容器,PID,namespace,网卡,cgroup,Docker,cpu,底层
From: https://blog.51cto.com/u_15222272/5760763

相关文章

  • 配置容器应用Secret
    Secret资源的功能类似于ConfigMap,但它专用于存放敏感数据,例如密码、数字证书、私钥、令牌和SSHkey等,而不需要把这些敏感数据暴露到镜像或者PodSpec中。Secret可以以V......
  • 选择 podman 的理由, 以及它和 Kubernetes , Docker 的区别
    转载自https://zhuanlan.zhihu.com/p/506265757前言大家好,我是Liangdi,podman4.x版本已经发布了,我也从docker开始向podman迁移,所以是合适的时候写点podma......
  • Docker基础知识 (16) - 部署 Redis 集群
    Redis是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value的NoSQL数据库,并提供多种语言的API。大型网站为了提高站点响应速度,使用......
  • docker desktop url protocl 技术以及使用
    dockerdesktop在登录的使用使用了自定义的url协议,同时基于web进行系统登录,认证完成之后会生成code,之后通过url协议进入使用docker协议定义 <array><dict><key>CFBun......
  • c++ container容器(string,vector,map,queue,stack等等)
    STL和c++标准库标准模板库STL部分包含在C++标准库中的软件库。c++标准库:即以std::开头,但是部分编译器厂商也会把STL的内容放在std::namespace里面由于​​一个常见的误解​......
  • Docker容器
    Docker容器1、创建容器#创建容器的格式:dockerrun[option]image[cmd]#dockerrun运行流程1、检查本地是否有指定镜像,如果没有则去对应的仓库下载镜像2、启动容器......
  • docker安装Sonarqube
    简介sonarqube是一款用于代码质量管理的开源工具,它主要用于管理源代码的质量。通过插件形式,可以支持众多计算机语言,比如java,C#,go,C/C++,PL/SQL,Cobol,JavaScrip,......
  • Docker安装MongoDB并使用Navicat连接
    MongoDB简介:MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。是一个介于关系数据库和非关系数据库之间......
  • 将 Bean 放入 Spring 容器中的五种方式
    文章目录​​1.@Configuration+@Bean​​​​2.@Componet+@ComponentScan​​​​3.@Import注解导入​​​​3.1@Import直接导入类​​​​3.2@Import+ImportSelect......
  • 同一应用docker版本和非docker版本共存下,利用shell脚本获取非docker版本pid
    问题场景:在同一VM上部署了同一应用的docker版本和非docker版本,在基于非docke版本应用做jenkinsCI/CD时,通过ps-ef操作获取应用的pid,会受到docker版本应用的干扰,如下以上......