Docker概览
文章从《Docker即学即用》(《Docker:Up and Running》)总结而来
Docker的优势:
1. 使用开发者已经掌握的技能打包软件
2. 使用标准的映像格式打包软件应用和所需的操作系统文件系统
3. 在运行任何系统的任何环境中测试和部署同一个打包好的构建产物
4. 把软件应用和硬件剥离,不滥用资源
容器 vs 虚拟机
虚拟机包含完整的操作系统,运行在宿主操作系统之上
虚拟机最大的优点是,在一台宿主机中可以使用虚拟机运行多个完全不同的操作系统
虚拟机的监控程序和虚拟机中运行的每个内核都要消耗一定的硬件系统资源,而且运行中的应用无法使用这些被虚拟机占用的资源
对容器来说,宿主机和容器共用一个内核,所以容器使用的系统资源更少
容器只是一个普通的进程,直接与linux内核通信
容器必须基于相同的底层操作系统
Docker只能在已经安装Docker的宿主机中部署、运行和管理容器,不能创建新的宿主系统实例、对象存储器和块存储器。
Docker用于创建自成一体的容器映像,封装应用的所有依赖,无需改动就能把应用部署到任何环境中,从而简化部署过程中的某些步骤。但是只使用Docker无法自动执行复杂的部署过程。
使用Docker后,所有的以来问题都能在开发和测试过程中发现(原来由运维安装的依赖转移到开发来安装。)
客户端-服务器模式
不区分客户端和胡武器可执行文件,使用同一个二进制文件,通过启动参数作为区分。
Docker基本上由两部分组成:客户端和服务器(以守护进程形式运行),注册处(可选)
客户端,运行在本地工作站,用于发出指令控制服务器
服务器,运行在linux宿主机或者虚拟机,用于持续运行和管理容器,存储容器化应用;
: 守护进程可以在基础设施里的任意多个服务器中运行,单个客户端则可以控制任意多个服务器
注册处,运行在linux宿主机虚拟机或SaaS,用于存储Docker映像和映像的元数据。
通信方法
命令行工具docker(客户端)和docker -d(服务器)命令启动的守护进程之间通过网络套接字通信,可以选择监听一个或多个TCP端口(用于远程访问)或Unix套接字(用于本地访问)。
默认端口为2375用于监听未加密的连接,2376用于监听加密连接。
Docker命令行
使用命令行工具可以做不仅限于一下事情
1. 构建容器映像
2. 从注册处拉取映像,载入Docker守护进程,或者从Docker守护进程中把映像推送到注册处
3. 在Docker服务器中启动服容器
4. 从远程服务器中读取Docker日志
5. 在远程服务器中运行容器里启动命令行shell
Docker采用的架构方式直接决定了应用必须是无状态的(stateless),或者要把状态存储在外部数据存储器中,例如数据库和缓存(状态外存)。
适合使用Docker的应用包括web前端,后端API和短期运行的任务,例如cron程序处理的维护脚本。
轻量级容器,只是对一个分层文件系统映像和一些配置的元数据的引用。
容器化进程,多个容器会共用一个或多个文件系统层,不同于虚拟机的操作系统实例完全隔离,会像普通进程一样争抢CPU和内存资源。
尽量不要让容器使用root用户(UID为0)
无状态应用
容器化应用的过程就是将配置数据移到环境变量中(保证应用无状态),在启动容器时在传给应用,否则会限制容器的可重用性。
Docker原生支持环境变量,环境变量存储在组成容器配置的元数据中,每次重启容器都会把相同配置传给应用。
状态外存(Externalizing State)
可以在数据库中存储状态,但如果使用文件存储状态的话,一方面容器的文件系统中存储数据性能不好,会受到可用空间的极大限制,另一方面容器的生命周期内状态无法保持。
文件系统层
Docker容器由文件系统层堆叠而成,每一层都有唯一的哈希码标识,并且包含应用的全部依赖。构建过程中,每一次改动都建立在之前的改动之上。
重新构建时只需要在当前部署的层之上重新构建包含变动的层,这样能节省时间和带宽,因为容器以层的形式下发,不用再上传服务器中已经存储的层。
可以明确地知道层和层之间的变动情况。
不同的部署工具
如shell,Capistrano,Fabric,Ansible等(Docker可替代)
编排和大规模部署工具
如Docker开发的Swarm,New Relic开发的Centurion,Spotify开发的Helios。
更强大的部署工具如Google开发的Kubernetes,Apache Mesos。
基元宿主机
占用空间极小,专注于Linux容器和Docker,在裸机和常用的虚拟化平台中都能使用多主机编排工具轻易通过原子性操作升级和回滚系统。