docker运行原理概述

Client-Server架构

  • docker守护进程运行在宿主机上systemctl start docker
  • daemon进程通过socket从客户端(docker命令)接受命令来运行管理各个容器
  • 容器是一个运行时环境,可以看做是运行中的精简版Linux系统

docker容器技术 vs 虚拟机技术(VMware等)

  • 对比角度:程序运行所在系统、存储占用、运行性能、移植性(类比JDK)。
  • 不再需要Hypevisor硬件资源虚拟化的抽象层,运行在docker容器上的程序直接使用实际宿主物理机的硬件资源,从而在CPU和内存利用率上有明显优势。
  • docker新建一个容器时,是直接使用宿主机的内核。VMware新建一个虚拟机时,需要加载GuestOS内核(VMware上下载的各个os),这个过程至少分钟级别,而docker新建容器则是秒级别。
  • 官方对比图↓
    • docker

    • 虚拟机


docker镜像原理

镜像是什么

  • 轻量级、可执行的独立软件包
  • 打包了运行某个软件(比如tomcat镜像)所需的所有内容,包括:
    • 代码(tomcat代码)
    • 运行时环境(OS、JDK)
    • 依赖库
    • 环境变量
    • 配置文件等
  • 底层基础是Union File System(联合文件系统)
    • UnionFS:一种分层、轻量级且高性能的文件系统,支持对文件系统的修改作为一次提交来一层层的叠加,也支持将不同目录挂载到同一虚拟文件系统下。
    • 镜像由一层层的文件系统组成,通过分层进行继承。基于基础镜像,可以制作出各种具体的应用镜像
    • 镜像运行时,一次联合加载多个文件系统,根据继承关系进行叠加,最终外部只看到一个文件系统,但拥有了完整的文件和目录结构。

镜像加载原理

  • 镜像实际有一层层的文件系统组成,即UnionFS。

    • 文件系统层级中主要关注bootfs和rootfs
    • bootfs包括BootLoader和kernel(操作系统内核),BootLoader主要是引导加载kernel。同Linux,docker镜像最底层是bootfs。Linux系统启动时,会加载bootfs,然后BootLoader加载kernel(Linux内核)至内存,完成之后内存的使用权由bootfs转移给内核,接着卸载掉bootfs。
    • rootfs包含了我们熟悉的Linux文件目录结构:/dev/ /proc/ /bin/ /etc/ 等。对于不同的Linux发行版(Ubuntu、centos等),bootfs基本一致(内核相同,都是Linux-kernel),而rootfs会有差别。
  • why一个centos的docker镜像只有200M,而VMware的centos系统镜像几个G?
    • 对于一个精简的Linux系统,rootfs可以很小,只需要包括最基本的命令、工具和程序库就OK了。
    • docker容器共用了宿主机的系统内核,只需要提供精简的rootfs就OK,所以docker的os镜像体积可以这么小,因此可以把docker容器看做一个精简的Linux系统。
  • why一个tomcat的docker镜像反而比一个centos的docker镜像大得多
    • 每个应用级别的docker镜像,都是源于基础镜像(联合文件系统),类比Java中的Object类,一层层继承得到的。
    • centos镜像拉取:
      [root@richardCentos ~]# docker pull centos
      Using default tag: latest
      latest: Pulling from library/centos
      d8d02d457314: Pull complete
      Digest: sha256:307835c385f656ec2e2fec602cf093224173c51119bbebd602c53c3653a3d6eb
      Status: Downloaded newer image for centos:latest
      docker.io/library/centos:latest
    • tomcat镜像拉取:
      [root@richardCentos ~]# docker pull tomcat
      Using default tag: latest
      latest: Pulling from library/tomcat
      9cc2ad81d40d: Pull complete
      e6cb98e32a52: Pull complete
      ae1b8d879bad: Pull complete
      42cfa3699b05: Pull complete
      8d27062ef0ea: Pull complete
      9b91647396e3: Pull complete
      7498c1055ea3: Pull complete
      a183d8c2c929: Pull complete
      73dd800dda4c: Pull complete
      2bc71ef979ec: Pull complete
      Digest: sha256:80db17f3efd9cdcd9af7c799097fe0d223bbee8f25aa36234ab56292e3d8bd7b
      Status: Downloaded newer image for tomcat:latest
      docker.io/library/tomcat:latest
    • 很明显,tomcat需要联合的镜像更多,可以想象这样的继承关系:

      kernel < centos < jdk < tomcat
  • docker镜像都是只读的,但当容器启动时,一个新的可写层会加载到镜像的顶层,这一层称为“容器层”,即我们进行容器交互操作的对外层,容器层之下的都叫“镜像层”。

docker使用心得

  • 类比Java程序,镜像-Java类,容器-Java类对象,Docker-JDK(跨平台)
  • 关于Logo,大海里(宿主主机)鲸鱼(docker)背着很多集装箱(运行的容器s)
  • 容器可以看作是一个运行中的精简版的Linux环境(文件系统、root用户权限等都有)
  • docker stop不会销毁容器中的数据,docker rm会(如果不做持久化)。stop好比Linux系统关机,重启后数据还在,rm好比卸载/重装了系统,容器中的数据就不复存在了。
  • docker --help xxx 看下官方说明,可以解决很多疑惑
  • 进入容器内操作 docker exec -it dccid/name /bin/bash 要比 docker attach dccid/name 好使,docker exec -t dccid/name ls -lrt 也可以
  • docker logs dccid/name -f --tail n 查容器日志很好用

