• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
导航菜单
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • windows
  • 服务器硬件
  • 服务器运维
  • 云计算
  • 虚拟化
  • IIS教程
  • Linux
  • Apache
  • Ftp
  • DNS
  • Nginx
您的位置:首页 > 服务器 >虚拟化 > Docker 特性与原理详细介绍与解析

Docker 特性与原理详细介绍与解析

作者:破修电脑的 字体:[增加 减小] 来源:互联网

本文主要包含Docker,特性与原理,Docker,特性与原理详细介绍,Docker,特性与原理分析等服务器相关知识,破修电脑的 希望可以进行参考

Docker 特性与原理

首先看看Docker提供了哪些特性:

  1. 交互式Shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上,例如运行一个一次性交互shell
  2. 文件系统隔离:每个进程容器运行在完全独立的根文件系统里
  3. 写时复制:采用写时复制方式创建根文件系统,这让部署变得极其快捷,并且节省内存和硬盘空间
  4. 资源隔离:可以使用cgroup为每个进程容器分配不同的系统资源
  5. 网络隔离:每个进程容器运行在自己的网络命名空间里,拥有自己的虚拟接口和IP地址
  6. 日志记录:Docker将会收集和记录每个进程容器的标准流(stdout/stderr/stdin),用于实时检索或批量检索
  7. 变更管理:容器文件系统的变更可以提交到新的映像中,并可重复使用以创建更多的容器。无需使用模板或手动配置

从以上特性分别看实现原理

1. 交互式Shell

首先我们允许一个交互式的容器

$docker run -i -t <image name> /bin/bash

这样就建立了一个到容器内的交互式连接,看到的是如下的命令行:

root@df3880b17407:/#

这里我们启动了一个容器,以bash作为其根进程.

root@df3880b17407:/# ps aux 
USER    PID %CPU %MEM  VSZ  RSS TTY   STAT START  TIME COMMAND
root     1 0.0 0.0 18164 2020 ?    S  06:06  0:00 /bin/bash

可以看到,在这个容器中,bash 的 PID为 1,而实体机平常情况下,是这样的:

root@ubuntu:~# ps aux 
USER    PID %CPU %MEM  VSZ  RSS TTY   STAT START  TIME COMMAND
root     1 0.0 0.1 24716 2612 ?    Ss  Sep04  0:01 /sbin/init

大家都知道,所有进程的共同祖先都是 PID=1的进程

所以在容器中,所有以后创建的进程都是通过/bin/bash 创建的,PID=1的 bash是容器中所有进程的祖先理解了这点后,对容器的理解就很简单了.

2. 文件系统隔离

对于一个正在运行的容器,其文件系统都是一个从根目录开始的虚拟文件系统,在容器中看到的是这样的:

root@df3880b17407:/# ll /
total 68
drwxr-xr-x  2 root root 4096 Jul 22 22:51 bin
drwxr-xr-x  2 root root 4096 Apr 10 22:12 boot
drwxr-xr-x  3 root root 4096 Jul 22 22:49 dev
drwxr-xr-x 85 root root 4096 Sep 5 06:49 etc
drwxr-xr-x  2 root root 4096 Apr 10 22:12 home
drwxr-xr-x 16 root root 4096 Jul 22 22:50 lib
drwxr-xr-x  2 root root 4096 Aug 12 03:30 lib64
drwxr-xr-x  2 root root 4096 Jul 22 22:48 media
drwxr-xr-x  2 root root 4096 Apr 10 22:12 mnt
drwxr-xr-x  2 root root 4096 Jul 22 22:48 opt
dr-xr-xr-x 356 root root  0 Sep 5 06:06 proc
drwx------  2 root root 4096 Jul 22 22:51 root
drwxr-xr-x  7 root root 4096 Sep 5 07:23 run
drwxr-xr-x  2 root root 4096 Aug 12 03:30 sbin
drwxr-xr-x  2 root root 4096 Jul 22 22:48 srv
dr-xr-xr-x 13 root root  0 Sep 5 06:06 sys
drwxrwxrwt  2 root root 4096 Sep 5 06:55 tmp
drwxr-xr-x 20 root root 4096 Sep 5 06:11 usr
drwxr-xr-x 19 root root 4096 Sep 5 06:11 var

