网易云信IM私有化部分用到Docker技术,今天咱们就深刻浅出来聊聊Docker。node
Docker是什么?
Docker是一个工具,能把应用打包部署于container里,这里能够把container看作是一个简易版的 Linux 环境和运行在其中的应用程序,每一个container运行一个application。它诞生于 2013 年初,最初是 dotCloud公司内部的一个业余项目,创始人是Solomon Hykes。
Docker自开源后受到普遍的关注和讨论,Redhat已经在其 RHEL6.5 中明确支持Docker;Google也在其PaaS产品中普遍应用。Docker项目的目标是实现轻量级的操做系统虚拟化解决方案。 如今Docker已经从一个工具转化成平台,小生态圈。 linux
Docker的优点有哪些?
之前企业部署软件会购买真正的服务器,这种模式的资源利用率很低。后来出现了云端的虚拟服务器,好比AWS,提升了必定的资源利用率,可是不一样阶段的应用环境可能不一样。git
Docker对这些有很大的优化,好比: 1. Docker 容器能够实现秒级启动 2. 容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,系统的开销很小。传统虚拟机方式运行10个不一样的应用就要起10个虚拟机,而Docker只须要启动10个隔离的应用便可。 下图是传统虚拟化方式和Docker的不一样。Docker本质上是一种虚拟化的技术,不是虚拟机。Docker是在操做系统层面上实现虚拟化,直接复用本地主机的操做系统,而传统方式则是在硬件层面实现。在传统模式下,Guest OS会占用大量空间,并且不一样的应用会须要不一样的虚拟机。在Docker中只有一个OS,各类application运行在一个OS上。 程序员
*Hypervisor是一种虚拟化的技术
具体来讲,Docker的优点包括:docker
Play with Docker container
下载安装完Docker后,能够尝试使用如下命令来运行一个聊天软件。
docker run -d -p 3000:3000 unclebarney/chit-chat
这个命令的含义是启动Docker容器。-d表示在后台启动。-p表示作端口的映射,把容器里的3000端口映射到宿主机上的3000。使用的镜像为unclebarney/chit-chat。 这个命令有两部分操做:
1.从Dockerhub(全部镜像存储的地方)下载此镜像,大概5到30秒(取决于带宽)
2.根据镜像启动container,并运行node server数据库
Docker image
Docker image(镜像)是container的基础。全部container都是从image构建的。 Docker 运行容器前须要本地存在对应的镜像,若是镜像不存在本地,Docker 会从镜像仓库下载(默认是 Docker Hub 公共注册服务器中的仓库)。
Docker每一个运行的实例由最上层的container和下面的多层镜像构成。Docker使用Union FS(union filesystem)将这些不一样镜像整合在一块儿。一般Union FS有两个用途, 一方面能够实现不借助LVM、RAID将多个disk挂到同一个目录下;另外一个更经常使用的就是将一个只读的分支和一个可写的分支联合在一块儿,Live CD正是基于此方法能够容许在镜像不变的基础上容许用户在其上进行一些写操做。 镜像的每一层都有如下这些信息:
1.这一层的meta data,以JSON的形式存储
2.image filessystem changeset
3.image ID,好比:74fe38d11401
镜像有两种构建方式:
1.启动一个最基础的容器,在里面运行一些命令,像git同样把这些命令commit,造成本身的镜像。
2.引用一个base image,再加上一些须要的指令。这些指令存在一个文件中,叫Dockerfile。
如下是Dockerfile的例子,是刚才提到的聊天软件的镜像的生成方式。
# 引用mhart/alpine-node这个镜像 # Dockerfile中第一个命令必须是FROM命令 FROM mhart/alpine-node:base # 将Dockerfile所在文件夹中的内容添加到Docker镜像中 # 第一个点指的是Dockerfile所在的目录 # 第二个点指的是Docker镜像中的当前目录 ADD . . # 为这个镜像暴露3000端口 EXPOSE 3000 # 运行node命令。值得注意的是在构建镜像的时候这个命令不会执行 # 而是在真正基于这个镜像启动了容器时才会执行这个命令 CMD [“node”, “index.js”]segmentfault
More Explanation
若是传统方式作一个聊天软件。首先底层有个Linux系统,上层有个node.js,再上面有source code。user经过3000端口链接。假设Google须要这个应用,那么须要将整个程序package打包过去。最简单的打包方式是从Linux系统到source code都打包。虽然最主要的部分是source code,可是不能只打包它。若是另外有用户(Google 2)须要这个应用,仍是要把整个系统打包。 若是使用Docker,这两个服务(service 1,service 2)的Linux,node.js是同样的,可是它们的source code不一样。若是将它们分层,好比Linux系统部分叫image 1, Node.js部分叫image 2,Service 1的source code叫image 3,Service 2的source code叫image 4。这样能够把image 1,2,3给Google1,而把image1,2,4给Google 2。image 1,2是能够复用的。 若是image 1,2,3里都有file 0。image3会使得image 1和2里的file 0隐藏(如同覆盖)。从上层往下层看,若是拥有相同文件名,下层文件隐藏。 Docker中下层的文件都是只读的,只在最上方有可读写层。应用能够对可读写层进行修改。服务器
Namespace
Docker运用Linux系统里的namespace(命名空间)技术实现最上层应用之间的分离。拥有相同namespace的进程拥有相同的资源。拥有不一样namespace的进程拥有的资源相互独立。每一个容器都有本身单独的名字空间,运行在其中的应用都像是在独立的操做系统中运行同样。名字空间保证了容器之间彼此互不影响。网络
Cgroups
Docker运用Cgroups(控制组)进行资源限制。它是 Linux 内核的一个特性,主要用来对共享资源进行隔离、限制、审计等。只有能控制分配到容器的资源,才能避免多个容器同时运行时对系统资源的竞争。控制组技术最先是由Google的程序员提出。架构
Docker Components
Docker采用了C/S架构,包括客户端和服务端。 Docker daemon做为服务端接受来自客户的请求,并处理这些请求(建立、运行、分发容器)。 客户端和服务端既能够运行在一个机器上,也可经过socket或者RESTful API来进行通讯。Docker daemon通常在宿主主机后台运行,等待接收来自客户端的消息。 Docker客户端则为用户提供一系列可执行命令,用户用这些命令跟 Docker daemon交互。 Docker daemon包括两部分:
Docker registry是存储镜像的一个仓库。它与daemon沟通,处理从客户端发送来的镜像相关的请求。可使用public的registry或者private的。 Docker在本地安装时还有一个功能是graphdb。graphdb是一个基于SQLite的一个小数据库。可以管理本地Docker镜像和它们之间的关系。当建立新的container时,或是下载某个镜像时,Docker会先查找原有的镜像,复用可用资源。 Docker driver容许用户定制Docker运行的环境。它包括三类:
一个container能够没有IP。在network driver里一个选项设为none,能够实现。
RunC
runC是一个抽象层,它介于Docker driver和Linux kernel之间。运用它能够调用不少linux内核的功能,包括namespace,cgroups,capabilities,filessystem access controls。
Open source
Docker不被任何运营商锁定,不被任何公司垄断。Docker项目已经加入了Linux基金会,听从了 Apache 2.0协议,项目代码在GitHub上进行维护。
转载来自公众号BitTiger
想要阅读更多技术干货、行业洞察,欢迎关注网易云信博客。
了解网易云信,来自网易核心架构的通讯与视频云服务。
网易云信(NeteaseYunXin)是集网易18年IM以及音视频技术打造的PaaS服务产品,来自网易核心技术架构的通讯与视频云服务,稳定易用且功能全面,致力于提供全球领先的技术能力和场景化解决方案。开发者经过集成客户端SDK和云端OPEN API,便可快速实现包含IM、音视频通话、直播、点播、互动白板、短信等功能。