【Docker】docker到底是个啥,底层原理

一、总览

Docker说到底其实就是一个启动了多个Linux NameSpace的应用进程,而这个进程能够使用的资源量,则受Cgroups配置的限制。

  1. 其中NameSpace技术,通过对新创建的进程等重命名,缩小了操作系统视图,实现了看似隔离的效果,本质上仍享用着同一个宿主机的内核,比较明显的例子就是无法修改系统时间。
# 查看可以被限制的资源种类
mount -t cgroup
  1. Cgroups技术则是控制了进程组的使用资源的上限,但是通过top读取的当前宿主机的数据,而非当前容器的数据
# 查看用户进程所占cpu片段时间,默认100000--即100ms
cat /sys/fs/cgroup/cpu.cfs_period_us
# 查看用户的进程所占资源,默认-1-----即不限制
cat /sys/fs/cgroup/cpu.cfs_quota_us 
# 查看生效的进程
cat /sys/fs/cgroup/tasks

二、容器镜像

Mount NameSpace:修改容器进程对文件系统“挂载点”的认知,而挂载在容器根目录上、用来为容器进程提供隔离后执行的文件系统,就是所谓的“容器镜像”也叫rootfs

# 将使用$HOME/test目录作为/进程的根目录
chroot $HOME/test /

最大的优点是:通过容器镜像技术,打包的是整个操作系统的文件和目录,引入了层的概念运用了一种叫做联合文件系统(Union File System)的技术使打包的操作系统被拆分成多层,只有不同层需要再下载打包,以ubuntu为例,可以分为以下三层。
在这里插入图片描述

  • 只读层:ro+wh代表readonly+whiteout,文件删除的动作其实是新创建了一个.wh.foo文件,在联合挂载时,foo文件会被wh.foo遮挡,使得看起来消失,所以whiteout可以理解为“白障”
  • init层:专门用来存放启动容器时写入的指定数据如:/etc/hosts、/etc/resolv.conf信息,该配置信息不会随着docker commit提交
  • 可读写层:专门用来存放修改rootfs的增量,使用docker commit和push指令,保存被修改的可读写层,容器的Volume也出现在这一层。

三、Docker命令

# 将当前目录制作成helloword镜像
docker build -t helloword .
# 查看镜像
docker image ls
# 启动镜像,将容器内80端口映射到宿主机的4000端口
docker run -p 4000:80 helloworld python app.py
# 给容器镜像取名
docker tag helloworld greyPigeon/helloworld:v1
# 镜像推送
docker push greyPigeon/helloworld:v1
# 镜像进入
docker exec -it 容器名 /bin/sh
# 镜像提交
docker commit 提交id greyPigeon/helloworld:v2
# Volume挂载,home文件夹挂载到容器的test目录下,相当于mount --bind /home /test
docker run -v /home:/test
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值