共计 3955 个字符,预计需要花费 10 分钟才能阅读完成。
网易云信 IM 私有化部分用到 Docker 技术,今天我们就深入浅出来聊聊 Docker。
Docker 是什么?
Docker 是一个工具,能把应用打包部署于 container 里,这里可以把 container 看做是一个简易版的 Linux 环境和运行在其中的应用程序,每个 container 运行一个 application。它诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目,创始人是 Solomon Hykes。
Docker 自开源后受到广泛的关注和讨论,Redhat 已经在其 RHEL6.5 中明确支持 Docker;Google 也在其 PaaS 产品中广泛应用。Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。现在 Docker 已经从一个工具转化成平台,小生态圈。
Docker 的优势有哪些?
以前企业部署软件会购买真正的服务器,这种模式的资源利用率很低。后来出现了云端的虚拟服务器,比如 AWS,提高了一定的资源利用率,但是不同阶段的应用环境可能不同。
Docker 对这些有很大的优化,比如: 1. Docker 容器可以实现秒级启动 2. 容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,系统的开销很小。传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而 Docker 只需要启动 10 个隔离的应用即可。下图是传统虚拟化方式和 Docker 的不同。Docker 本质上是一种虚拟化的技术,不是虚拟机。Docker 是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。在传统模式下,Guest OS 会占用大量空间,而且不同的应用会需要不同的虚拟机。在 Docker 中只有一个 OS,各种 application 运行在一个 OS 上。
*Hypervisor 是一种虚拟化的技术
具体来说,Docker 的优势包括:
- Faster developer onboarding
- No vendor lockin
- Eliminate environment inconsistencies
- Ship applications faster
- Scale quickly
- Easily remediate issues
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”]
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 包括两部分:
- 一个轻量级服务器,接收来自客户端的消息,为用户提供一系列可执行命令
- 一个 engine,负责调度请求,是一个总入口,管理容器的生存周期
Docker registry 是存储镜像的一个仓库。它与 daemon 沟通,处理从客户端发送来的镜像相关的请求。可以使用 public 的 registry 或者 private 的。Docker 在本地安装时还有一个功能是 graphdb。graphdb 是一个基于 SQLite 的一个小数据库。能够管理本地 Docker 镜像和它们之间的关系。当创建新的 container 时,或是下载某个镜像时,Docker 会先查找原有的镜像,复用可用资源。Docker driver 允许用户定制 Docker 运行的环境。它包括三类:
- graph driver:存储相关
- network driver:网络相关
- exec driver:运行环境相关
一个 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、音视频通话、直播、点播、互动白板、短信等功能。