docker运行原理与使用总结的更多相关文章

  1. docker核心原理

    容器概念. docker是一种容器,应用沙箱机制实现虚拟化.能在一台宿主机里面独立多个虚拟环境,互不影响.在这个容器里面可以运行着我饿们的业务,输入输出.可以和宿主机交互. 使用方法. 拉取镜像 do ...

  2. 一、docker的原理

    一.docker解决什么问题: 高效的利用资源 应用之间相互隔离 应用之间不能发生资源抢占,每个应用只能使用事先注册申请的资源. 环境封装,利于迁移 二.docker的原理: 1.Namespaces ...

  3. 林帆:Docker运行GUI软件的方法

    继上周的“Kubernetes v1.0特性解析”分享之后,本周我们邀请到ThoughtWorks咨询师林帆为大家带来主题为“Docker运行GUI软件的方法”的分享. 嘉宾简介:林帆,Thought ...

  4. 沉淀,再出发:docker的原理浅析

    沉淀,再出发:docker的原理浅析 一.前言 在我们使用docker的时候,很多情况下我们对于一些概念的理解是停留在名称和用法的地步,如果更进一步理解了docker的本质,我们的技术一定会有质的进步 ...

  5. Docker运行GUI软件的方法

    转自 https://www.csdn.net/article/2015-07-30/2825340 简介: Docker通过namespace将容器与主机上的网络和运行环境进行了隔离,默认情况下,在 ...

  6. [转载] Docker 实现原理

    目录 Namespaces 进程 网络 libnetwork 挂载点 chroot
 CGroups UnionFS 存储驱动 AUFS 其他存储驱动 总结 原文链接:https://dravenes ...

  7. ubuntu 中安装jenkins,基于docker运行jenkins

     本文是在ubuntu环境下安装jenkins,jenkins运行在docker容器中,至于docker如何安装,本文不再描述,大家可以上网查询下,如何安装docker,下面先放上一个使用jenkin ...

  8. Docker底层原理介绍

    1.docker介绍 1.1什么是docker Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻 ...

  9. 深入分析 Docker 镜像原理

    摘要:近日, DaoCloud 软件工程师孙宏亮在 CSDN Container 微信群为大家带来了 Docker 镜像原理的深度分享,本次分享的重点是 Docker 镜像,分享的内容主要包含两个部分 ...

随机推荐

  1. 前后端分离 之vue-cli 搭建项目mac 系统讲解

    前端项目搭建必备技术 webpack nodejs 搭建 vue-cli 的安装 以上技术自行了解安装 一:创建前端项目 采用vue-cli 脚手架 1:终端执行如下命令 vue init webpa ...

  2. Java连载10-数据类型取值范围&转义字符

    一.数据类型取值范围 二.八种数据类型在成员变量中的默认值 (1)成员变量,没有赋值,编译不会报错,系统会自动给赋值 byte\int\short\long默认值为0:float\double默认值为 ...

  3. Linux常用的命令及使用方法

    1.请用命令查出ifconfig命令程序的绝对路径 [root@localhost ~]# which ifconfig(ifconfig是linux中用于显示或配置网络设备(网络接口卡)的命令) / ...

  4. redis过期策略与内存淘汰机制分析

    过期策略: 我们在set key时,可以给一个expire time,就是过期时间 这段过期时间以后,redis对key删除使用:定期删除+惰性删除 定期删除指redis默认在100ms内随机抽取一些 ...

  5. 3PHP如何用PDO的连接方式方式导出mysql数据

    首先连接mysql,具体看上一篇 接下来在try{}中加入以下代码 $query="select * from 你的数据表名称"          //$query的内容给个SQL ...

  6. gdb调试和编译后运行结果不一致

    今天在看代码时,遇到这么一段代码,我但是用g++编译了,运行发现有Segmentation fault. 然后就用gdb跟进去看看,可是gdb却正常执行了.不知道什么原因. #include < ...

  7. DC-2靶机

    DC-2 靶机获取:http://www.five86.com/ 靶机IP:192.168.43.197(arp-scan l) 攻击机器IP:192.168.43.199 在hosts文件里添加:1 ...

  8. 如何永久破解IDEA 2019.2

    声明: 支持知识产权,支持正版产权,以下仅限个人学习使用IDEA工具时随笔记录,禁止商业使用. 以下个人提供的激活补丁和激活码来源,均由网上下载,各位也可以自行查找. IDEA官网下载地址:https ...

  9. linux下python中文乱码解决方案

    1. 场景描述 linux服务器下安装了Anaconda3,执行Pyhton的K-means算法,结果出现如下图的中文字符乱码.上次已经解决了,忘记记录解决流程了,这次配置了一台新的服务器,又出现,默 ...

  10. IntelliJ IDEA 从入门到上瘾教程,2019图文版!

    前言:IntelliJ IDEA 如果说IntelliJ IDEA是一款现代化智能开发工具的话,Eclipse则称得上是石器时代的东西了. 其实笔者也是一枚从Eclipse转IDEA的探索者,随着近期 ...