【转载】大白话Docker入门(二)

时间:2021-08-07 23:19:04

原文:https://yq.aliyun.com/articles/63517?spm=a2c4e.11153940.blogcont63035.15.12011c3fddklk0

上篇的大白话Docker入门(一)让我们认识了docker,知道docker大概是怎么玩的。初步的印象可能会让你觉得和现在的VM的部署方式也挺像的,比如docker image就是一个系统备份文件,docker container就是一个跑起来的vm,那docker到底又有什么特别的呢?

不一样的Docker

简单的列一下目前这个阶段我们很容易发现的几点:

  • docker image的体积非常的小,注意看下之前我们用到的几个image的size,一个完整功能的ubuntu才100多mb。docker image如此小的体积,让我们可以方便的在网络上传输和分享,对于公司来说就提供了对大量image的管理和分发的可能。
ruideMacBook-Pro:~ ruihuang$ docker images
REPOSITORY TAG SIZE
job1 latest 1.093 MB
ubuntu latest 127.2 MB
busybox latest 1.093 MB
hello-world latest 1.848 kB
  • docker的系统启动的耗时为0。昨天如果自己也尝试启动hello-world的同学可能会知道,docker run hello-world的命令是瞬间完成的,你并没有感觉到加载image,启动系统的耗时,命令完成就直接输出了结果。程序执行完后container也跟着关闭,也并没有保存镜像的时间,但下次再运行还是会保留你处理过的状态。
  • docker系统占用资源极少,我们知道如果我们开启了一个vm的系统,不论是linux的或者windows,就算什么都不运行都会占用一部分内存,但是docker container启动后如果不运行程序,你是看不到系统资源被占用的。

这些特点是不是完全和vm不同呢?并且有了这些特点,是不是很多之前没有的应用场景就会产生?比如我们可以把一个项目build成一个image,然后方便分发出去,别人拿到后也不用关心你的项目需要什么环境或者依赖,只要docker run一下就能运行。。而且速度很快,甚至在一台开发机都可以管理成百上千的container,没有业务处理的时候也不会占用你的系统资源。。。

【转载】大白话Docker入门(二)

到这里可能你已经感受到docker的一些厉害之处了吧。。。那么是不是也很好奇docker到底是怎么做到的?那么我们继续往下。

Docker是如何做到的

我们先思考一下,一台服务器给我们开发的项目到底提供了哪些能力让他运行起来呢?cpu、内存、硬盘、网络、操作系统、工具软件还有项目的运行环境(jre等)。当具备了这些能力的机器,我们会说这台机器给项目提供了可以运行的环境。

我们知道VM技术可以将一台物理机器部署为多台虚拟机器,解决了很多物力资源的浪费以及方便的管理能力。那么VM是怎么做到的呢?关键词:Hypervisor,VM在物理机器的操作系统上建立了一个中间软件层Hypervisor,Hypervisor利用物理机器的资源,虚拟出多个新虚拟的硬件环境,这些硬件环境可以共享宿主机的资源。这些新的虚拟的硬件环境,安装操作系统和相应的软件后便形成了一台台的虚拟机器。

那么Docker有什么不同呢?Docker很聪明的利用linux的一些技术走了一条捷径:Docker选择了和虚拟化完全不同的思路,并不去虚拟化任何硬件,而是对硬件资源在不同的docker container之间做了 “隔离” 。隔离使每个docker container之间拥有了不同的环境(硬盘空间、网络、系统的工具包),并且又可以共享需要的硬件资源(cpu、内存、系统内核),达到了和虚拟机能提供的同样的功能。

【转载】大白话Docker入门(二)

Docker使用的Linux核心的组建如下:(截取自Docker的元件– Linux核心部分)

  • AUFS(chroot) – 用来建立不同的操作系统和隔离运行时的硬盘空间
  • Namespace – 用来隔离Container的执行空间
  • Cgroup – 分配不同的硬件资源
  • SELinux – 用来保护linux的网络安全
  • Netlink – 用来让不同的Container之间的进程保持通信
  • Netfilter – 建立Container埠為基礎的網路防火牆封包過濾
  • AppArmor – 保護Container的網路及執行安全
  • Linux Bridge – 讓不同Container或不同主機上的Container能溝通
  • 。。。

