大白话Docker入门(二)

简介: #大白话Docker入门(二) 上篇的[大白话Docker入门(一)](http://www.atatech.org/articles/65782)让我们认识了docker,知道docker大概是怎么玩的。初步的印象可能会让你觉得和现在的VM的部署方式也挺像的,比如docker image就是一

大白话Docker入门(二)

上篇的大白话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,没有业务处理的时候也不会占用你的系统资源。。。

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

Docker是如何做到的

我们先思考一下,一台服务器给我们开发的项目到底提供了哪些能力让他运行起来呢?cpu、内存、硬盘、网络、操作系统、工具软件还有项目的运行环境(jre等)。当具备了这些能力的机器,我们会说这台机器给项目提供了可以运行的环境。
我们知道VM技术可以将一台物理机器部署为多台虚拟机器,解决了很多物力资源的浪费以及方便的管理能力。那么VM是怎么做到的呢?关键词:Hypervisor,VM在物理机器的操作系统上建立了一个中间软件层Hypervisor,Hypervisor利用物理机器的资源,虚拟出多个新虚拟的硬件环境,这些硬件环境可以共享宿主机的资源。这些新的虚拟的硬件环境,安装操作系统和相应的软件后便形成了一台台的虚拟机器。
那么Docker有什么不同呢?Docker很聪明的利用linux的一些技术走了一条捷径:Docker选择了和虚拟化完全不同的思路,并不去虚拟化任何硬件,而是对硬件资源在不同的docker container之间做了 “隔离” 。隔离使每个docker container之间拥有了不同的环境(硬盘空间、网络、系统的工具包),并且又可以共享需要的硬件资源(cpu、内存、系统内核),达到了和虚拟机能提供的同样的功能。

MJHfm1c.jpg

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-filesystems-busyboxrw.png
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
  2. 查看现在是不是有了一个新的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!

下一节

下面我会简单的再分享一下现在docker的实际使用场景,和mircoservice 的概念。。。让大家了解docker对于现有技术和模式的影响~

目录
相关文章
|
11天前
|
运维 Cloud Native Docker
云原生技术入门:Docker容器化实战
【9月更文挑战第20天】本文将引导你走进云原生技术的世界,通过Docker容器化技术的实战演练,深入理解其背后的原理和应用。我们将一起探索如何在云平台上利用Docker简化部署、扩展和管理应用程序的过程,并揭示这一技术如何改变现代软件的开发和运维模式。
|
1天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker与Kubernetes入门
【9月更文挑战第30天】在云计算的浪潮中,云原生技术正以前所未有的速度重塑着软件开发和运维领域。本文将通过深入浅出的方式,带你了解云原生的核心组件——Docker容器和Kubernetes集群,并探索它们如何助力现代应用的构建、部署和管理。从Docker的基本命令到Kubernetes的资源调度,我们将一起开启云原生技术的奇妙之旅。
|
6天前
|
Cloud Native 持续交付 Docker
云原生技术入门与实践:Docker容器化部署示例
【9月更文挑战第25天】在数字化转型的浪潮下,云原生技术成为推动企业创新的重要力量。本文旨在通过浅显易懂的语言,为初学者揭示云原生技术的核心概念及其应用价值。我们将以Docker容器为例,逐步引导读者了解如何将应用程序容器化,并在云端高效运行。这不仅是对技术趋势的跟随,更是对资源利用和开发效率提升的探索。
25 4
|
7天前
|
关系型数据库 Linux 虚拟化
Docker入门基础实战
Docker入门基础实战
|
15天前
|
Kubernetes Cloud Native 开发者
云原生入门:从Docker到Kubernetes的旅程
【9月更文挑战第16天】 本文将带你进入云原生的世界,从理解Docker容器的基础开始,逐步深入到Kubernetes集群管理。我们将通过简单的代码示例和实际操作,探索这两个关键技术如何协同工作,以实现更高效、灵活的应用程序部署和管理。无论你是云原生新手还是希望深化理解,这篇文章都将为你提供清晰的指导和实用的知识。
51 11
|
2月前
|
图形学 C#
超实用!深度解析Unity引擎,手把手教你从零开始构建精美的2D平面冒险游戏,涵盖资源导入、角色控制与动画、碰撞检测等核心技巧,打造沉浸式游戏体验完全指南
【8月更文挑战第31天】本文是 Unity 2D 游戏开发的全面指南,手把手教你从零开始构建精美的平面冒险游戏。首先,通过 Unity Hub 创建 2D 项目并导入游戏资源。接着,编写 `PlayerController` 脚本来实现角色移动,并添加动画以增强视觉效果。最后,通过 Collider 2D 组件实现碰撞检测等游戏机制。每一步均展示 Unity 在 2D 游戏开发中的强大功能。
80 6
|
2月前
|
运维 开发者 Docker
Docker容器部署实战:从入门到精通
【8月更文挑战第31天】 本文将引导读者了解如何使用Docker容器技术来简化和加速应用程序的部署过程。文章将通过实际案例探讨Docker的基本概念、架构,以及如何创建、管理和维护Docker容器。我们将通过详细的代码示例和操作指导,展示如何在本地环境或云基础设施上部署应用,并讨论如何克服在实际部署中可能遇到的挑战。无论你是DevOps工程师、软件开发者还是IT专业学生,本文都将为你提供深入理解并有效使用Docker的全面指南。
|
2月前
|
Kubernetes Cloud Native 云计算
云原生入门:从Docker到Kubernetes的旅程
【8月更文挑战第31天】 在数字化转型的浪潮中,云原生技术成为推动现代软件开发的关键力量。本文将引导读者理解云原生的基本概念,通过Docker和Kubernetes的实际应用示例,展示如何在云平台上部署和管理容器化应用。我们将一起探索服务编排、持续集成和微服务架构的实践之路,旨在为初学者揭开云原生技术的神秘面纱,并激发对这一前沿领域的深入探索。
|
2月前
|
运维 Kubernetes Cloud Native
云原生技术入门:Kubernetes和Docker的协同工作
【8月更文挑战第31天】 在云原生的世界里,容器技术是基石。本文将带你了解如何通过Kubernetes和Docker这两个强大的工具,搭建起你的云原生应用架构。我们将一起探索它们如何相互配合,提升开发与运维的效率。准备好了吗?让我们启航,探索云原生的奥秘!
|
2月前
|
Kubernetes Cloud Native 开发者
云原生入门:从Docker到Kubernetes的旅程
【8月更文挑战第31天】在数字化浪潮中,云原生技术如同一艘航向未来的船,承载着企业转型的梦想。本文将带领读者从Docker容器的基础出发,一路驶向Kubernetes的广阔海域。通过浅显易懂的语言和实用的代码示例,我们将探索云原生的核心概念、架构设计以及如何在实际项目中应用这些技术。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供一次宝贵的学习之旅。让我们一起启航,发现云原生的魅力!