1 Docker介绍和基础操作

Container即容器,平时生活中指的是可以装下其它物品的工具,以方便人类归纳放置物品、存储和异地运输,比如人类使用的衣柜、行李箱、背包等可以成为容器,Container除了容器以外,另一个意思是集装箱,很多码头工人将很多装有不同物品但却整齐划一的箱子装载到停靠在岸边大船,然后方便的运来运去。

为什么这些集装箱可以很方便的运来运去呢?因为它们大小一致标准化尺寸的箱子,并且可以安全的隔离开,所以当我们使用Container来形容容器的时候,就是我们想要让容器达到一个可以打包,符合标准的状态。

集装箱标准尺寸重量

类型 大小 内长m 内宽m 内高m 门高m 门宽m 容积m³ 载重T 皮重T
普通箱 20GP 5.898 2.352 2.385 2.280 2.343 28.00 18 2.3
普通箱 40GP 12.032 2.352 2.385 2.280 2.343 57.00 28 3.4
高箱 40HC/HQ
45 HC/HQ
12.032
13.556
2.352 2.690 2.585 2.343 67.00
83.00
28 4.0

但今天我们所说的容器是一种IT技术。容器其实是一种沙盒技术。顾名思义,沙盒就是能够像一个集装箱一样,把你的应用装起来。这样,应用与应用之间就有了边界而不会相互干扰;同时装在沙盒里面的应用,也可以很方便的被搬来搬去,这也是PaaS想要的最理想的状态(可移植性,标准化,隔离性)。

容器是软件工业上的集装箱的技术,集装箱的标准化,减少了包装成本,大大提高货物运输和装卸效率,是传统运输行业的重大变革。早期的软件项目中软件更新,发布低效,开发测试发布周期很长,很难敏捷。有了容器技术,就可以利用其标准化的特点,大幅提高生产效率。

容器技术是虚拟化、云计算、大数据之后的一门新兴的并且是炙手可热的新技术,容器技术提高了硬件资源利用率、方便了企业的业务快速横向扩容(可以达到秒级快速扩容)、实现了业务宕机自愈功能(配合K8S可以实现,但OpenStack无此功能),因此未来数年会是一个容器愈发流行的时代,这是一个对于IT行业来说非常有影响和价值的技术,而对于IT行业的从业者来说,熟练掌握容器技术无疑是—个很有前景的行业工作机会。

1.1 Docker介绍

1.1.1 容器历史

虽然docker把容器技术推向了巅峰,但容器技术却不是从docker诞生的。实际上,容器技术连新技术都算不上,因为它的诞生和使用确实有些年头了。下面的一串名称可能有的你都没有听说过,但它们的确都是容器技术的应用:

1、Chroot Jail
就是我们常见的chroot命令的用法。它在1979年的时候就出现了,被认为是最早的容器化技术之一。它可以把一个进程的文件系统隔离起来。

2、The FreeBSD Jail
Freebsd Jail (监狱)实现了操作系统级别的虚拟化,它是操作系统级别虚拟化技术的先驱之一。2000年,伴随FreeBSD 4.0版的发布

3、Linux VServer
使用添加到Linux内核的系统级别的虚拟化功能实现的专用虚拟服务器。允许创建许多独立的虚拟专用服务器(VPS),这些虚拟专用服务器在单个物理服务器上全速同时运行,从而有效地共享硬件资源。VPS提供与传统Linux服务器几乎相同的操作环境。可以在这样的VPS上启动所有服务(例如ssh,邮件,Web和数据库服务器),而无需(或者在特殊情况下只需进行很少的修改),就像在任何真实服务器上一样。

每个VPS都有自己的用户帐户数据库和root密码,并且与其他虚拟服务器隔离,但它们共享相同的硬件资源

2003年11月1日VServer 1.0发布

官网:http://linux-vserver.org/

