Docker简介及其原理

Docker简介:

简单来说,Docker镜像是一个配置好了所需环境的操作系统,我们在自己的电脑上运行一个docker容器,相当于开启了一个新的操作系统。比如说,如果我们在一台windows系统的电脑上运行一个安装了ubuntu系统的docker镜像,就意味着我们可以进入一台ubuntu系统的电脑进行操作。

Docker组成

一个完整的Docker有以下几个部分组成:

  1. DockerClient客户端
  2. Docker Daemon守护进程
  3. Docker Image镜像
  4. DockerContainer容器

Docker架构:

Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。Docker 容器通过 Docker 镜像来创建。容器与镜像的关系类似于面向对象编程中的对象与类。

Docker面向对象
容器对象
镜像
  1. Docker采用 C/S架构 Docker daemon 作为服务端接受来自客户的请求,并处理这些请求(创建、运行、分发容器)。 客户端和服务端既可以运行在一个机器上,也可通过 socket 或者RESTful API 来进行通信。
  2. Docker daemon 一般在宿主主机后台运行,等待接收来自客户端的消息。 Docker 客户端则为用户提供一系列可执行命令,用户用这些命令实现跟 Docker daemon 交互。

Docker典型场景

在docker的网站上提到了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、数据库和后台服务)

    由于其基于LXC的轻量级虚拟化的特点,docker相比KVM之类最明显的特点就是启动快,资源占用小。因此对于构建隔离的标准化的运行环境,轻量级的PaaS(如dokku), 构建自动化测试和持续集成环境,以及一切可以横向扩展的应用(尤其是需要快速启停来应对峰谷的web应用)。

  1. 构建标准化的运行环境,现有的方案大多是在一个baseOS上运行一套puppet/chef,或者一个image文件,其缺点是前者需要base OS许多前提条件,后者几乎不可以修改(因为copy on write 的文件格式在运行时rootfs是read only的)。并且后者文件体积大,环境管理和版本控制本身也是一个问题。
  2. PaaS环境是不言而喻的,其设计之初和dotcloud的案例都是将其作为PaaS产品的环境基础
  3. 因为其标准化构建方法(buildfile)和良好的REST API,自动化测试和持续集成/部署能够很好的集成进来
  4. 因为LXC轻量级的特点,其启动快,而且docker能够只加载每个container变化的部分,这样资源占用小,能够在单机环境下与KVM之类的虚拟化方案相比能够更加快速和占用更少资源

Docker的好处:

 环境隔离:Docker镜像就像一个个的集装箱,我们每一个“集装箱”里面运行的“系统环境”都是不一样的,而且也是互不干扰的。举个例子,其中一个“集装箱”内运行的是基于“UBUNTU”系统内核的开发环境,另一个“集装箱”内运行的是基于“CENTOS”系统内核的生产环境,然而这两个“集装箱”都可以运行在同一个“平台”上,无论这个“平台”是WINDOWS 还是 LINUX。
 迁移方便: Docker将应用所需内容全部打包到一个容器中,然后在虚拟机、服务器或云之间迁移该容器,而无需重构应用。

