K8S-Demo集群实践20:容器到底是个什么东东?
一、通俗的容器解释
现实生活中的容器是用来装东西的,方便管理和运输,软件领域借鉴了这个思想
先介绍一个大家熟悉的场景,一台PC上安装了Win10,管理员创建了两个账号,A和B,用户A登录后,看到的是自己的桌面,自己的文件以及自己安装的应用程序Word,B登录后,看到的桌面、文件和应用程序则不同,B安装了WPS而不是Word,这就类似两个Win10容器,它们分别“装”了属于两个用户的办公环境,两个人共享Win10操作系统
下面介绍的容器(Linux Container简称LXC)类似这个办公场景,不同的是LXC“装”的是应用程序所依赖的运行环境,它是一种轻量级的操作系统层虚拟化技术,目的是隔离应用程序的运行环境,从而保证了软件交付过程中开发、测试、生产环境的强一致性
容器技术基于Namespace和Cgroup两大机制来实现,Namespace负责隔离,Cgroup(Linux Control Group)负责限制。
那容器镜像又是什么?你可以认为容器镜像是存储在U盘或光盘上的Win10操作系统
容器是运行态(动态),容器镜像是存储文件(静态),一个容器镜像可以多次运行,从而创建多个容器
容器镜像有版本控制,即tag,类似Win7,Win8,Win10
虽然现在大家习惯了先交付容器镜像,然后再运行它创建容器,但是历史上是先有容器技术,容器镜像得益于dotCloud公司的创新,即大家熟悉的Docker。
二、容器和虚拟机比较
容器具有敏捷和高性能的优点,在运行Win10的电脑上切换一个账号比启动Win10耗时要少的多
但容器的缺点是隔离不彻底,试想在容器中执行top命令,会看到什么?如果容器A中的应用程序修改了系统时间或者优化了内核参数,那容器B中的应用程序会怎样?如果容器A中的应用程序需要运行在Linux4.x内核上,而容器B中的应用程序兼容Linux内核3.x以下版本,那HostOS又该如何处理?
虚拟机具有完全隔离的优势,拥有独立的操作系统,但是在网络性能等方面又会带来15%左右的损耗。
图1中右半边部分和你在其它地方看到的图略微有一点区别,原因是容器的运行并不依赖DockerEngine,容器是直接运行在HostOS上的
DockerEngine提供的是容器操作和管理界面,帮助用户启动和管理容器;容器的本质是进程,只不过DockerEngine在创建容器进程的时候,会添加了一些命名空间(Namespace)参数。
三、近距离观察容器
1、docker
[ root@node1 ~]
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
75f6881e9487 busybox "/bin/sh" 1 hours ago Up 1 hours busybox-1
99986e1623a3 busybox "/bin/sh" 1 hours ago Up 1 hours busybox-2
[ root@node1 ~]
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest b97242f89c8a 3 weeks ago 1.23MB
上面运行了两个容器,使用的是同一个镜像busybox
上面格式化的信息,是docker命令帮我们整理和翻译的,容器的本质是进程
2、ps
[ root@node1 ~]
root 11501 1 0 2月