【云原生•容器】容器的崛起之路
LXC,Docker的前身
Namespaces
技术实现网络、挂载点等系统资源隔离和 Cgroups
技术实现CPU、内存等系统资源限制,为容器实现提供前置条件,但是想要完整的实现生产可用的容器环境还是具有复杂性。为降低普通用户使用容器技术门槛,2008 年 Linux Kernel 2.6.24 内核刚刚开始提供Cgroups
不久之后,就马上发布了名为 Linux 容器(LinuX Containers,LXC),是一种基于linux内核的虚拟解决方案,LXC的出现,就是让用户可以更加简单的创建容器应用。
LXC 带着令人瞩目的光环登场,让人看到容器技术在生产落地的可行性,比较可惜的是,LXC技术并没有形成气候,和后来的Docker影响力相差甚远,容器行业开发人员 10 个至少有 9 个听过 Docker,而10个开发人员可能9个都没有听说过LXC。
下面我们就来简单部署LXC工具,并使用其创建、运行一个容器,看看其与后来的Docker之间的差异到底是什么。
lxc安装
「1、环境准备」
官方:linuxcontainers.org/
安装LXC内核版本不能低于2.6.32,对lxc至此最佳的为Ubuntu系统,我这里使用的是CentOS 7.2:
[root@lxc ~]# cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
[root@lxc ~]# uname -r
3.10.0-327.el7.x86_64
[root@lxc ~]# sestatus
SELinux status: disabled
[root@lxc ~]# hostname -I
172.16.1.100 10.0.0.100
「2、安装lxc需要使用到epel源,为加快下载速度,我这里使用的是aliyun源」
[root@lxc ~]# yum install epel-release -y
[root@lxc ~]# curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
「3、安装LXC」
[root@lxc ~]# yum install lxc-* libcgroup* bridge-utils.x86_64 -y
「4、检查系统环境是否满足容器使用要求」
[root@docker01 yum.repos.d]# lxc-checkconfig
Kernel configuration not found at /proc/config.gz; searching...
Kernel configuration found at /boot/config-3.10.0-1127.10.1.el7.x86_64
--- Namespaces ---
Namespaces: enabled
Utsname namespace: enabled
Ipc namespace: enabled
Pid namespace: enabled
User namespace: enabled
Warning: newuidmap is not setuid-root
Warning: newgidmap is not setuid-root
Network namespace: enabled
Multiple /dev/pts instances: enabled
--- Control groups ---
Cgroup: enabled
Cgroup clone_children flag: enabled
Cgroup device: enabled
Cgroup sched: enabled
Cgroup cpu account: enabled
Cgroup memory controller: enabled
Cgroup cpuset: enabled
--- Misc ---
Veth pair device: enabled
Macvlan: enabled
Vlan: enabled
Bridges: enabled
Advanced netfilter: enabled
CONFIG_NF_NAT_IPV4: enabled
CONFIG_NF_NAT_IPV6: enabled
CONFIG_IP_NF_TARGET_MASQUERADE: enabled
CONFIG_IP6_NF_TARGET_MASQUERADE: enabled
CONFIG_NETFILTER_XT_TARGET_CHECKSUM: enabled
--- Checkpoint/Restore ---
checkpoint restore: enabled
CONFIG_FHANDLE: enabled
CONFIG_EVENTFD: enabled
CONFIG_EPOLL: enabled
CONFIG_UNIX_DIAG: enabled
CONFIG_INET_DIAG: enabled
CONFIG_PACKET_DIAG: enabled
CONFIG_NETLINK_DIAG: enabled
File capabilities: enabled
Note : Before booting a new kernel, you can check its configuration
usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig
❝
没有什么错误,表示没问题
❞
「5、安装网桥」
[root@docker01 ~]# brctl addbr virbr0 #添加网桥
brctl addif virbr0 ens32 ; # 将网桥关联到ens32这个网卡
[root@docker01 ~]# brctl addif virbr0 ens32 ; # 将网桥关联到ens32这个网卡
ip addr del dev ens32 192.168.31.151/24 ; #把网卡上的ip删了
ifconfig virbr0 192.168.31.151/24 up #给网桥配置ip
route add default gw 192.168.31.1 #设置默认网关
❝
上面几步最好同时执行,否则如果你在xshell终端上会断网。
❞
「6、查看网络设备」
这里可以看到刚才创建的virbr0网桥设备消息:
使用brctl show可以看到ens32网卡插到virbr0网桥上:
创建容器
LXC工具安装完成,下面来使用LXC创建容器并运行。Linux Containers LXC
默认为几个流行的 linux
发行版提供容器模板:
- CentOS
- Ubuntu
- Fedora
- OpenSUSE
- Gentoo
- Debian
- Oracle Linux
- ArchLinux
所有可用的 LXC 模板都位于 /usr/share/lxc/templates
目录下:
[root@docker01 ~]# ls -alh /usr/share/lxc/templates
总用量 344K
drwxr-xr-x. 2 root root 4.0K 11月 27 08:27 .
drwxr-xr-x. 6 root root 106 11月 27 08:27 ..
-rwxr-xr-x. 1 root root 11K 3月 8 2019 lxc-alpine
-rwxr-xr-x. 1 root root 14K 3月 8 2019 lxc-altlinux
-rwxr-xr-x. 1 root root 11K 3月 8 2019 lxc-archlinux
-rwxr-xr-x. 1 root root 9.5K 3月 8 2019 lxc-busybox
-rwxr-xr-x. 1 root root 30K 3月 8 2019 lxc-centos
-rwxr-xr-x. 1 root root 11K 3月 8 2019 lxc-cirros
-rwxr-xr-x. 1 root root 18K 3月 8 2019 lxc-debian
-rwxr-xr-x. 1 root root 18K 3月 8 2019 lxc-download
-rwxr-xr-x. 1 root root 49K 3月 8 2019 lxc-fedora
-rwxr-xr-x. 1 root root 28K 3月 8 2019 lxc-gentoo
-rwxr-xr-x. 1 root root 14K 3月 8 2019 lxc-openmandriva
-rwxr-xr-x. 1 root root 14K 3月 8 2019 lxc-opensuse
-rwxr-xr-x. 1 root root 35K 3月 8 2019 lxc-oracle
-rwxr-xr-x. 1 root root 12K 3月 8 2019 lxc-plamo
-rwxr-xr-x. 1 root root 6.7K 3月 8 2019 lxc-sshd
-rwxr-xr-x. 1 root root 24K 3月 8 2019 lxc-ubuntu
-rwxr-xr-x. 1 root root 12K 3月 8 2019 lxc-ubuntu-cloud
「1、创建 CentOS 容器」 创建LXC容器要基于模版,这里使用 /usr/share/lxc/templates/lxc-centos
这个模版,这个模版其实就是一个脚本,定义了这个容器需要的文件、环境等
[root@docker01 ~]# lxc-create -n lxc_test1 -t /usr/share/lxc/templates/lxc-centos
❝
-n:指定容器名称
-t:指定容器模板
❞
安装成功显示:
上面红色框框说明:root密码存放的位置在 /var/lib/lxc/lxc_test1/tmp_root_pass
中,如果你想自己修改root密码可以使用chroot /var/lib/lxc/lxc_test1/rootfs passwd
这个命令,这里我们自己修改一下密码为123456:
「2、容器根目录」
创建容器后,容器运行的根目录在 /var/lib/lxc/lxc_test1
,查看该目录:
文件说明:
- config:容器运行配置文件
- rootfs:容器运行的根目录,即在容器中
ls -alh /
查看根目录下文件就是对应该目录。 - tmp_root_paas:容器root密码文件
「3、启动容器」
[root@docker01 ~]# lxc-start -n lxc_test1 -d
显示如下内容后,输入账号即可登录到容器中:
❝
-d:容器运行以后台方式,就是类似于docker中-d参数一致。
❞
「4、我们可以另起一个终端查看容器相关信息」
a、查看容器列表:可以看到lxc_test1容器的状态、IP等消息
[root@docker01 ~]# lxc-ls --fancy 或 lxc-ls -f
NAME STATE IPV4 IPV6 AUTOSTART
--------------------------------------------------
lxc_test1 RUNNING 192.168.31.83 - NO
b、查看容器消息:
[root@docker01 ~]# lxc-info -n lxc_test1
可以看到容器状态时running,容器IP,资源使用情况以及对于的宿主机PID:
c、查看容器运行资源情况:
[root@docker01 ~]# lxc-top
「5、进入容器」
进入容器有两种常见方式:lxc-console
和ssh 用户名@IP
「方式一:」
「语法:lxc-console --name=NAME [--tty NUMBER]」
如下进入刚创建的lxc_test1容器中:
「方式二:」
还可以使用ssh 用户名@容器IP
方式登录容器:
「6、容器隔离」
进入容器内部,查看容器的主机名、进程列表、磁盘挂载、网络等都和宿主机之间是隔离的:
「7、容器网络机制」
从容器里看到的自身网卡设备编号47,对端网卡设备编号48:
在宿主机上查看编号48网卡设备:
通过brctl show查看到编号48网卡设备插到virbr0桥接网桥设备上:
virbr0网桥原理和docker中使用的docker0网桥同理,其原理也是一致的。
「从上面创建容器的步骤来看,LXC基于templates创建运行容器的流程和Docker基于镜像创建运行容器的流程是不是很相似,LXC是2008年就出现的,远早于2013年出现的Docker,而且早期Docker底层就是基于LXC实现的,所以,Docker可以说是站在巨人的肩膀上,那Docker又是做对了什么从而取得巨大成功的呢?下文我们分析完Docker再来看下LXC和Docker本质的区别是什么。」
云计算发展史
「相较于容器技术为了实现资源隔离和限制,虚拟化技术在资源隔离和限制方面成熟落地的更早。在2000年前后,虚拟化技术就逐渐发展成熟:」
众所周知,提及虚拟化,VMware可以是当之无愧的领头羊,1999年VMware发布了它的第一款产品VMware Workstation,2001年通过发布VMware GSX Server(托管)和VMware ESX Server(不托管)宣布进入服务器市场,至今其在虚拟化领域位置无人撼动。Xen3.0在2005年12月面世,是开源项目第一次发布的主流虚拟化软件,2006年12月,虚拟化系统KVM(基于内核的虚拟机)被加入到Linux的2.6.20版内核之后,开源虚拟化也开始不断成熟。随着这些知名虚拟化产品的不断成熟完善,生产上也开始大量的使用这些虚拟化技术。
2006 年发生了一件对整个互联网行业影响深远的标志性事件:亚马逊推出 AWS(亚马逊云),云计算平台正式横空出世:
「在当时大家还没有"云"这个概念的时候,亚马逊云平计算台推出背后又是基于什么考量呢?」
首先是亚马逊在那个零售快速扩张的年代遇到了瓶颈。随着用户体验的快速变化,亚马逊发现即使疯狂招聘工程师,实现了 API 化,也仍然无法跟上软件的开发和迭代速度。问题到底出在哪里?
于是安迪·加西,也就是后来 AWS 的 CEO 与开发团队沟通,捅破了这层窗户纸,才发现真相原来如此简单:一个 10-20 多人的微小服务团队,即使发现了用户的痛点,也一样要做服务器安装、搭存储、安装操作系统、开发环境、加载数据库等脏活累活,后期维护更是占去了一半的工程师资源,哪还有时间搞业务?
安迪敏锐地捕捉到了这个现象所暴露的问题——即使是亚马逊这样庞大的技术团队,也面临着 API 精细化所带来的繁重任务,而导致团队无法分出更多精力集中在差异化的业务逻辑上这个大问题。另一方面,电商是一个利润很薄的产业,如果急速扩张,运营活动时就会面临季节性峰值的挑战,「亚马逊必须要发明一个具有弹性的东西,真正建立起电商的基础设施。」解决完自己的问题后,亚马逊发现这也是「整个市场共通的诉求」,这就是亚马逊创立云的契机。
**「2006年,亚马逊正式推出其第一个云计算服务。由此,云计算以星火燎原之势开始在全球铺展开来。紧随其后,中国的互联网大厂在迅速的商业扩张,随之也聚集了大量硬件资源,IDC数据中心作为信息时代重要的基础设施,国内迎来了一股IDC数据中心搭建热潮,这时如果使用传统方式管理这些服务器是件非常棘手的问题,这才发现亚马逊云AWS理念的重要价值。」**2009年阿里云成立,成为国内首批研发云计算平台厂商,由于阿里云和亚马逊同属电商企业,电商业务天然面临发展快,并发量大的业务数据处理难题。时任阿里首席架构师的王坚曾告诉马云“未来快速增长的业,会导致IT基础设施成本拖垮阿里”。这也是为何超级电商亚马逊、阿里巴巴、京东等企业都做云计算的根本原因。2013年腾讯云全面开放,2014年华为云发布,再到2015年百度智能云对外开放运营,短短几年国内云计算行业进入了快速发展期。
2010年,在云计算平台推出明星产品 OpenStack,而像华为、腾讯、浪潮、新华三、中兴、九州云、EasyStack、烽火通信等中国企业都基于OpenStack快速创建出各自的云计算平台。
云计算带来了什么?
在云计算平台出现之前,常用的主机资源使用方式有:使用物理机、基于物理机创建虚拟机、IDC租用物理服务器或托管物理服务器到IDC等方式。这种传统的资源管理方式主要面临如下几个问题:
- 资源方面:初期投入/后期维护成本高,且很可能发现服务应用的访问量和规划差异导致很多资源闲置浪费,关键这些闲置资源也没有技术方便共享给他人使用。
- 人力方面:由于技术水平成差不齐,运维过程中的自动化能力往往较差,导致人力运维的效率较低。
- 资源协调:资源协调不方便,比如有应用A和应用B两个应用,A应用资源使用量大但是资源少,B应用资源使用量小但是资源比较大,传统方式就没法很好协调它们之间资源协调,造成资源浪费。
「最终,导致人力物力投入成本高,人力运维效率和资源使用率低等,这就是为什么需要引入云计算平台。云计算是以虚拟化技术为核心,实现了对CPU、内存、硬盘、网络等计算资源的抽象,并使其可量化,这样就能按需提供给用户,让计算成为了类似水煤电的基础设施。」
「所以,云计算平台关键还是虚拟化技术的成熟落地,实现对资源的量化,这样对生产商和客户来说都比较好:」
- 对生产商来说:海量机器资源管理,这是常规业务公司所不具备的;再一个借助虚拟化对资源量化,可按需分配,并根据资源实际使用灵活调整,避免有时资源闲置浪费,有时又资源紧张不够使用,提高资源使用率;集中化的资源管理,也更利于专业化技术运维团队建设。
- 对客户来说:使用方式更加灵活,按需申请资源,并更具使用情况灵活调整资源量,不再需要时及时释放资源,不需要购买物理机,也不需要管理大量的运维人员,极大简化前期投入成本。
「云计算是一种资源的服务模式,通过网络将资源按需地提供给用户,提供了更好的用户体验和低廉的成本。快速地资源供应和释放,不仅大大提供了资源的利用率,减少资源管理的工作开销,且提高了用户体验并大大降低其成本。」
「云计算的服务模式不断演变,在业界根据公司的提供的服务方式,通常划分为三类:IaaS(基础设施即服务)、PaaS(平台即服务)、SaaS(软件即服务)。这里比较常用的是PaaS平台,云厂商不仅提供资源、操作系统,还提供业务应用运行时环境,而对于客户而言,只需要将其业务应用程序部署到云平台即可,这样更加专注于开发,集中精力实现业务需求,节约了大量繁琐运维工作。SaaS平台对客户来说更加简单,在PaaS基础上云厂商连服务也一起提供,但是从另一个层面安全不可控方面较差,这也是一般业务公司很难接受的,所以,更多的基于PaaS平台提供业务程序运行时各种数据库、中间件环境,业务程序本身由客户提供。」
「正当云计算发展的如日中天,PaaS 的服务模式逐渐被大家接纳的时候,隐约感觉 PaaS 的时代就要来了。有一个叫 Docker 的项目突然冒出来,并在短短几个月内迅速的崛起,给PaaS世界带来"降维打击",直接宣告其默默走向衰落,容器技术完全重塑了整个云计算市场的形态。下文我们继续来关注 Docker 到底带来了哪些颠覆创新,是怎么又被后来的 kubernetes 抢过风头的呢?」