4、Solaris Containers
它也是操作系统级别的虚拟化技术,专为X86和SPARC系统设计。Solaris容器是系统资源控制和通过"区域"提供边界隔离的组合。

5、OpenVZ
OpenVZ是一种Linux中操作系统级别的虚拟化技术。它允许创建多个安全隔离的Linux容器,即VPS。

6、Process Containers
Process容器由Google的工程师开发,一般被称为cgroups。

7、LXC
LXC为Linux Container的简写。可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。容器有效地将由单个操作系统管理的资源划分到孤立的组中,以更好地在孤立组之间平衡有冲突的资源使用需求

Linux Container提供了在单一可控主机节点上支持多个相互隔离的server container同时执行的机制。Linux Container有点像chroot,提供了一个拥有自己进程和网络空间的虚拟环境,但又有别于虚拟机,因为lxc是一种操作系统层次上的资源的虚拟化。

8、Warden
在最初阶段,Warden使用LXC作为容器运行时。如今已被CloudFoundy取代。

9、LMCTFY
LMCTFY是Let me contain that for you的缩写。它是Google的容器技术栈的开源版本。
Google的工程师一直在与docker的libertainer团队合作,并将libertainer的核心概念进行抽象并移植到此项目中。该项目的进展不明,估计会被libcontainer取代。

10、Docker
Docker是一个可以将应用程序及其依赖打包到几乎可以在任何服务器上运行的容器的工具。

11、RKT
RKT是Rocket的缩写,它是一个专注于安全和开放标准的应用程序容器引擎。

综上所述正如我们所看到的,docker并不是第一个容器化技术,但它的确是最知名的一个。

1.1.2 Docker是什么

Docker(码头工人)是一个开源项目,诞生于2013年初,最初是dotCloud公司(后由于Docker开源后大受欢迎就将公司改名为Docker Inc,总部位于美国加州的旧金山)内部的一个开源的PAAS服务(Platform as a Service)的业余项目。它基于Google公司推出的Go语言实现。项目后来加入了Linux基金会,遵从了Apache 2.0协议,项目代码在GitHub上进行维护。

Docker是基于linux内核实现,Docker最早采用LXC技术,LXC是Linux原生支持的容器技术,可以提供轻量级的虚拟化,可以说docker就是基于LXC发展起来的,提供LXC的高级封装,标准的配置方法,在LXC的基础之上,docker提供了一系列更强大的功能。而虚拟化技术KVM(Kernel-based Virtual Machine)基于模块实现,后来Docker改为自己研发并开源的runc技术运行容器,彻底抛弃了LXC。

Docker相比虚拟机的交付速度更快,资源消耗更低,Docker采用客户端/服务端架构,使用远程API来管理和创建容器,其可以轻松的创建一个轻量级的、可移植的、自给自足的容器,docker的三大理念是build(构建)、ship(运输)、run(运行),Docker遵从apache 2.0协议,并通过(namespace及cgroup等)来提供容器的资源隔离与安全保障等,所以Docker容器在运行时不需要类似虚拟机(空运行的虚拟机占用物理机6-8%性能)的额外资源开销,因此可以大幅提高资源利用率,总而言之Docker是一种用了新颖方式实现的轻量级虚拟机,类似于VM但是在原理和应用上和VM的差别还是很大的,并且docker的专业叫法是应用容器(Application Container)。

Docker的主要目标

Build, hip and Run Any App, Anywhere,即通过对应用组件的封装(Packaging)、分发(Distribution)、部署(Deployment)、运行(Runtime)等生命周期的管理,达到应用组件级别的“—次封装,到处运行"。这里的应用组件,既可以是—个Web应用,也可以是一套数据库服务,甚至是一个操作系统。将应用运行在Docker容器上,可以实现跨平台,跨服务器,只需一次配置准备好相关的应用环境,即可实现到处运行,保证研发和生产环境的一致性,解决了应用和运行环境的兼容性问题,从而极大提升了部署效率,减少故障的可能性