这里面的每一项技术当然都值得我们去理解,这里我只拿其中最具代表性的AUFS来展开一下,让大家理解一下docker隔离的思路。 (除了AUFS的技术请大家自己研究吧,后面我也会整理一些资源发出来)

AUFS -> Another Union File System,AUFS的技术可以让多个文件目录union成一个新的目录,并且可以对这个新的目录进行读写操作。

那这有什么用呢?如果你有一张只读的cd数据盘,但是你却想编辑里面的内容,你通常的做法是不是把内容拷贝到本地硬盘,然后再编辑。但如果你可以利用AUFS技术,你就可以将硬盘中的一个空目录和你的cd数据盘进行union形成一个新的目录,接着你对这个目录读取,会得到的cd盘内的数据,当你对这个目录的内容进行编辑,编辑的内容AUFS会自动讲修改内容保存在你union的那个空目录内,当你再次读区的时候,AUFS也会将你硬盘中记录的改动内容优先于CD数据盘中的内容读取出来,这样对你来说这就完全是一个可编辑的目录内容了。

【转载】大白话Docker入门(二)

AUFS虽然看起来思路很简单,但是docker却利用这个技术做出了大文章。我们可以想象一下docker的Image,其实也就是一个事先制作好的只读的文件目录,当我们要使用这个系统功能的时候,docker为我们开辟了一个新的文件夹和这个image做了union,提供给docker container做为系统运行的存储,这个image里面已经包含了系统程序、工具软件、以及程序,当系统启动后产生的运行时文件(如logs、临时目录等)或新安装的软件都在这个新的文件夹内。这样我们在启动一个container的时候,其实并没有加载镜像的过程,也不会像vm一样需要安装一个系统这么负责,只是做了一次unoin,一切就和安装过系统的虚拟机同样使用了。另外docker还提供了一个 docker commit 命令,这个命令可以随时将你现在的运行中的cantainer构建成一个新的image。

  1. 查看当前的container列表

    命令:docker ps -a
ruideMacBook-Pro:~ ruihuang$ docker ps -a
CONTAINER ID IMAGE COMMAND STATUS
78bd49d9b73e ubuntu "bash" Exited (0) 17 hours ago
  1. 通过一个ubuntu的container生成一个新的image,这个image内包含了在这次container中的改动

    命令:docker commit container-id
ruideMacBook-Pro:~ ruihuang$ docker commit 78bd49d9b73e job2 sha256:e0c0d617d96cafedf008e3f276f35a2b95d15f1ed7535b58d19c8db8b18f8fb2
  1. 查看现在是不是有了一个新的container了

    命令:docker images
ruideMacBook-Pro:~ ruihuang$ docker images
REPOSITORY TAG IMAGE ID SIZE
job2 latest e0c0d617d96c 127.2 MB
job1 latest de714ebe3a54 1.093 MB
ubuntu latest f753707788c5 127.2 MB
busybox latest e02e811dd08f 1.093 MB
hello-world latest c54a2cc56cbb 1.848 kB

看到这里是不是大致的理解了docker container和docker images之间的联系了。

小结一下

Dcoker通过很多的所谓 隔离 的方式,让多个docker container之间共享了同一台机器上的资源,但又是相互隔离的(比如container1 和 container2 用的是完全不同的硬盘空间、网络地址等),这样就让docker container成为了我们项目理想的开发、测试、发布的环境。非常的轻量,简单,易于分发和管理。这也就是docker的目标:Build, Ship and Run Any App, Anywhere!

MARSGGBO♥原创







2019-3-8

