Docker简介
什么是Docker:
正所谓Docker的英文本意为“搬运工”,所以在我们的世界里,可以理解为Docker搬运的是装满任意类型的APP的集装箱,开发者可以通过Docker将APP变成一种标准化的、可移动植的、自动管理的组件。它用一种新的方式实现了轻量级的虚拟机,专业术语成为应用容器(Application Container)
Docker的优势:
1、利用率高
·Docker对系统资源的利用率很高,一台主机可以同时运行数千个Docker容器
2、可以快速的交付应用程序
·开发者使用一个标准的image来构建开发容器,开发完成之后,系统管理员就可以使用这种容器来部署代码
·Docker可以快速的创建容器,快速的迭代应用程序,并让整个过程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的
·Docker容器很轻,很快,启动时间堪称秒级,节约了开发、测试、部署的时间
3、更容易部署和扩展
·Docker容器几乎可以在所有的环境中运行,如物理机、虚拟机、云主机、个人PC、服务器等
·Docker容器兼容很多的平台,这样就可以吧一个应用程序从一个平台迁移到另一个
4、效率更高
·Docker容器不需要hypervisor,因为他是内核级的虚拟化
5、更简单的管理
·通常只需要小小的改变就可以替代以往巨型和大量的更新工作
Docker的常用案例:
u 自动打包和部署应用
u 创建轻量、私有的PaaS环境
u 自动化测试和持续集成/部署
u 部署并扩展Web应用、数据库和后端服务器
Docker的体系结构
Docker使用C/S架构,doceker daemon作为server端接受clinet的请求,并处理(创建、运行、分发容器),他们可以运行在一个机器上,也通过socket或者RESTful API通信
u Docker守护进程(Docker daemon)
Docker守护进程运行在一台主机上,用户并不直接和守护进程进行交互,而是通过Docker客户端间接可其通信
u Docker客户端(Docker client)
Docker客户端其实是docker的二进制程序,是用户与Docker交互方式,他接收用户指令并且与背后的Docker守护进程通信。
Docker镜像 -Docker images
Docker镜像是Docker容器运行时的只读模板,镜像可以用来创建Docker容器,每一个镜像用一系列的层(layers)组成
Docker仓库 -Docker registeries
Docker仓库用来保存镜像,可以理解为代码控制中的代码仓库,它分为公开仓库(public)和私有仓库(private)两种形式。
Docker容器 -Docker containers
容器是用来运行应用的,一个Docker容器包含可所有某个应用的运行所需的环境,每一个Docker容器都是从Docker镜像创建的,Docker容器可以实现运行、开始、停止、移动和删除。
Docker底层技术
pid namespace
不同用户的进程就是通过pidnamespace隔离开的,且不同 namespace 中可以有相同PID。
net namespace
有了 pid namespace, 每个namespace中的pid能够相互隔离,但是网络端口还是共享host的端口。网络隔离是通过netnamespace实现的,每个net namespace有独立的 network devices, IP addresses, IP routing tables, /proc/net 目录。这样每个container的网络就能隔离开来。LXC在此基础上有5种网络类型,docker默认采用veth的方式将container中的虚拟网卡同host上的一个docker bridge连接在一起。
ipc namespace
container中进程交互还是采用linux常见的进程间交互方法(interprocess communication - IPC), 包括常见的信号量、消息队列和共享内存。然而同VM不同,container 的进程间交互实际上还是host上具有相同pid namespace中的进程间交互,因此需要在IPC资源申请时加入namespace信息 - 每个IPC资源有一个唯一的 32bit ID。
mnt namespace
类似chroot,将一个进程放到一个特定的目录执行。mnt namespace允许不同namespace的进程看到的文件结构不同,这样每个 namespace 中的进程所看到的文件目录就被隔离开了。同chroot不同,每个namespace中的container在/proc/mounts的信息只包含所在namespace的mount point。
uts namespace
UTS("UNIX Time-sharing System") namespace允许每个container拥有独立的hostname和domain name,使其在网络上可以被视作一个独立的节点而非Host上的一个进程。
user namespace
每个container可以有不同的 user 和 group id, 也就是说可以以container内部的用户在container内部执行程序而非Host上的用户。