zoukankan      html  css  js  c++  java
  • 虚拟化容器之Docker

    一、Docker

    1,概念

      Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows 机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。

    2,docker的应用场景

    • Automating the packaging and deployment of applications(使应用的打包与部署自动化)
    • Creation of lightweight, private PAAS environments(创建轻量、私密的PAAS环境)
    • Automated testing and continuous integration/deployment(实现自动化测试和持续的集成/部署)
    • Deploying and scaling web apps, databases and backend services(部署与扩展webapp、数据库和后台服务)
      云计算、大数据,移动技术的快速发展,加之企业业务需求的不断变化,导致企业架构要随时更改以适合业务需求,跟上技术更新的步伐。毫无疑问,这些重担都将压在企业开发人员身上;团队之间如何高效协调,快速交付产品,快速部署应用,以及满足企业业务需求,是开发人员亟需解决的问题。Docker技术恰好可以帮助开发人员解决这些问题。
      为了解决开发人员和运维人员之间的协作关系,加快应用交付速度,越来越多的企业引入了DevOps这一概念。但是,传统的开发过程中,开发、测试、运维是三个独立运作的团队,团队之间沟通不畅,开发运维之间冲突时有发生,导致协作效率低下,产品交付延迟, 影响了企业的业务运行。Docker技术将应用以集装箱的方式打包交付,使应用在不同的团队中共享,通过镜像的方式应用可以部署于任何环境中。这样避免了各团队之间的协作问题的出现,成为企业实现DevOps目标的重要工具。以容器方式交付的Docker技术支持不断地开发迭代,大大提升了产品开发和交付速度。
      此外,与通过Hypervisor把底层设备虚拟化的虚拟机不同,Docker直接移植于Linux内核之上,通过运行Linux进程将底层设备虚拟隔离,这样系统性能的损耗也要比虚拟机低的多,几乎可以忽略。同时,Docker应用容器的启停非常高效,可以支持大规模的分布系统的水平扩展,真正给企业开发带来福音。

    3,docker与虚拟机的区别

    虚拟机:

    • 基础设施(Infrastructure)。它可以是你的个人电脑,数据中心的服务器,或者是云主机
    • 虚拟机管理系统(Hypervisor)。利用Hypervisor,可以在主操作系统之上运行多个不同的从操作系统。类型1的Hypervisor有支持MacOS的HyperKit,支持Windows的Hyper-V、Xen以及KVM。类型2的Hypervisor有VirtualBox和VMWare workstation。
    • 客户机操作系统(Guest Operating System)。假设你需要运行3个相互隔离的应用,则需要使用Hypervisor启动3个客户机操作系统,也就是3个虚拟机。这些虚拟机都非常大,也许有700MB,这就意味着它们将占用2.1GB的磁盘空间。更糟糕的是,它们还会消耗很多CPU和内存。
    • 各种依赖。每一个客户机操作系统都需要安装许多依赖。如果你的应用需要连接PostgreSQL的话,则需要安装libpq-dev;如果你使用Ruby的话,应该需要安装gems;如果使用其他编程语言,比如Python或者Node.js,都会需要安装对应的依赖库。
    • 应用。安装依赖之后,就可以在各个客户机操作系统分别运行应用了,这样各个应用就是相互隔离的。

    docker:

    • 基础设施(Infrastructure)
    • 主操作系统(Host Operating System)。所有主流的Linux发行版都可以运行Docker。对于MacOS和Windows,也有一些办法”运行”Docker。
    • Docker守护进程(Docker Daemon)。Docker守护进程取代了Hypervisor,它是运行在操作系统之上的后台进程,负责管理Docker容器。
    • 各种依赖。对于Docker,应用的所有依赖都打包在Docker镜像中,Docker容器是基于Docker镜像创建的。
    • 应用。应用的源代码与它的依赖都打包在Docker镜像中,不同的应用需要不同的Docker镜像。不同的应用运行在不同的Docker容器中,它们是相互隔离的。

     区别:

      虚拟机多了一层guest OS,同时Hypervisor会对硬件资源进行虚拟化。docker直接使用硬件资源,适用的平台更广、启动速度快、资源利用率高。

    二、Docker结构

      docker的整个生命周期有三部分组成:镜像(image)+容器(container)+仓库(repository)。容器是由镜像实例化而来,这和我们学习的面向对象的概念十分相似,我们可以把镜像看作类,把容器看作类实例化后的对象。镜像是文件, 容器是进程。 容器是基于镜像创建的, 即容器中的进程依赖于镜像中的文件, 这里的文件包括进程运行所需要的可执行文件, 依赖软件, 库文件, 配置文件等等。

    1,docker镜像

       镜像(Image)就是一堆只读层(read-only layer)的统一视角,存在于/var/lib/docker/aufs目录下。

    2,docker容器

       容器(container)的定义和镜像(image)几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。容器 = 镜像 + 读写层。并且容器的定义并没有提及是否要运行容器。 

    三、基本命令

    1,操作docker镜像

    以下[image]含义皆为:镜像+版本号,即可写作[image:tag],不写tag则会使用默认tag:latest

    docker pull [image]    从仓库拉取/更新镜像

    docker push [image]    推送镜像到仓库

    docker images    查看本地所有镜像

    docker search [image]    从仓库搜索相关镜像

    docker rmi [image]    删除镜像

    docker save [image] > xxxx.tar    保存镜像到文件

    docker load < [image]    加载文件镜像到环境

    docker history [image]    镜像操作历史

    2,操作docker容器

    docker run -itd --name cent -p 80:80 [image] /bin/bash    通过镜像创建并启动一个容器

      -i:交互式操作

      -t:终端

      -d:以deamon守护进程的方式运行

      --name:容器名称,可以不使用id号,用名称对容器进行操作

      -p:端口映射,本机端口:容器端口

      /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash

    docker start [container]    启动容器

    docker stop [container]    关闭容器

    docker restart [container]    重启容器

    docker exec -it [container] /bin/bash    连接到正在运行的容器

    docker rm [container]    删除容器

    docker ps -a    查看所有容器,不加-a为查看正在运行的容器

    docker rm `ps -a -q `    删除所有容器

    docker inspect [container]    查看容器配置信息

    docker commit -m [comment] [container] imageName:tag     将容器保存为本地镜像

    docker export [container] > xxxx.tar    保存容器到文件

    docker import < xxxx.tar - xxxx:version   导入容器到环境,保存为当前系统下的镜像(xxxx:version)

    docker load < xxxx.tar 导入镜像到环境

    镜像导入和容器导入的区别:

    1,docker save保存的是镜像(image),docker export保存的是容器(container)

    2,容器导入 是将当前容器 变成一个新的镜像

    3,镜像导入 是复制的过程

    save 和 export区别:

    1,save 保存镜像所有的信息-包含历史

    2,export 只导出当前的信息

    3,docker load用来载入镜像包,docker import用来载入容器包,但两者都会恢复为镜像

    4,docker load不能对载入的镜像重命名,而docker import可以为镜像指定新名称

    应用案例

    脚本:init.sh

    1 docker run -itd --name app -p 3306:3306 -p 8080:8080 app:v1.0 /bin/bash

    脚本:exec.sh

    1 docker exec -it app /bin/bash

    脚本:start.sh

    1 docker start app

    脚本:stop.sh

    1 docker stop app
  • 相关阅读:
    NOIP2010提高组乌龟棋 -SilverN
    NOIP2009 提高组T3 机器翻译 解题报告-S.B.S
    controller向layout传值
    解决Yii2中刷新网页时验证码不刷新的问题
    关联表 重命名
    定义action的允许访问方式
    js 拷贝clone
    是否包含指定字符串
    indexOf()定义和用法
    直接借鉴的 ids拼接
  • 原文地址:https://www.cnblogs.com/guanghe/p/12166675.html
Copyright © 2011-2022 走看看