IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Docker容器的本质 -> 正文阅读

[系统运维]Docker容器的本质

Docker容器让云计算领域再次活跃起来,那些无人问津的后端技术,被再次拿出来讨论。其中最多的一个便是,Docker容器和传统的虚拟机到底有什么区别? 有人说,Docker只是轻量化的虚拟技术?这种说法是否正确,我们往下看。

Docker容器和虚拟机的区别

虚拟机技术开启了云计算时代,云计算简单的说就是把你的软件运行在云主机上,而云主机就是云计算厂商放在机房中的虚拟机(VM) . 虚拟机是采用硬件虚拟化技术将一台物理机器分隔成多个逻辑隔离的单元,每个单元都是一个虚拟的计算机,有一个完整的操作系统。虚拟机和使用一台真实的物理机没有区别,只是不同的虚拟机共享了某些相同硬件。而一般云厂商的机房,规模都很大,所以只需要你有需要,你可以购买“无穷”多的计算资源。

在这里插入图片描述

虚拟机是在物理机的基础上做分隔,每个虚拟机都是独立的一个操作系统,互不干扰,所以它的隔离性非常好。下图中的GuestOS就是一个独立的操作系统,而Docker 中的应用都是在同一个操作系统中。

在这里插入图片描述

Docker是一种沙盒技术,只是一种将进程隔离起来的技术手段,它的目的就是将运行起来的应用,隔离在一个有边界的进程中,仿佛这个边界(容器)里只有它自己,而看不到操作系统周围的其他进程。这种特性,使得在一个系统中运行的容器,到另外一个系统中,也能无差异的运行,因为它的运行只依赖它容器内部的环境,而不受其他影响,这一点非常重要,要知道,最令开发和运维头疼的问题就是,开发环境明明没有问题,到生产环境,就各种报错!这其中最重要的原因就是,应用运行依赖的环境发生了变化。

Docker实现进程隔离的主要原理就是依赖Linux的Namespace技术,我们如果在Linux中执行如下指令:

[root@k8s test]# ps
  PID TTY          TIME CMD
 7238 pts/0    00:00:00 bash
 8846 pts/0    00:00:00 ps

可以看到bash程序的进程号是7238,我们每次运行一个程序,操作系统就会分配一个进程号给程序。如果用top命令查看,操作系统把 1号进程号分给了一个叫systemd的程序,systemd其实就相当与操作系统这个大家庭的家长,用来管理其他服务和整个系统相关的一些东西。

在这里插入图片描述

但是如果我运行一个容器,并进入到容器中,执行ps指令,你看到的就是另一番景象:

root@k8s2:~/k8s2/postgre-exporter# docker run -it busybox /bin/sh
/ # ps
PID   USER     TIME  COMMAND
    1 root      0:00 /bin/sh
    8 root      0:00 ps

docker run指令就是运行一个容器,这里 -it是告诉容器,启动后分配一个输入输出环境(-i即stdin, -t 即tty) 可以直接认为 tty 就是 Linux 给用户提供的一个常驻小程序,用于接收用户的标准输入,返回操作系统的标准输出。当然,为了能够在 tty 中输入信息,你还需要同时开启 stdin(标准输入流).

所以整个指令就是告诉Docker(我们安装的Docker程序)说:请帮我启动一个容器(这里并不存在一个真实的容器,这里的容器指构建一个隔离的环境),并在容器里启动/bin/sh这个 程序。

可以看到 sh这个程序的进程号是1,显然有某种东西遮住了它的双眼,让它以为自己就是老大。其实这里Docker就是采用NameSpace进行了隔离,让sh程序,只能看到隔离环境下的一切。

总结

所以总结一下就是,虚拟机是在硬件之上,模拟多个操作系统,用来做资源隔离。而Docker容器本质上只是Linux上的一个特殊的进程,这个进程被做了一些限制,从而达到了隔离的作用。所以“Docker是一种更轻量的虚拟化技术“ 这种常见的说法其实是说不通的。

除去隔离,Docker还用Cgroup技术,对容器内的进程做资源限制,用rootfs 来修改它的文件系统。利用这三种手段,让Docker的运行不再受环境差异的影响。

附录:

Linux NameSpace

NameSpace是Linux中用来做资源隔离和虚拟化的特性。每个进程都绑定在特定的NameSpace中,且只能查看和操作此命名空间内的资源。

Linux提供了如下几种NameSpace

Namespace   变量               隔离资源
       Cgroup      CLONE_NEWCGROUP   Cgroup 根目录
       IPC         CLONE_NEWIPC      System V IPC, POSIX 消息队列等
       Network     CLONE_NEWNET      网络设备,协议栈、端口等
       Mount       CLONE_NEWNS       挂载点
       PID         CLONE_NEWPID      进程ID
       User        CLONE_NEWUSER     用户和group ID
       UTS         CLONE_NEWUTS      Hostname和NIS域名

Namespace API提供了三种系统调用接口:

  • clone():创建新的进程
  • setns():允许指定进程加入特定的namespace
  • unshare():将指定进程移除指定的namespace

参考

https://pdai.tech/md/devops/docker/docker-01-docker-vm.html

https://coolshell.cn/articles/17010.html

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-01-08 14:27:52  更:2022-01-08 14:28:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 6:32:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码