【转载】大白话Docker入门(二)的更多相关文章

  1. 大白话Docker入门(一)

    摘要: #大白话Docker入门(一) 随着docker现在越来越热门,自己也对docker的好奇心也越来越重,终于忍不住利用了一些时间把docker学习一遍.目前的资料不少,但是由于docker的发 ...

  2. 【转载】大白话Docker入门(一)

    原文:https://yq.aliyun.com/articles/63035 随着docker现在越来越热门,自己也对docker的好奇心也越来越重,终于忍不住利用了一些时间把docker学习一遍. ...

  3. 转载:Docker入门只需看这一篇就够了

    最近项目中需要用到 Docker 打包,于是上网查找资料学习了 Docker 的基本命令,记录一下自己遇到的一些错误. 准备开始自己写,结果看到了阮一峰老师的文章,瞬间就没有写下去的动力了,转载大佬的 ...

  4. docker入门(二)容器与镜像的理解

    10张图带你深入理解Docker容器和镜像 申明:此篇文章是转载的(原文地址http://dockone.io/article/783),今天意外发现已经有人转载了(复制了),希望大家关注原创 原本打 ...

  5. docker入门(二)容器与镜像的关系

    [编者的话]本文用图文并茂的方式介绍了容器.镜像的区别和Docker每个命令后面的技术细节,能够很好的帮助读者深入理解Docker. 这篇文章希望能够帮助读者深入理解Docker的命令,还有容器(co ...

  6. Docker入门二

    容器管理 1.docker create创建一个容器,但容器并没启动,就和我们创建虚拟机一样,创建了虚拟机后没启动 [root@centos-02 ~]# docker create -it cent ...

  7. Docker入门教程(二)命令

    Docker入门教程(二)命令 [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第二篇,介绍了Docker的基本命令以及命令的用法和功能. 在Docker ...

  8. 【实战】Docker入门实践二:Docker服务基本操作 和 测试Hello World

    操作环境 操作系统:CentOS7.2 内存:1GB CPU:2核 Docker服务常用命令 docker服务操作命令如下 service docker start #启动服务 service doc ...

  9. Docker入门(转载)

    Docker入门 一.Docker 1.什么是容器? 容器就是将软件打包成标准化单元,用于开发.交付和部署.容器是轻量的.可执行的独立软件包 ,包含软件运行所需的所有内容:代码.运行时环境.系统工具. ...

随机推荐

  1. 自然语言16_Chunking with NLTK

    Chunking with NLTK 对chunk分类数据结构可以图形化输出,用于分析英语句子主干结构 # -*- coding: utf-8 -*-"""Created ...

  2. A trip through the Graphics Pipeline 2011_11 Stream Out

    Welcome back! This time, the focus is going to be on Stream-Out (SO). This is a facility for storing ...

  3. 服务器端验证--验证框架验证required.

    struts2表单验证里field-validator type值一共可以取哪些?都什么含义? int 整数:double 实数:date 日期:expression 两数的关系比较: email E ...

  4. jad安装

    见:http://www.myexception.cn/eclipse/1469829.html 最开始看了一个坑爹的博客,由于是低级菜鸟一直被误导(设置的是.class的打开方式) 执行完链接够的步 ...

  5. javascript笔记——密码组合规则

    //6-16个字符,字母加数字或符号的组合密码[必须全部包含] var filter = /^(?=.*[0-9])(?=.*[a-z])(?=.*[!@#$%^&*])(?=.*[A-Z]) ...

  6. Spring+MyBatis实践—工程配置

    初次实践:Spring+MyBatis技术搭建框架,采用Bootstrap前端开源框架. 简介: MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除 了几乎所 ...

  7. LightOJ 1135(线段树)

    题解引自:http://www.cnblogs.com/*qi/archive/2012/05/27/2520642.html 题意: 有n个数,刚开始都为0 add i , j 给i,j区间内 ...

  8. Flask-WTF 创建表单P2

    表单安全 无需任何配置,FlaskForm将提供具有CSRF(Cross-site request forgery,也被称为one-click attack 或者session riding,通常缩写 ...

  9. 网口划VLAN

    do sho run int g0/28 int g0/18 sw mo acc sw acc vlan 220 span portfa exit do wr exit

  10. 决策树(Decision Tree

    转化自:https://trainings.analyticsvidhya.com/courses/course-v1:AnalyticsVidhya+LPDS2019+LPDS2019_T1/cou ...