docker基础
LXC
什么是LXC?
LXC为Linux Container的简写。可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。相当于C++中的NameSpace。容器有效地将由单个操作系统管理的资源划分到孤立的组中,以更好地在孤立的组之间平衡有冲突的资源使用需求。与传统虚拟化技术相比,它的优势在于:
- 与宿主机使用同一个内核,性能损耗小;
- 不需要指令级模拟;
- 不需要即时(Just-in-time)编译;
- 容器可以在CPU核心的本地运行指令,不需要任何专门的解释机制;
- 避免了准虚拟化和系统调用替换中的复杂性;
- 轻量级隔离,在隔离的同时还提供共享机制,以实现容器与宿主机的资源共享。
总结:Linux Container是一种轻量级的虚拟化的手段。
Linux Container提供了在单一可控主机节点上支持多个相互隔离的server container同时执行的机制。Linux Container有点像chroot,提供了一个拥有自己进程和网络空间的虚拟环境,但又有别于虚拟机,因为lxc是一种操作系统层次上的资源的虚拟化。
Docker简介
什么是Docker?
Docker的思想来自于集装箱,集装箱解决了什么问题?在一艘船上,可以把货物规整的摆放起来。并且各种各样的货物被集装箱标准化了,集装箱和集装箱之间不会互相影响。那么我就不需要专门运送水果的船和专门运送化学品的船了。只要这些货物在集装箱里封装的好好的,那我就可以一艘大船把它们都运走。
docker就是类似的理念。现在都流行云计算了,云计算就好比大货轮。docker就是集装箱。
不同的应用程序可能会有不同的应用环境,比如.net开发的网站和php开发的网站依赖的软件就不一样,如果把他们依赖的软件都安装在一个服务器上就要调试很久,而且很麻烦,还会造成一些冲突。比如IIS和Apache访问端口冲突。这个时候你就要隔离.net开发的网站和php开发的网站。常规来讲,我们可以在服务器上创建不同的虚拟机在不同的虚拟机上放置不同的应用,但是虚拟机开销比较高。docker可以实现虚拟机隔离应用环境的功能,并且开销比虚拟机小,小就意味着省钱了。
你开发软件的时候用的是Ubuntu,但是运维管理的都是centos,运维在把你的软件从开发环境转移到生产环境的时候就会遇到一些Ubuntu转centos的问题,比如:有个特殊版本的数据库,只有Ubuntu支持,centos不支持,在转移的过程当中运维就得想办法解决这样的问题。这时候要是有docker你就可以把开发环境直接封装转移给运维,运维直接部署你给他的docker就可以了。而且部署速度快。
在服务器负载方面,如果你单独开一个虚拟机,那么虚拟机会占用空闲内存的,docker部署的话,这些内存就会利用起来。
总之,docker就是集装箱原理
Docker产生的背景
-
存在问题
① 开发和运维环境或配置不同,导致开发环境运行良好的交付产物在运维环境出问题,此类问题让人不胜其烦。
② 传统运维过程中,如果线上有十台机器,每台都需要重新部署一次,重复劳动。
以上出现了两种解决方案:虚拟机和容器
-
虚拟机 vs 容器
虚拟机在一定程度可以解决这些问题。
虚拟机是虚拟出一套硬件后,在上面运行一套完整的操作系统,在该系统上再运行所需的应用,架构如下:
server:宿主机硬件
Host OS:宿主机操作系统
Hypervisor:硬件模拟
Guest OS:虚拟机操作系统
APP/Bins:虚拟机上的应用
虚拟机存在几个缺点:
① 资源占用多,虚机启动需要占用几百M的内存。
② 冗余步骤多,系统级别的操作步骤,往往无法跳过,比如用户登录。
③ 启动慢,往往几分钟 启动操作系统需要多久,启动虚拟机就需要多久。
相对于虚拟机,容器内没有自己的内核/操作系统,也没有硬件虚拟,容器内的应用进程直接运行在宿主的内核上,因此比传统虚拟机更加轻便。
容器不是模拟一个操作系统,而是对进程进行隔离。属于进程级别。
① 启动快, 相当于启动本机底层系统的一个进程,而不是虚拟机内部的进程,速度快很多。
② 占用资源少,容器只占用需要的资源,不占用那些没有用到的资源;多个容器可以共享资源,虚拟机是独享资源。
③ 体积小,容器只要包含用到的组件即可,而虚拟机是整个操作系统的打包,所以容器文件比虚拟机文件要小很多。
一句话总结:虚拟机是虚拟一个操作系统,在操作系统上跑应用;容器不虚拟操作系统,应用跑在宿主机内核上,本质是进程隔离。