zoukankan      html  css  js  c++  java
  • Docker之路-认识docker

    初识docker


    Docker 是基于 OS 层的虚拟化技术之上的容器引擎,实现对进程的封装隔离。开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上。

    Docker为开发人员以及系统管理员提供了一个用于开发、部署、和在容器中运行应用的平台。

    使用linux容器来部署应用这种方式称为容器化。

    容器并非新的事物(古时候的陶罐也是一种容器,只不过存储的不是application),但是他们(容器)被用于轻松部署应用却很新鲜。

    容器化变得越来月流行,应为容器化有太多优点:

    • 灵活:即便在复杂的应用也可以被封装
    • 轻量:容器通过共享主机内容及资源,减小自己的体重
    • 可互换:你可以实时部署更新和升级
    • 可移植:one build,run everywhere!可以在本地构建、部署到云,并在任何地方运行
    • 可伸缩:你可以增加并自动分发容器副本
    • 可堆叠:可以垂直地、动态地堆叠服务,即在原有镜像的基础新增功能

    Containers are portable

    docker镜像和容器


    docker服务中,有几个概念是需要我们首先理解的,最主要的是镜像images和容器container,这2个概念对于初学者来说很容易混淆,理解他们将有助于我们在操作容器时调理清晰。

    Docker client

    Docker提供给用户的客户端。Docker Client提供给用户一个终端,用户输入Docker提供的命令来管理本地或者远程的服务器。

    Docker daemon

    Docker服务的守护进程。每台服务器(物理机或虚机)上只要安装了Docker的环境,基本上就跑了一个后台程序Docker Daemon,Docker Daemon会接收Docker Client发过来的指令,并对服务器的进行具体操作。

    Docker Registry

    这个可认为是Docker Images的仓库,就像git的仓库一样,用来管理Docker镜像的,提供了Docker镜像的上传、下载和浏览等功能,并且提供安全的账号管理可以管理只有自己可见的私人image。

    images

    一个镜像是一个可执行包,包含了启动一个应用所需要的一切资源,例如:代码,运行时,lib库,环境变量以及配置文件。

    Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。

    Docker 镜像不包含任何动态数据,其内容在构建之后也不会被改变。

    Docker镜像采用分层存储结构(AUFS)。每一层构建好后就不会在变,一层层构建,前一层是后一层的基础,由多层文件系统联合组成。

    Docker 镜像可以传到 Docker Registry,Docker Registry里面可以创建私有或公共仓库,每个仓库可以包含多个标签(Tag),每个标签对应一个镜像。通过这个分层存储与标签管理,Docker 镜像可以像代码一样,非常方便的拉取,在任何 Docker Egnine上运行,带来全新的运维模式。

    containers

    容器是镜像的运行时实例,一个镜像在运行时在内存中会变成什么样子?它就像一个带状态的镜像或者理解成用户进程。你可以使用docker ps来查看正在运行的容器列表。

    Docker Container是真正跑项目程序、消耗机器资源、提供服务的地方,Docker Container通过Docker Images启动,在Docker Images的基础上运行你需要的代码。

    你可以认为Docker Container提供了系统硬件环境,然后使用了Docker Images这些制作好的系统盘,再加上你的项目代码,跑起来就可以提供服务了。

    容器的实质是进程但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。容器销毁,数据随之被删除。任何保存于容器存储层的信息都会随容器删除而丢失。

    镜像是容器的基础,每次执行 docker run 的时候都会指定哪个镜像作为容器运行的基础。在运行的容器中做文件修改,然后docker commit,就相当于在原有镜像的基础上,再叠加上容器的存储层,并构成新的镜像。

    镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

    容器和虚拟机


    大家都在说docker轻量,区别于传统的kvm,那么他们究竟有什么不同呢?

    容器在Linux上本地运行,并与其他容器共享主机的内核。它运行一个独立的进程,不占用比其他任何可执行程序更多的内存,使其轻量级。

    虚拟机(VM)运行一个成熟的“guest”操作系统,通过虚拟机监控程序对主机资源进行虚拟访问。通常,vm提供的资源比大多数应用程序所需的要多。

    传统的虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需要的应用进程;而容器内的应用进程直接运行与宿主的内核,容器没有自己的内核,也没有硬件虚拟,容器是轻量级的虚拟化技术。

    比较下两图的差异,左图虚拟机的Guest OS层和Hypervisor层在docker中被Docker Engine层所替代。

    虚拟机的Guest OS即为虚拟机安装的操作系统,它是一个完整操作系统内核;虚拟机的Hypervisor层可以简单理解为一个硬件虚拟化平台,它在Host OS是以内核态的驱动存在的。

    虚拟机实现资源隔离的方法是利用独立的OS,并利用Hypervisor虚拟化CPU、内存、IO设备等实现的。 对比虚拟机实现资源和环境隔离的方案,docker就显得简练很多。

    docker Engine可以简单看成对Linux的NameSpace、Cgroup、镜像管理文件系统操作的封装。

    docker并没有和虚拟机一样利用一个完全独立的Guest OS实现环境隔离,它利用的是目前Linux内核本身支持的容器方式实现资源和环境隔离。

    简单的说,docker利用namespace实现系统环境的隔离;利用Cgroup实现资源限制;利用镜像实现根目录环境的隔离。

    docker常用指令


    ## List Docker CLI commands
    docker
    docker container --help
    
    ## Display Docker version and info
    docker --version
    docker version
    docker info
    
    ## Execute Docker image
    docker run hello-world
    
    ## List Docker images
    docker image ls
    
    ## List Docker containers (running, all, all in quiet mode)
    docker container ls
    docker container ls --all
    docker container ls -aq
    
  • 相关阅读:
    单元测试
    python gdb
    圣诞树
    网络是怎样连接的 读书笔记
    POJ2104 K-th Number(整体二分)
    [SDOI2011]消耗战
    [HNOI2011]XOR和路径
    [HNOI2013]游走
    [JSOI2008]球形空间产生器
    POJ2728 Desert King
  • 原文地址:https://www.cnblogs.com/vinsent/p/11635515.html
Copyright © 2011-2022 走看看