其实真是情况是这样的,容器中的文件系统都是挂载到了真是系统中的一个目录下面.

/var/lib/docker/containers/<image-long-id>/rootfs

这个配置是怎么来的呢,其实所有容器的管理都是通过lxc来管理的,lxc的配置文件放在

/var/lib/docker/containers/<image-long-id>/config.lxc

文件中有字段表示容器挂载到哪个文件目录, 比如我的是这样的:

lxc.rootfs = /var/lib/docker/containers/df3880b17407575cd642a6b7da3c7e417a55fad5bbd63152f89921925626d2b6/rootfs

打开看一下,一目了然:

root@ubuntu:/var/lib/docker/containers/df3880b17407575cd642a6b7da3c7e417a55fad5bbd63152f89921925626d2b6/rootfs# ll
total 84
drwxr-xr-x 53 root root 4096 Sep 5 00:23 ./
drwx------ 4 root root 4096 Sep 5 00:53 ../
drwxr-xr-x 2 root root 4096 Jul 22 15:51 bin/
drwxr-xr-x 2 root root 4096 Apr 10 15:12 boot/
drwxr-xr-x 3 root root 4096 Jul 22 15:49 dev/
drwxr-xr-x 85 root root 4096 Sep 4 23:49 etc/
drwxr-xr-x 2 root root 4096 Apr 10 15:12 home/
drwxr-xr-x 16 root root 4096 Jul 22 15:50 lib/
drwxr-xr-x 2 root root 4096 Aug 11 20:30 lib64/
drwxr-xr-x 2 root root 4096 Jul 22 15:48 media/
drwxr-xr-x 2 root root 4096 Apr 10 15:12 mnt/
drwxr-xr-x 2 root root 4096 Jul 22 15:48 opt/
drwxr-xr-x 2 root root 4096 Apr 10 15:12 proc/
drwx------ 2 root root 4096 Jul 22 15:51 root/
drwxr-xr-x 7 root root 4096 Sep 5 00:23 run/
drwxr-xr-x 2 root root 4096 Aug 11 20:30 sbin/
drwxr-xr-x 2 root root 4096 Jul 22 15:48 srv/
drwxr-xr-x 2 root root 4096 Mar 12 18:41 sys/
drwxrwxrwt 2 root root 4096 Sep 4 23:55 tmp/
drwxr-xr-x 20 root root 4096 Sep 4 23:11 usr/
drwxr-xr-x 19 root root 4096 Sep 4 23:11 var/

这些就是容器中的真实目录了,容器中对于目录的操作都是操作了这个host机器的真实目录。
对于不同的容器,挂载点是不一样的,而容器不能穿越根目录上一级去访问, 所以这里对每一个容器都做到了文件系统隔离。

3. 写时复制

我们把每一个

/var/lib/docker/containers/<image-long-id>

看做是一个容器的配置目录的话,可以看到在配置目录下面有一个 rw/目录,打开看有些什么

total 36
drwxr-xr-x 9 root root 4096 Sep 5 00:23 ./
drwx------ 4 root root 4096 Sep 5 00:53 ../
drwxr-xr-x 6 root root 4096 Sep 4 23:49 etc/
drwxr-xr-x 2 root root 4096 Sep 5 00:23 run/
drwxrwxrwt 2 root root 4096 Sep 4 23:55 tmp/
drwxr-xr-x 7 root root 4096 Sep 4 23:11 usr/
drwxr-xr-x 5 root root 4096 Sep 4 23:11 var/
-r--r--r-- 1 root root  0 Sep 4 23:06 .wh..wh.aufs
drwx------ 2 root root 4096 Sep 4 23:06 .wh..wh.orph/
drwx------ 2 root root 4096 Sep 4 23:11 .wh..wh.plnk/

里面是一些不完整的根目录,这不能说明什么,但是我们在container中写入文件后,看看其中的变化

在容器中执行以下命令

root@df3880b17407:/# touch /opt/x

在 /opt 下我们生成了一个文件

再看看