Docker局限性:

  • Docker是基于Linux 64bit的,无法在32bit的linux/Windows/unix环境下使用

  • LXC是基于cgroup等linux kernel功能的,因此container的guest系统只能是linux base的

  • 隔离性相比KVM之类的虚拟化方案还是有些欠缺,所有container公用一部分的运行库

  • 网络管理相对简单,主要是基于namespace隔离

  • container随着用户进程的停止而销毁,container中的log等用户数据不便收集

    Docker对disk的管理比较有限
    Docker并非适合所有应用场景,Docker只能虚拟基于Linux的服务。
    Windows Azure 服务能够运行Docker实例,但到目前为止Windows服务还不能被虚拟化。可能最大的障碍在于管理实例之间的交互。由于所有应用组件被拆分到不同的容器中,所有的服务器需要以一致的方式彼此通信。这意味着任何人如果选择复杂的基础设施,那么必须掌握应用编程接口管理以及集群工具,比如Swarm、Mesos或者Kubernets以确保机器按照预期运转并支持故障切换。
    Docker在本质上是一个附加系统。使用文件系统的不同层构建一个应用是有可能的。每个组件被添加到之前已经创建的组件之上,可以比作为一个文件系统更明智。分层架构带来另一方面的效率提升,当你重建存在变化的Docker镜像时,不需要重建整个Docker镜像,只需要重建变化的部分。
    可能更为重要的是,Docker旨在用于弹性计算。每个Docker实例的运营生命周期有限,实例数量根据需求增减。在一个管理适度的系统中,这些实例生而平等,不再需要时便各自消亡了。
    针对Docker环境存在的不足,意味着在开始部署Docker前需要考虑如下几个问题。首先,Docker实例是无状态的。这意味着它们不应该承载任何交易数据,所有数据应该保存在数据库服务器中。
    其次,开发Docker实例并不像创建一台虚拟机、添加应用然后克隆那样简单。为成功创建并使用Docker基础设施,管理员需要对系统管理的各个方面有一个全面的理解,包括Linux管理、编排及配置工具比如Puppet、Chef以及Salt。这些工具生来就基于命令行以及脚本。

比较图:
在这里插入图片描述
在这里插入图片描述
Docker Hub(Docker 公共仓库):

  1. Docker用Registry来保存用户构建的镜像。
  2. Registry分为公有和私有。
  3. Docker公司运营的公共Registry叫做Docker Hub。用户可以在Docker Hub注册账号,分享并保存自己的镜像。
  4. Ucloud提供了一个免费的公共镜像库服务:Uhub
  5. UHub可以让用户自由创建和管理镜像库

Docker镜像的命名规则:

  1. Docker镜像是按照hub/registry/name:tag的规则进行命名的
  2. 其中hub即为我们存储docker镜像使用的docker hub
  3. Registry是我们在docker hub中建立的仓库
  4. Name是镜像名称
  5. Tag是镜像的标签

在Ucloud的Uhub中,hub内网地址为uhub.service.ucloud.cn | 公网地址为uhub.ucloud.cn
你可以在uhub中建立自己的镜像仓库,并为其命名

Docker的存储:

  1. Docker 镜像实际上由一层一层的文件系统组成,每一个layer都有其大小和ID,我们可以来看一个Ubuntu系统的镜像。

  2. 由4个layer组成,是只读的
    在这里插入图片描述
    镜像可以通过分层来进行继承,基于基础镜像,可以制作各种具体的应用镜像。如果我们要基于这个ubuntu镜像生成新的镜像,也就是在这个ubuntu镜像上面添加新的层。

  3. 多个镜像可以共享低层layer
    例:本机有一个ubuntu:15.04的镜像,用户基于该镜像做了修改,如下图,新的镜像的低层会直接引用ubuntu15.04的镜像。通过镜像共享的方式,可以减少本机存储空间,加快pull和push的速度。
    在这里插入图片描述

Docker镜像与容器:
在这里插入图片描述
Docker镜像是用于创建容器的模板,基于一个Docker镜像可以创建许多个容器,每个容器之间相互独立。在容器中进行的修改不会对镜像产生影响。容器可以运行、停止和退出。

Docker容器的使用(映射外部端口)

使用 docker -p 就可以实现本服务器与容器之间的映射,从而实现外部网络对容器的访问
Docker的网络模式:
使用docker run启动容器时,可以通过 -p 参数设置本机端口与容器端口的映射。例如: docker run -p 3306:3306 mysql、
建立自己的Docker镜像,使用Dockerfile文件进行打包

  • 每一个命令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写
  • FROM 指定使用的基础镜像
  • EXPOSE 用来指定容器端口,使容器内的应用可以通过端口和外界交互
  • RUN 接受命令作为参数并用于创建镜像
  • ADD 将本地的./test/文件内容(相对路径)添加到镜像/data/下
  • ENV 定义镜像的环境变量
  • CMD 用于执行特定的命令,在镜像构建容器后被调用
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值