使用Docker容器化封装应用程序的意义:

  • 统—基础设施环境--docker环境
    • 硬件的组成配置
    • 操作系统的版本
    • 运行时环境的异构
  • 统一程序打包(装箱)方式--docker镜像
    • java程序
    • python程序
    • nodejs程序
  • 统一程序部署(运行)方式--docker容器
    • java-jar... --> docker run...
    • python manage.py runserver... --> docker run...
    • npm run dev... --> docker run...

1.1.3 Docker和虚拟机,物理主机

容器和虚拟机技术比较

  • 传统虚拟机是虚拟出一个主机硬件,并且运行一个完整的操作系统,然后在这个系统上安装和运行软件
  • 容器内的应用直接运行在宿主机的内核之上,容器并没有自己的内核,也不需要虚拟硬件,相当轻量化
  • 每个容器间是互相隔离,每个容器内都有一个属于自己的独立文件系统,独立的进程空间,网络空间,用户空间等,所以在同一个宿主机上的多个容器之间彼此不会相互影响

容器和虚拟机表现比较

  • 资源利用率更高:开销更小,不需要启动单独的虚拟机OS内核占用硬件资源,可以将服务器性能压榨至极致,虚拟机一般会有5-20%的损耗,容器运行基本无损耗,所以生产中一台物理机只能运行数十个虚拟机,但是一般可以运行数百个容器
  • 启动速度更快:可以在数秒内完成启动
  • 占用空间更小:容器一般占用的磁盘空间以MB为单位,而虚拟机以GB
  • 集成性更好:和CI/CD(持续集成/持续部署)相关技术结合性更好,实现打包镜像发布测试可以一键运行,做到自动化并快速的部署管理,实现高效的开发生命周期

使用虚拟机是为了更好的实现服务运行环境隔离,每个虚拟机都有独立的内核,虚拟化可以实现不同操作系统的虚拟机,但是通常一个虚拟机只运行一个服务,很明显资源利用率比较低且造成不必要的性能损耗,我们创建虚拟机的目的是为了运行应用程序,比如Nginx、PHP、Tomcat等web程序,使用虚拟机无疑带来了一些不必要的资源开销,但是容器技术则基于减少中间运行环节带来较大的性能提升。

根据实验,一个运行着CentOS的KVM虚拟机启动后,在不做优化的情况下,虚拟机自己就需要占用100~200MB内存。此外,用户应用运行在虚拟机里面,它对宿主机操作系统的调用就不可避免地要经过虚拟化软件的拦截和处理,这本身又是一层性能损耗,尤其对计算资源、网络和磁盘I/O的损耗非常大。

比如:一台96G内存的物理服务器,为了运行java程序的虚拟机一般需要分配8G内存/4核的资源,只能运行13台左右虚拟机,但是改为在docker容器上运行Java程序,每个容器只需要分配4G内存即可,同样的物理服务器就可以运行25个左右的容器,运行数量相当于提高一倍,可以大幅节省IT支出,通常情况下至少可节约一半以上的物理设备

1.1.4 Docker的组成

docker官网:https://www.docker.com/

帮助文档链接:https://docs.docker.com/

docker镜像:https://hub.docker.com/

docker中文网站:https://www.docker.org.cn/

  • Docker主机(Host):一个物理机或虚拟机,用于运行Docker服务进程和容器,也称为宿主机,node节点
  • Docker服务端(Server):Docker守护进程,运行docker容器
  • Docker客户端(Client):客户端使用docker命令或其他工具调用docker APl
  • Docker镜像(Images):镜像可以理解为创建实例使用的模板,本质上就是一些程序文件的集合
  • Docker仓库(Registry):保存镜像的仓库,官方仓库:https://hub.docker.com/,可以搭建私有仓库harbor
  • Docker容器(Container):容器是从镜像生成对外提供服务的一个或一组服务,其本质就是将镜像中的程序启动后生成的进程