root@ubuntu:/var/lib/docker/containers/df3880b17407575cd642a6b7da3c7e417a55fad5bbd63152f89921925626d2b6/rw# ll
total 40
drwxr-xr-x 10 root root 4096 Sep 5 01:00 ./
drwx------ 4 root root 4096 Sep 5 00:53 ../
drwxr-xr-x 6 root root 4096 Sep 4 23:49 etc/
drwxr-xr-x 2 root root 4096 Sep 5 01:00 opt/
drwxr-xr-x 2 root root 4096 Sep 5 00:23 run/
drwxrwxrwt 2 root root 4096 Sep 4 23:55 tmp/
drwxr-xr-x 7 root root 4096 Sep 4 23:11 usr/
drwxr-xr-x 5 root root 4096 Sep 4 23:11 var/
-r--r--r-- 1 root root  0 Sep 4 23:06 .wh..wh.aufs
drwx------ 2 root root 4096 Sep 4 23:06 .wh..wh.orph/
drwx------ 2 root root 4096 Sep 4 23:11 .wh..wh.plnk/

是的,在host机器上新生成了 opt/目录,这里做到了容器的写时复制

4. 资源隔离

以系统的三大进程间通信的消息队列来看

初始状态在 ghost, ipcs -q 查看消息队列

root@ubuntu:~/codes/msq# ipcs -q

------ Message Queues --------
key    msqid   owner   perms   used-bytes  messages  

在ghost 创建一个, 这里楼主自己写的代码创建的消息队列:

root@ubuntu:~/codes/msq# ./main 1
Create msq with key id 65536root@ubuntu:~/codes/msq# ipcs -q

------ Message Queues --------
key    msqid   owner   perms   used-bytes  messages  
0x00000001 65536   root    666    0      0      

然后在容器中查看 ipcs -q

root@df3880b17407:/# ipcs -q

------ Message Queues --------
key    msqid   owner   perms   used-bytes  messages 

可以看到系统资源是隔离的,这里只是说了一部分,其实还包括了可以通过cgoup对其做CPU和Memory的Quota管理.
默认情况下是使用了所有CPU和内存的,但是可以在config.lxc增加如下配置设置CPU等,具体可以参考lxc的文档

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Docker实践8:Compose,docker实践compose
  • Docker buildx构建多平台镜像并推送到私有仓库的方法
  • Docker三个基本概念镜像(Image)容器(Container)仓库(Repository)
  • 什么是Docker?为什么要使用Docker
  • docker 开源的应用容器引擎
  • 如何给docker设置http代理
  • docker官方mysql镜像自定义配置详解
  • 详解Docker数据管理(数据卷&数据卷容器)
  • 如何利用Docker容器实现代理转发与数据备份详解
  • 详解Docker Swarm 在持续集成测试中的应用

相关文章

  • Docker容器自启动的实现方法
  • vmware12中安装 RedHat RHEL7.2系统的详细步骤(图文)
  • OpenStack Mitaka 版本中的 domain 和 admin详解
  • 详解为 Docker 设置代理
  • virtualbox安装增强功能时【未能加载虚拟光盘】的问题解决
  • Centos 7中Docker私有仓库的搭建方法
  • docker 镜像加速CentOS7详细介绍
  • 虚拟机实现静态IP登录和无线上网
  • Windows10下安装Docker的步骤图文教程
  • docker中搭建overlay 网络实验环境

文章分类

  • windows
  • 服务器硬件
  • 服务器运维
  • 云计算
  • 虚拟化
  • IIS教程
  • Linux
  • Apache
  • Ftp
  • DNS
  • Nginx

最近更新的内容

    • Ubuntu虚拟机:如何选择虚拟化软件
    • CentOS 一键安装Openstack详细介绍
    • Docker 中的容器完全解析
    • Docker 私有仓库恢复实例详解
    • Docker实践8:Compose,docker实践compose
    • Docker下Tomcat容器中使用Mysql的方法
    • 使用docker快速搭建Spark集群的方法教程
    • docker日常使用的实用小技巧总结(推荐)
    • docker 深入了解镜像、容器、仓库等概念
    • Docker磁盘空间使用分析与清理的方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有