美文网首页
云原生技术系列-Containerization容器化Docke

云原生技术系列-Containerization容器化Docke

作者: GeekerLou | 来源:发表于2019-11-30 16:45 被阅读0次

    前言

    Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。

    Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

    容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

    image.png

    正文

    物理机、虚拟机和容器

    image.png image.png image.png

    容器虚拟化的是操作系统而不是硬件,容器之间是共享同一套操作系统资源的。
    虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统。
    因此容器的隔离级别会稍低一些。

    image.png

    明显区别:
    Docker比虚拟化少了两层,取消了 hypervisor 层和 GuestOS 层,使用 Docker Engine 进行调度和隔离,所有应用共用主机操作系统,因此在体量上 Docker 较虚拟机更轻量级,在性能上优于虚拟化,接近裸机性能。

    本质区别:

    • 虚拟机是操作系统级别的资源隔离,
    • 容器是进程级别的隔离
    image.png

    Docker优势:

    • 更低的硬件成本
    • 更快速的部署环境
    • 更简便的环境维护
    • 与微服务架构更为契合

    Docker不足:

    • 隔离效果不如VM,共享宿主机操作系统的一些基础库等
    • 网络配置功能相对简单,主要以桥接方式为主
    • 查看日志也不够方便灵活

    Docker的优势

    • 轻量:在一台机器上运行的多个Docker容器可以共享这台机器的操作系统内核;它们能够迅速启动,只需占用很少的计算和内存资源。镜像是通过文件系统层进行构造的,并共享一些公共文件。这样就能尽量降低磁盘用量,并能更快地下载镜像。
    • 标准:Docker容器基于开放式标准,能够在所有主流Linux版本、Microsoft Windows以及包括VM、裸机服务器和云在内的任何基础设施上运行。
    • 安全:Docker赋予应用的隔离性不仅限于彼此隔离,还独立于底层的基础设施。Docker默认提供最强的隔离,因此应用出现问题,也只是单个容器的问题,而不会波及到整台机器。

    Docker Engine

    Docker daemon: 运行在宿主机上,Docker守护进程,用户通过Docker client(Docker命令)与Docker daemon交互

    Docker client: Docker 命令行工具,是用户使用Docker的主要方式,Docker client与Docker daemon通信并将结果返回给用户,Docker client也可以通过socket或者RESTful api访问远程的Docker daemon

    image.png

    Docker的理念

    Build, Ship, and Run Any App, Anywhere

    image.png image.png

    Docker的核心组成

    image.png

    镜像Image

    image.png image.png
    • 内容:打包程序运行所需的应用、环境等参数信息
    • 分层结构,每层一个hash值,类似于Git commit,方便回滚,因此建议在制作每一层的功能尽量相对独立和完整。
    • 好处:减少了硬盘存储的大小。保存每次变更,不保存每个版本的完整结果。
    • 注意:删除每一层不需要的内容。Why?某一层遗忘删除的内容会被保留到后续的层级,从而导致最终镜像膨胀。

    容器(Container)

    镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。

    容器可以被创建、启动、停止、删除、暂停等 。

    容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。使用数据卷来帮助解决这个问题。

    数据卷(Volume)

    文件数据存储是数据交互的重要组成,在虚拟机中,通常直接采用虚拟机的文件系统作为应用数据等文件的存储位置,这种方式的问题在于,虚拟机或者容器出现问题导致文件系统无法使用时,之前存放的数据也就丢失了。

    另外一种方式,就是挂载真实数据源的方式,Docker就是采用这种方式,通过底层的Union File System 技术,除了能够从宿主操作系统中挂载目录外,还能够建立独立的目录持久存放数据,或者在容器间共享。

    数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此, 使用数据卷后,容器可以随意删除、重新run,数据却不会丢失。

    仓库( Repository)

    镜像仓库是Docker用来集中存放镜像文件的地方,类似于我们之前常用的代码仓库。

    一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本 。我们可以通过<仓库名>:<标签>的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以latest作为默认标签。

    Docker Registry有公服和私服之分,类似于Maven的公共仓库和私有仓库。

    网络(Network)

    image.png
    • Bridge方式:默认网络连接方式,使用一个虚拟的网络接口,桥接到宿主机上的网络接口上。
    • Host方式:host方式可以让容器无需创建自己的网络协议栈,而直接访问宿主机的网络接口,在容器中执行ip addr会发现与宿主机的网络配置是一样的,host方式让容器直接使用宿主机的网络接口,传输数据的效率会更加高效,避免bridge方式带来的额外开销,但是这种方式也可以让容器访问宿主机的D-bus等网络服务,可能会带来意想不到的安全问题,应谨慎使用host方式
    • Container方式:让容器共享一个已经存在的网络配置
    • None方式:不会对容器的网络做任务配置,需要用户自己去定制。

    docker生命周期

    image.png

    可以看到,容器的生命周期分为五种状态

    • Created:容器已经被创建,容器所需的相关资源已经准备就绪,但容器中的程序还未处于运行状态。
    • Running:容器正在运行,也就是容器中的应用正在运行。
    • Paused:容器已暂停,表示容器中的所有程序都处于暂停 ( 不是停止 ) 状态。
    • Stopped:容器处于停止状态,占用的资源和沙盒环境都依然存在,只是容器中的应用程序均已停止。
    • Deleted:容器已删除,相关占用的资源及存储在 Docker 中的管理信息也都已释放和移除。

    此外,这张图中对于一些常用的指令也进行了标注,建议可以结合这张图,一方面了解docker容器的生命周期,一方面也了解一些常用的docker操作指令。

    DockerFile

    作用:定义docker镜像构建步骤,适用于构建比较复杂的docker镜像。有点类似于makefile之于CPP项目,shell script之于shell指令。

    命令 含义
    FROM 指定基础镜像
    RUN 构建指令,会生成新的层。支持 \ 换行,多条之间用 && 连接,减少新层
    COPY 将构建命令所在的主机本地的文件或目录,复制到镜像文件系统
    ADD 不仅能够将构建命令所在的主机本地的文件或目录,而且能够将远程URL所对应的文件或目录,作为资源复制到镜像文件系统。
    ENTRYPOINT 主要用于对容器进行一些初始化
    CMD 定义容器中主程序的启动命令,建议使用数组的方式
    EXPOSE 指定暴露的端口
    VOLUME 指定挂载持久卷的位置

    构建镜像指令:

    docker build  -t {目录} –f {dockerfile文件地址} 
    

    Dockerfile的使用-一个完整的Demo


    image.png

    总结

    • 虚拟化:将计算机物理资源进行抽象、转换为虚拟的计算机资源提供给程序使用的技术
    • 容器技术:为操作系统自身支持一些接口,能够让应用程序间可以互不干扰的独立运行
    • docker:在开发、部署、运维,以及集群化等方面,显著的提升了工作效率
    • 镜像:docker中可以运行的虚拟环境,对比对象中的类
    • 容器:从镜像中产生,隔离出来的虚拟环境,对比类的实例
    • 网络:程序间进行数据交换,docker中共可以创建虚拟网络进行环境隔离
    • 数据卷:docker中文件存储,既能挂载,又能建立独立的目录持久存放数据,还能容器共享
    • docker daemon:实现docker这套容器化技术的工具,以服务的形式运行以便静默的提供功能
    • docker cli:docker engine提供的通过命令行调用daemon接口的工具
    • dockerfile:定义docker镜像构建步骤

    最后来一张图:

    image.png

    相关文章

      网友评论

          本文标题:云原生技术系列-Containerization容器化Docke

          本文链接:https://www.haomeiwen.com/subject/sxbowctx.html