虚拟化
虚拟化在大规模分布式应用中非常重要,在一机器上部署了多个服务,如果它们各自需要不同的运行环境时很容易发生冲突,如果人工的一个一个去解决它们的冲突显然在大规模集群中是不现实的,这时候就需要用虚拟化方案来进行环境隔离。
我们常见的虚拟化方案是虚拟机和Docker
Docker是什么
Docker是个划时代的开源项目,它彻底释放了计算虚拟化的威力,极大提高了应用的维护效率,降低了云计算应用开发的成本。使用Docker,可以让应用的部署、测试和分发都变得前所未有的高效和轻松。
Docker和虚拟机的区别
虚拟机:在hypervisor层抽象了各个硬件平台的区别,相当于使用一些底层代码用软件去模拟了计算机的各个设备,然后在这上去跑虚拟机。虚拟机其实是对应用和对应依赖的操作系统整个环境的打包,这种方案比较笨重,一是虚拟化硬件的性能损耗严重,二是多个完整的操作系统不仅非常占用空间同时还极大的影响应用的启动速度,因为应用必须等到完整系统启动后才能启动。
Docker:它跑在一个普通的操作系统中,其中的每个应用都是docker的子进程,和普通的多进程应用很相似,基本没有性能和资源的浪费。
Docker底层实现技术
最纯正的Docker,只存在于Linux平台,因为它的实现依赖Linux操作系统提供的能力(Linux Cgroups和Linux Namespaces),我们在Windows和Mac中使用docker其实是用docker客户端的虚拟机虚拟出了一个Linux系统,再在虚拟系统上安装docker(这种方式仅限于生产环境使用)。
Linux Cgroups: Linux内核的一种可以限制进程所使用资源的机制
Linux Namespaces: Linux内核的一种对内核资源进行分区的机制
Docker的基本操作
安装:
1、Linux 安装
$sudo wget -q0- https: / /get.docker.com/ | bash
国内网络环境特殊,可以参考相关教程
2、Windows/Mac 安装
容器和镜像
容器(Container ):运行起来的、带有虚拟化环境的程序(本质是进程)
镜像(lmage ):构建打包好的环境
DockerHub
docker的npm仓库
公开仓库:DockerHub
私有仓库:Harbor
运行容器
#pull
docker pull jenkins:2.60.3
#run a container
docker run jenkins:2.60.3
进入容器和停止容器运行
#进入容器内部
docker attach 194e8715dc9f
#停止容器运行
docker stop 194e8715dc9f
更多命令
docker-h
dockerfile
是一个文件,定义了某个镜像的建立过程,只要它的内容不改变就可以保证它构建出的镜像基本一致
Docker的优势总结
- 更高效的利用系统资源: 容器不需要硬件虚拟、运行完整的操作系统等等,无论是运行速度、内存损耗、还是文件存储速度都比传统的虚拟机更高效。
- 更快速的启动时间:传统虚拟机技术启动应用往往要数分钟,而docker应用直接运行在宿主内核,无需启动完整系统,因此可以做到秒级甚至毫秒级的启动,大大降低开发、测试、部署的时间。
- 一致的运行环境:开发过程中一个比较常见的问题是环境的一致性问题,由于开发测试生产环境不一致导致一些bug在开发过程中不能发现,而docker的镜像提供了处内核外完整的运行环境,它确保了应用运行的一致性,从而解决了应用在不同环境产生不同bug的问题。
- 持续交付和部署:使用docker可以通过定制应用镜像来实现持续集成、持续交付、持续部署,开发人员可以通过dockerfile来进行镜像构建,并结合持续集成系统进行集成测试 ,运维人员可以直接在生产环境中使用这些已经测试好的镜像来快速的部署应用。
- 更轻松的迁移:由于docker确保了执行环境的一致性,使得应用的迁移更加容易,docker可以在很多平台上运行,无论是在物理机、虚拟机、公有云、私有云、甚至是笔记本上的运行结果都是一致的,因此用户可以轻易的将在任意一个平台上运行的应用迁移到另外一个平台,且不用担心环境不一致导致应用无法正常启动等问题。
- 更轻松的维护和扩展:docker使用分层存储以及镜像技术,使得应用部分的复用变得更加容易,也使得应用的维护和更新更加简单,基于基础镜像进一步扩展镜像也变得很简单,此外docker团队和一些其他团队维护了一大批高质量的官方镜像,它们既可以直接应用在生产环境中,也可以进一步的定制,大大降低了应用镜像的制作成本