精华内容
下载资源
问答
  • 嵌入式Linux容器技术

    千次阅读 2019-08-13 14:59:21
    嵌入式Linux容器技术 一、Linux容器技术 Linux Container容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源。 LXC为Linux Container的简写。可以提供轻量级的虚拟化,以便隔离进程和资源,...

    嵌入式Linux容器技术

    一、Linux容器技术

    1. Linux Container容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源。

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

      (1)与宿主机使用同一个内核,性能损耗小;

      (2)不需要指令级模拟;

      (3)不需要即时(Just-in-time)编译;

      (4)容器可以在CPU核心的本地运行指令,不需要任何专门的解释机制;

      (5)避免了准虚拟化和系统调用替换中的复杂性;

      (6)轻量级隔离,在隔离的同时还提供共享机制,以实现容器与宿主机的资源共享。

      总结:Linux Container是一种轻量级的虚拟化的手段。

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

    4. LXC与docker的关系

    (1)Docker并不是LXC的替代品,Docker的底层就是使用了LXC来实现的。LXC将Linux进程沙盒化,使得进程之间相互隔离,并且能够控制各
    进程的资源分配。

    (2)在LXC的基础之上,Docker提供了一系列更强的功能。

    二、嵌入式Linux容器

    Linux主流的容器包括LXC和Docker,其中LXC是Linux原生的轻量化的容器技术。Docker基于LXC实现,但是,Docker的主要应用场景是云服务
    器,其功能十分的强大,但是,其对于嵌入式Linux开发平台的支持可能不那么友好。balenaOS号称对Docker进行了精简,使其可以可靠的运行
    于嵌入式Linux环境中。它基于Yocto框架开发,systemd作为init系统。相比较而言,LXC更为轻量化,对于系统资源的要求更低,所以,其天然
    的适于嵌入式Linux环境。不过,(balenaOS)docker和LXC各有千秋,需要深度体验之后,才能得出最后的结论。

    三、体验容器

    3.1 LXC

    3.1.1硬件环境

    • allwinner T3
    • Cortex-A7 四核
    • 1G RAM
    • Ubuntu Core 18.04(Linux kernel 3.10.108)

    3.1.2 LXC安装

    系统要求:

    • 硬性要求:

      1. glibc、libc、uclib中的一种C库
      2. Linux kernel >= 2.6.32
    • lxc-attach额外要求:

      1. Linux kernel >= 3.8
    • 非特权容器额外要求:

      1. libpam-cgfs,cgmanager或其他CGroup管理器为非特权CGroups操作配置系统
      2. 最新版本的shadow,包括newuidmap和newgidmap
      3. Linux kernel >= 3.12
    • 推荐库:

      1. libcap (to allow for capability drops)
      2. libapparmor (to set a different apparmor profile for the container)
      3. libselinux (to set a different selinux context for the container)
      4. libseccomp (to set a seccomp policy for the container)
      5. libgnutls (for various checksumming)
      6. liblua (for the LUA binding)
      7. python3-dev (for the python3 binding)

    Ubuntu环境下,LXC的安装十分的简单,只需一个命令就可以完成LXC的安装,包括其依赖的所有库文件:

    	$sudo  apt-get  install  lxc
    

    3.1.3 创建非特权容器

    无特权容器是最安全的容器。那些使用uid和gid的映射来为容器分配一系列uid和gids。这意味着容器中的uid 0(root)实际上就像容器外的uid 100000。因此,如果出现问题并且攻击者设法逃离容器,他们将发现自己拥有与无人用户一样多的权利。

    不幸的是,这也意味着不允许以下常见操作:

    • 安装大多数文件系统
    • 创建设备节点
    • 针对映射集之外的uid / gid的任何操作

    注:,因为本次测试的Ubuntu Core环境的内核版本为3.10.108,所以,系统不支非特权容器。

    3.1.4 创建特权容器

    **注:**下面创建的容器为特权容器,即,容器通过root创建和启动。

    lxc安装完成之后,可以使用lxc-checkconfig检测Linux内核是否支持容器。

    	$ lxc-checkconfig
    
    	--- Namespaces ---
    	Namespaces: enabled
    	Utsname namespace: enabled
    	Ipc namespace: enabled
    	Pid namespace: enabled
    	**User namespace: missing**
    	Network namespace: enabled
    	Multiple /dev/pts instances: enabled
    	
    	--- Control groups ---
    	Cgroups: enabled
    	
    	Cgroup v1 mount points: 
    	/sys/fs/cgroup/systemd
    	/sys/fs/cgroup/blkio
    	/sys/fs/cgroup/cpuset
    	/sys/fs/cgroup/devices
    	/sys/fs/cgroup/perf_event
    	/sys/fs/cgroup/cpu,cpuacct
    	/sys/fs/cgroup/memory
    	/sys/fs/cgroup/freezer
    	
    	Cgroup v2 mount points: 
    	
    	
    	Cgroup v1 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, loaded
    	Macvlan: enabled, not loaded
    	Vlan: enabled, not loaded
    	Bridges: enabled, loaded
    	Advanced netfilter: enabled, not loaded
    	CONFIG_NF_NAT_IPV4: enabled, loaded
    	CONFIG_NF_NAT_IPV6: enabled, not loaded
    	CONFIG_IP_NF_TARGET_MASQUERADE: enabled, not loaded
    	CONFIG_IP6_NF_TARGET_MASQUERADE: enabled, not loaded
    	CONFIG_NETFILTER_XT_TARGET_CHECKSUM: enabled, loaded
    	CONFIG_NETFILTER_XT_MATCH_COMMENT: enabled, not loaded
    	FUSE (for use with lxcfs): enabled, not loaded
    	
    	--- 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: 
    	
    	Note : Before booting a new kernel, you can check its configuration
    	usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig
    

    该命令会根据内核的.config文件,检测内核对于容器的支持情况。

    lxc-create用于创建一个容器,lxc在创建一个容器时,提供了很多模板,这些模板的位置:/usr/share/lxc/templates/目录下。

    	sudo lxc-busybox  lxc-download  lxc-local  lxc-oci
    

    下面,通过lxc-download,创一个distribution为Ubuntu,release为bionic,并且arch为armhf的容器:

    	sudo lxc-create -n c1 -t download
    

    上面的命令用于创建一个名为c1的容器,键入该命令后,其会提示输入系统、系统的版本、架构等参数,之后,lxc会下载对应的容器的rootfs。rootfs下载的时间可能比较长,其下载成功之后,说明容器已经下载成功了。rootfs的目录位于:/var/lib/lxc/c1目录,其包括一个config配置文件和rootfs系统。

    通过lxc-ls可以看到系统中已经部署了c1容器,lxc-info可以查看c1当前的运行状态。

    lxc-start用于启动一个容器,具体参数可以通过lxc-start -h查看。

        sudo lxc-start -n c1 -o logfile -d
    

    问题

    1.apparmor配置问题

    	  1 lxc-start c1 20190812055509.777 ERROR    apparmor - lsm/apparmor.c:apparmor_process_label_set:223 - If you really want to start this container, set
    	  2 lxc-start c1 20190812055509.812 ERROR    apparmor - lsm/apparmor.c:apparmor_process_label_set:224 -lxc.apparmor.allow_incomplete = 1
    	  3 lxc-start c1 20190812055509.822 ERROR    apparmor - lsm/apparmor.c:apparmor_process_label_set:225 - in your container configuration file
    	  4 lxc-start c1 20190812055509.842 ERROR    sync - sync.c:__sync_wait:62 - An error occurred in another process (expected sequence number 5)
    	  5 lxc-start c1 20190812055509.908 ERROR    lxccontainer - lxccontainer.c:wait_on_daemonized_start:842 - Received container state "ABORTING" instead of "RUNNING"
    	  6 lxc-start c1 20190812055509.953 ERROR    lxc_start - tools/lxc_start.c:main:330 - The container failed to start
    	  7 lxc-start c1 20190812055509.970 ERROR    lxc_start - tools/lxc_start.c:main:333 - To get more details, run the container in foreground mode
    	  8 lxc-start c1 20190812055509.984 ERROR    lxc_start - tools/lxc_start.c:main:336 - Additional information can be obtained by setting the --logfile and --logpriority options
    	  9 lxc-start c1 20190812055509.577 ERROR    start - start.c:__lxc_start:1939 - Failed to spawn container "c1"
    

    通过分析日志,可知需要在容器的配置文件里,添加一条"lxc.apparmor.allow_incomplete = 1"。c1容器的配置文件为/var/lib/lxc/c1/config,将这一条配置添加到config末尾。

    完成如上步骤之后,再次启动容器c1,仍然没有启动成功,错误日志为:

    	  1 lxc-start c1 20190812034836.659 ERROR    lsm - lsm/lsm.c:lsm_process_label_set_at:174 - No such file or directory - Failed to set AppArmor label "lxc-container-default"
    	  2 lxc-start c1 20190812034836.659 ERROR    apparmor - lsm/apparmor.c:apparmor_process_label_set:245 - Failed to change apparmor profile to lxc-container-default
    	  3 lxc-start c1 20190812034836.660 ERROR    sync - sync.c:__sync_wait:62 - An error occurred in another process (expected sequence number 5)
    	  4 lxc-start c1 20190812034836.660 ERROR    lxccontainer - lxccontainer.c:wait_on_daemonized_start:842 - Received container state "ABORTING" instead of "RUNNING"
    	  5 lxc-start c1 20190812034836.661 ERROR    lxc_start - tools/lxc_start.c:main:330 - The container failed to start
    	  6 lxc-start c1 20190812034836.662 ERROR    lxc_start - tools/lxc_start.c:main:333 - To get more details, run the container in foreground mode
    	  7 lxc-start c1 20190812034836.662 ERROR    lxc_start - tools/lxc_start.c:main:336 - Additional information can be obtained by setting the --logfile and --logpriority options
    	  8 lxc-start c1 20190812034836.719 ERROR    start - start.c:__lxc_start:1939 - Failed to spawn container "c1"
    

    分析日志,AppArmor找不到 "lxc-container-default"配置文件。AppArmor是Linux内核提供的下类似于SeLinux的安全模块,Ubuntu默认
    支持该功能。但是,Ubuntu Core默认并不支持apparmor_status和apparmor_parser工具,而且系统中自带的profile配置文件很少,可以
    通过可以通过sudo apt-get install apparmor-profiles进行安装,上面的apparmor_status、apparmor_parser工具也会一并安装。

    apparmor profile安装完成之后,需要重启apparmor,启动方法如下:

    	Start : sudo /etc/init.d/apparmor start
    	Stop : sudo /etc/init.d/apparmor stop
    	reload: sudo /etc/init.d/apparmor reload
    	Show status: sudo /etc/init.d/apparmor status
    

    通过sudo lxc-info -n c1可以查看,容器的运行状态:

    	sudo lxc-info -n c1
    	
    	Name:           c1
    	State:          RUNNING
    	PID:            2993
    	IP:             10.0.3.81
    	CPU use:        1.87 seconds
    	BlkIO use:      18.83 MiB
    	Memory use:     22.02 MiB
    	KMem use:       0 bytes
    	Link:           vethLWC02H
    	 TX bytes:      1.04 KiB
    	 RX bytes:      1.12 KiB
    	 Total bytes:   2.16 KiB
    

    可以看到当前c1容器当前的系统资源使用率。

    通过lxc-attach命令,可以得到一个与容器进行交互的shell,例如

       sudo lxc-attach -n c1
    

    attach成功之后,会进入到一个shell终端,

    	#root@c1:
    

    可以通过lxc-attach执行容器中任何命令,例如:

    	sudo lxc-attach -n c1 ls
    	sudo lxc-attach -n c1 top
    

    可以将APP打包成deb,然后将deb拷贝到容器rootfs的适当的位置,最后,通过lxc-attach命令执行进行deb的安装。

    	sudo lxc-attach -n c1 -- dpkg -i /home/ubuntu/app.deb  //安装app.deb
    	sudo lxc-attach -n c1 -- dpkg  -r /home/ubuntu/app.deb //卸载app.deb
    

    该终端提供了Ubuntu几乎所有的功能,例如,apt,但是,该Ubuntu却是以容器的方式运行与Ubuntu Core物理主机下的。

    最后,lxc-stop可以关闭容器,lxc-destroy删除容器相关的一切配置文件,包括rootfs。

    3.2 LXD

    未完待续 。。。 。。。

    3.3 BalenaOS

    未完待续 。。。。。。

    展开全文
  • Linux容器技术原理和使用

    千次阅读 2019-11-21 16:55:17
    一、为什么会有虚拟化环境 1.1 隔离和共享 在一个多员共用的开发环境或者一台服务器运行多个逻辑隔离的服务器进程。谁的运行环境也不希望影响...传统的虚拟化技术是通过硬件模拟或者操作系统软件实现,而容器技术...

    一、为什么会有虚拟化环境

    1.1 隔离和共享

    在一个多员共用的开发环境或者一台服务器运行多个逻辑隔离的服务器进程。谁的运行环境也不希望影响到另一个谁。也就是一个物理机器需要虚拟化出多个环境或者容器。通过提供一种创建和进入容器的方式,操作系统让应用程序就像在独立的机器上运行一样,但又能共享很多底层的资源。

    1.2 虚拟化vs容器

    传统的虚拟化技术是通过硬件模拟或者操作系统软件实现,而容器技术可以比传统虚拟化更轻量级。

    容器在提供隔离的同时,还通过共享这些资源节省开销,这意味着容器比真正的虚拟化的开销要小得多。例如,可以有效地共享公共文件(比如 glibc)的页缓存,因为所有容器都使用相同的内核,而且所有容器还常常共享相同的 libc 库(取决于容器配置)。这种共享常常可以扩展到目录中其他不需要写入内容的文件。

    和传统虚拟化相比,容器启动很快,由于共享系统资源,一台主机可以运行上千个容器,并且容器镜像用类似git分发思想,用户更容易创建,分发,更新存储这些镜像。

    1.3 前世和今生

    今生是docker大流行的时代,而前世就是早于1982年的chroot工具,以及后面经过改进并且现在还在使用的lxc技术。早期的docker的代码实现基于LXC(0.9之前)。

    二、LXC(Linux容器)的两个重要概念

    Linux容器功能是基于 cgroups 和 Namespace 来实现的. 所以要了解 Linux 容器必须先了解 cgroup 和 Namespace.

    2.1、cgroups(控制组)

    cgroups 是将进程分组管理的内核功能.通过cgroups可以隔离进程, 同时还可以控制进程的资源占用(CPU, 内存等等)情况在操作系统底层限制物理资源,起到 Container 的作用。进程可用的cpu资源由cpuset指定。

    2.2、Namespace (命名空间)

    Namespace让每个进程组有独立的PID, IPC和网络空间.Namespace通过 clone系统调用来实现的.

    clone系统调用的第3个参数flags就是通过设置Namespace来划分资源的.

    三、LXC的安装

    LXC依赖于epel-release的安装,EPEL(Extra Packages for Enterprise Linux)是Fedora 社区打造提供高质量软件包的项目,相当于一个第三方源。

    yum install epel-release -y

    然后再安装LXC相关的工具包,和创建容器所需要的模板lxc-templates

    yum install lxc lxc-templates -y

    安装完使用lxc-checkconfig检查下操作系统对容器技术的支持

    图1、操作系统对LXC容器的技术支持

    四、LXC的使用

    4.1 LXC工具包概览

    LXC所有的操作工具api都在这里,可以对LXC进行相应的操作。

    图2、LXC所有命令

    4 .2 创建一个容器

    使用预定义的模板创建一个容器。它会根据模板设置自动下载依赖环境包并安装。

    lxc-create -n 容器名称 -t 模板(不需要加 lxc)

    lxc-create -n mariolu-console -t centos

    模板就是第3节安装的lxc-templates工具包。所有模板放在这个目录下/usr/share/lxc/templates/

    图3、LXC的所有模板

    跟chroot思想一样,安装完容器,所有的主机文件夹根目录被重定义到/var/lib/lxc/mariolu-console

    图4、重新定义的root路径

    4.3 启动容器

    就像安装完机器后,我们要开机启动服务器。Lxc也有相应的步骤就是

    lxc-start -n mariolu-console

     

    图5、启动界面

    但是我们很快就发现,启动需要密码,但是使用容器创建没有输入密码,难道是有什么默认密码吗

    图6、登录密码步骤

    在这里并不能看到root密码,密码或者被用x字符替代,或者是一串hash码。

    cat /var/lib/lxc/mariolu-console/rootfs/etc/shadow

    chroot /var/lib/lxc/mariolu-console/rootfs passwd

    网络搜索没找到默认密码,但是找到了这么一句话:

    The root password is set up as expired and will require it to be changedat first login, which you should do as soon as possible. If you lose the root password or wish to change it without starting the container, you can change it from the host by running the following command (which will also reset the expired flag):

    chroot /var/lib/lxc/sspl-test/rootfs passwd

    YES! Give Me Five! 这个告诉我们重置密码的命令。我们新开一个窗口,完成密码的重置,然后重新切换回原来的窗口,这时候就可以用密码愉快的登陆了。

     

    图7、重置root密码

    图8、登录成功

    展开全文
  • 近两年来,Linux容器技术占据了世界企业IT市场的主导地位,并且基于很好的理由-除此之外,它们所承担解决的问题就是虚拟化根本无法在应用软件开发和计算行业大规模应用,并允许企业世界真正拥抱像DEVOPS概念和...

    近两年来,Linux的容器技术占据了世界企业IT市场的主导地位,并且基于很好的理由-除此之外,它们所承担解决的问题就是虚拟化根本无法在应用软件开发和计算行业大规模应用,并允许企业世界真正拥抱像DEVOPS概念和微服务(多年的面向服务的架构梦想已经过去了)。这就是你听到的呼声,IT设备商们正急切迎向容器化的时代。但是,就像每一个新兴的技术趋势,这并不总是一件好事,因为不是每个人都能走的通,而不管企业可能面临的实际问题。

    作为操作系统的扩展,特别是Linux内核扩展的一部分,Linux的容器可以在运行期创建和格式化,然后用在跨集群的主机上协调网络和存储资源。最终的结果是一组轻量级的,动态的和安全的应用服务,每个自包含于Linux容器内,并能够通过自身或与其它容器的应用程序一起运行以创建更灵活,但更复杂的企业应用程序。

    容器的这些能力显示了对于当前某些IT产业细分市场显著的竞争威胁,并且是对于专有计算堆栈的又一沉重打击(主要是针对Linux),这是显而易见的。然而,Linux的容器以及和它有千丝万缕联系的Docker容器技术也同样面临着一些不可忽视的威胁,甚至在这些技术走向成熟之前。当前,对于这些技术的看法都是相当正面积极的,那么是什么在威胁着容器技术的未来?

    总体而言,有以下三个有关Linux容器采用和容器化基础设施部署相关的问题:

    • 标准碎片化
    • 专有代码和虚假开放源
    • Container washing(container washing寓意容器化包装和洗脑那些可能和container并不相关的东西,首先来源于cloud washing)

    碎片化

    碎片化可以说是在商业世界面临的影响Linux容器被采用最危险的威胁。假如没有清晰的,易于采用的标准,尤其是针对于镜像格式和编排水平,将会导致大部分企业会放弃拥抱该技术。简单来说就是没有任何IT的决策者想要负责支持一个失败的任务。举个消费者世界的例子,假设有人存了满仓库全部是HD-DVD播放器和配件,然后发现蓝光已经赢得了最终的市场。损失将会是指数级的增长,这就是企业世界的现实,也是Linux容器技术标准将要面临的。

    虽然碎片化是目前影响Linux容器被采用面临的最严重威胁,但它也是最容易被解决的问题之一。两个新的都是由Linux基金会控制的基金会已经成立,它们近期已经开始运行以帮助消除Linux容器世界中碎片化的阴霾。

    开放容器倡议旨在提供从底层的标准用于容器镜像格式和运行,以及容器化应用程序的开发。

    云本地运算旨在推动标准用于开发、运行和规模化分布式应用程序基于Kubernetes为流程起点的最佳实践和互操作性。

    虽然这两个组织是一个梦幻般的开局,在从容器完整的生命周期复杂性来看,它需要从标准的角度持续性的关注。随着技术的不断完善,为企业采用,极有可能会有更多的“格式之战”类型混战会随之而来,从大的层面上来说这取决于整个开源社区如何帮助调节和编撰这些争论,从而形成通用的标准和实践。随着两个基金会的启动推进以及后开源社区的最佳实践,我们可以希望,标准化继续开放发展,而不会妨碍或放缓创新。

    “半开放式”也实际上意味着“全封闭”

    碎片化的威胁也提出了另一个重要问题。当我们谈到容器,实际上它包含开源的内核或者“虚假的开源”Linux容器的周边产品。尽管都有“Linux”在名字中,容器可以广泛的适应于专有以及开放栈。这样会出现问题,当专有的代码和服务基于它们的方式逐步的进入容器化解决方案时,它们都会被以为是完全开放的。“虚假的开放”威胁并不是新东西,首先我们曾经在Unix以及最近大多数云计算方案中见过,尤其是PaaS和基于openstack的方案表面上是开放的但是最上层是基于开源基础的专有技术。

    Linux容器,虽然还处于被企业IT市场采用的生态周期的早期(尽管步伐在加快)。如果专有技术依赖落地于容器化技术,而这当前已经几乎肯定的事,那么IT界的情绪会变味。这究竟是一个创新,还是基于旧有专有系统的延续?从封闭的协议栈到高昂的许可证将导致创新的极大萎缩,在开放社区的血、汗、泪创建的基础之上加入虚假开放代码将会迅速抑制周围的开源热情和创新基础。

    Container washing

    在云计算热潮激动人心的日子(可以说这热潮仍在进行),云清洗的概念诞生了。实际上,一个IT供应商将采取基于已经存在的产品和“washing”的营销材料,用规格表等云行话来包装,希望说服客户和潜在客户,这个现有的供应商是云计算新兴世界中的玩家。

    现在,我们看到的container washing也在同样的发生,那些和容器热潮轻微相关(或完全不相关的)供应商和解决方案都在试图以它们的方式进入这个市场。这里的威胁远远大于碎片化或虚假开源,它是一个威胁颠覆了容器实际上是什么东西。

    举个例子,关于容器和虚拟机概念上的混乱。我们当然可以在虚拟机上跑个容器,或者是反向为之,但是两种技术解决的是不同的问题。通过虚拟化基础设施服务与应用程序代码的结合提供了抽象,容器是允许在轻量化软件环境中干净隔离并理想调用的最好方法,作为主要的服务提供方法。

    通过与那些由容器提出混为一谈的现有技术,这种威胁创造了企业在考量容器采用时更多的混乱和烦恼。相对于仅是挑选最适合他们的,IT团队现在还需要调查解决方案是否真正提供Linux容器的便利,还是仅仅是市场宣传。这很容易导致当谈到部署新的技术时,IT部门总是会倾向于阻力最小的方案,就像一句古语所说“你不会因为你购买了什么而被解雇【某个IT供应商的名言】”。

    上述三个是当前最大的,但并不是仅有的,我们所面临的对于Linux容器技术生态系统成长的威胁。这并不是说这些问题会阻止容器技术被采用,碎片化问题已经被定位,并且IT的领导者们已经体验过Unix和Cloud的战争并可以理解小心谨慎的处理开源核心和行话包装产品之间的差别。但是重要的是要记住,通往创新的路径永远是布满荆棘的,Linux的发展是如此,云计算也是如此,现在轮到Linux容器了。

    它最终是取决于开源社区,企业界和创业公司,并建立IT设备商在围绕Linux容器中的创新来越过这些障碍,通过合作和奉献来帮助容器技术真正实现它们的企业应用潜力。

    作者Lars Herrmann是RedHat综合解决方案事业部和容器策略的总经理。

    原文链接:http://venturebeat.com/2016/02/13/these-3-things-are-trying-to-kill-linux-containers/

    责编:魏伟,weiwei@csdn.net

    展开全文
  • Linux 容器技术史话:从 chroot 到未来

    千次阅读 2016-03-01 16:16:02
    Linux 容器是一个在单一 Linux 主机上提供多个隔离的 Linux 环境的操作系统级虚拟技术。不像虚拟机(VM),容器并不需要运行专用的访客(guest)操作系统。容器们共享宿主机的(host)操作系统内核,并使用访客操作...

    Linux 容器是一个在单一 Linux 主机上提供多个隔离的 Linux 环境的操作系统级虚拟技术。不像虚拟机(VM),容器并不需要运行专用的访客(guest)操作系统。容器们共享宿主机的(host)操作系统内核,并使用访客操作系统的系统库来提供所需的功能。由于不需要专用的操作系统,因此容器要比虚拟器启动快得多。

    Virtual Machines Vs Containers

    Virtual Machines Vs Containers

    (图片来自: Docker Inc.)

    容器借助 Linux 内核的 Namespaces、Apparmor、SELinux 情景模式(profile)、chroot 和 CGroup 等功能来提供类似于虚拟机的隔离环境。Linux 的安全模块可以确保正确地控制容器对宿主机和内核的访问,从而避免各种入侵活动。此外,在宿主机上可以运行不同的 Linux 发行版,只要它们运行在同样的 CPU 架构下。

    简单来说,容器提供的是一种基于各种 Linux 发行版创建容器镜像的方法、一套管理容器生命周期的 API、与该 API 交互的客户端工具、保存快照的功能、在宿主机之间迁移容器实例的能力,等等。


    容器历史

    以下是容器简史,内容来自维基百科及其它来源:

    1979 — chroot

    容器的概念始于 1979 年的 UNIX  chroot,它是一个 UNIX 操作系统上的系统调用,用于将一个进程及其子进程的根目录改变到文件系统中的一个新位置,让这些进程只能访问到该目录。这个功能的想法是为每个进程提供独立的磁盘空间。其后在 1982年,它被加入到了 BSD 系统中。

    2000 — FreeBSD Jails#p#分页标题#e#

    FreeBSD Jails 是最早的容器技术之一,它由 R&D Associates 公司的 Derrick T. Woolworth 在 2000 年为 FreeBSD 引入。这是一个类似 chroot 的操作系统级的系统调用,但是为文件系统、用户、网络等的隔离增加了进程沙盒功能。因此,它可以为每个 jail 指定 IP 地址、可以对软件的安装和配置进行定制,等等。

    2001 — Linux VServer

    Linux VServer 是另外一种 jail 机制,它用于对计算机系统上的资源(如文件系统、CPU 处理时间、网络地址和内存等)进行安全地划分。每个所划分的分区叫做一个安全上下文(security context),在其中的虚拟系统叫做虚拟私有服务器(virtual private server,VPS)。

    2004 — Solaris Containers

    Solaris Containers 支持在 x86 和 SPARC 系统,首次出现在 2004 年 2 月发布的 Solaris 10 的 build 51 beta 上,其后完整发布在 2005 年的 Solaris 10 上。 Solaris Container 是由系统资源控制和通过 zones 提供的边界分离(boundary separation)所组合而成的。zones 是一个单一操作系统实例中的完全隔离的虚拟服务器。

    2005 — OpenVZ

    OpenVZ 类似于 Solaris Containers,它通过对 Linux 内核进行补丁来提供虚拟化、隔离、资源管理和状态检查(checkpointing)。每个 OpenVZ 容器都有一套隔离的文件系统、用户及用户组、进程树、网络、设备和 IPC 对象。

    2006 — Process Containers

    Process Containers 是由 Google 在 2006 年实现的,用于对一组进程进行限制、记账、隔离资源使用(CPU、内存、磁盘 I/O、网络等)。后来为了避免和 Linux 内核上下文中的“容器”一词混淆而改名为 Control Groups。它被合并到了 2.6.24 内核中。这表明 Google 很早就参与了容器技术的开发,以及它们是如何回馈到社区的。

    2007 — Control Groups

    如上面所述,Control Groups (即  cgroups)是由 Google 实现的,并于 2007 年加到了 Linux 内核中。#p#分页标题#e#

    2008 — LXC

    LXC 的意思是 LinuX Containers,它是第一个最完善的 Linux 容器管理器的实现方案,是通过 cgroups 和 Linux 名字空间(namespace)实现的。LXC 存在于 liblxc 库中,提供了各种编程语言的 API 实现,包括 Python3、Python2、Lua、Go、Ruby 和 Haskell。与其它容器技术不同的是, LXC 可以工作在普通的 Linux 内核上,而不需要增加补丁。现在 LXC project 是由 Canonical 公司赞助并托管的。

    2011 — Warden

    Warden 是由 CloudFoundry 在 2011 年开发的,开始阶段是使用的 LXC,之后替换为他们自己的实现方案。不像 LXC,Warden 并不紧密耦合到 Linux 上,而是可以工作在任何可以提供隔离环境的操作系统上。它以后台守护进程的方式运行,为容器管理提供了 API。请参考 Warden 文档和这个博客文章了解更多。

    2013 — LMCTFY

    lmctfy 的意思是“让我为你包含(Let Me Contain That For You)”。这是一个 Google 容器技术的开源版本,提供 Linux 应用容器。Google 启动这个项目旨在提供性能可保证的、高资源利用率的、资源共享的、可超售的、接近零消耗的容器(参考自:lmctfy 演讲稿)。现在为 Kubernetes 所用的 cAdvisor 工具就是从 lmctfy 项目的成果开始的。lmctfy 首次发布于 2013 年10月,在 2015 年 Google 决定贡献核心的 lmctfy 概念,并抽象成 libcontainer,因此,lmctfy 现在已经没有活跃的开发了。

    lincontainer 项目最初由  Docker 发起,现在已经被移交给了开放容器基金会(Open Container Foundation)。

    2013 — Docker

    Docker 是到现在为止最流行和使用广泛的容器管理系统。它最初是一个叫做 dotCloud 的 PaaS 服务公司的内部项目,后来该公司改名为 Docker。类似 Warden,Docker 开始阶段使用的也是 LXC ,之后采用自己开发的 libcontainer 替代了它。不像其它的容器平台,Docker 引入了一整个管理容器的生态系统,这包括高效、分层的容器镜像模型、全局和本地的容器注册库、清晰的 REST API、命令行等等。稍后的阶段, Docker 推动实现了一个叫做 Docker Swarm 的容器集群管理方案。

    2014 — Rocket#p#分页标题#e#

    Rocket 是由 CoreOS 所启动的项目,非常类似于 Docker,但是修复了一些 Docker 中发现的问题。CoreOS 说他们的目的是提供一个比 Docker 更严格的安全性和产品需求。更重要的是,它是在一个更加开放的标准 App Container 规范上实现的。在 Rocket 之外,CoreOS 也开发了其它几个可以用于 Docker 和 Kubernetes的容器相关的产品,如:CoreOS 操作系统、etcd 和 flannel。

    2016 — Windows Containers

    微软 2015 年也在 Windows Server 上为基于 Windows 的应用添加了容器支持,它称之为 Windows Containers。它与 Windows Server 2016 一同发布。通过该实现, Docker 可以原生地在 Windows 上运行 Docker 容器,而不需要启动一个虚拟机来运行 Docker( Windows 上早期运行 Docker 需要使用 Linux 虚拟机)。


    容器的未来

    截止到今天(2016年1月),在行业内有一个显著趋势,部署软件应用从虚拟机逐渐移到了容器。其主要的原因是容器相比于虚拟机而言更加灵活和低消耗。Google 已经使用容器技术好多年了,它在 Borg 和 Omega 容器集群管理平台上可以成规模地运行 Google 应用。更重要的是,Google 为容器领域贡献了 cgroups 的实现和参与了 libcontainer 项目。Google 也在过去这些年借助容器在性能、资源利用和整体效率方面取得了巨大收益。最近,一直没有操作系统级的虚拟化技术的微软,也在 Window Server 上迅速采取动作实现了对容器的原生支持。

    Docker 、Rocket 以及其它的容器平台并不能以一个单一主机运行在产品环境中,原因是这样面临着单点故障。当一组容器运行在一个单一宿主机时,如果宿主机失效,所有运行在该宿主机上的容器也会失效。要避免这个问题,应该使用容器宿主机集群。Google 借助其在 Borg 中取得的经验,开发了一个叫做  Kubernetes 的开源容器集群管理系统。Docker 也启动了一个叫做  Docker Swarm 的解决方案。目前这些解决方案还都处于相当早期的阶段,也许需要几个月或来年才实现完整的功能集合,才能变得稳定,从而广泛应用于行业内的产品环境中。

    微服务(Microservices )是另一个突破性技术,在软件架构上可以将容器用于部署。微服务并不是一个新东西,只是一个相比标准的 Web 服务超快的轻量级 Web 服务。这是通过将功能单元(也许是一个单一服务或 API 方法)打包到一个服务中,并内嵌其到一个轻量级 Web 服务器软件中实现的。#p#分页标题#e#

    通过对上面的介绍,我们可以预测接下来几年,容器也许会替代虚拟机,某些情况下也许会全部取代。去年我为一些企业在 POC 层面上实现了基于容器的解决方案。也有人想要在产品环境中尝试它们,这一天也许在容器集群管理系统进一步成熟后很快到来。

    转载于:http://www.itxuexiwang.com/a/liunxjishu/2016/0228/178.html?1456820003

    展开全文
  • linux容器技术-LXC相关技术知识介绍

    千次阅读 2012-07-25 10:32:57
     LXC利用AppArmor配置文件来保护主机不受容器内实例的恶意行为,比如:容器内的实例对/proc/sysrq-tigger以及/sys目录下的绝大部分文件不具有写权限。另外,usr.bin.lxc-start配置文件用来防止lxc-start挂载除了...
  •  容器是一种轻量级的虚拟化技术,与qemu/kvm、VMware、Xen等完全的虚拟化方案相比,LXC更像是加强的“chroot”,因为LXC不但没有没有对硬件设备进行仿真,而且可以与主机共享一模一样的操作系统,所以LXC与solaris...
  • Linux Contributor,华为Linux内核高级开发工程师李泽帆在OpenCloud 2015大会Container专场的演讲PPT:Linux内核容器技术的历史、现状和展望,表示Docker的基石——Cgroup和namespace等Linux内核特性的发展历程,...
  • Linux容器虚拟化技术介绍

    千次阅读 2014-01-02 11:12:35
    最初的LXC技术是由IBM研发的,目前已经进入Linux内核主线,这意味着LXC技术将是目前最有竞争力的轻量级虚拟容器技术,相比较传统的VServer和OpenVZ轻量级虚拟技术(两者都需要对标准内核进行补丁),发展潜力更大。
  • Linux容器虚拟技术LXC简明手册

    万次阅读 2011-06-15 10:04:00
    LXC容器虚拟化经过一些折腾,初步在自己的工作笔记本上部署...一些介绍信息,请参考 Linux容器虚拟化技术介绍安装以下安装实践是在Gentoo x86_64平台上实现的,如果采用Red Hat系统或Debian,应该只是在软件安装上有区
  • Linux 容器的使用

    千次阅读 2018-08-01 14:49:21
    Linux 容器在 v2.6.29版本之后就加入到内核之中了, 之前虽然也听说过, 但一直没有太留心, 一直使用 KVM 来创建虚拟机. 直至最近 Docker 大出风头, 才开始关注. 想了解一下 Linux 容器究竟是什么? 与现有虚拟机技术...
  • 接触过docker的同学多多少少听过这样一句话“docker容器通过linux namespace、cgroup特性实现资源的隔离与限制”。今天我们来尝试学习一下这两个东西。 二、关于namesapce 命名空间将全局系统资源包装在一个抽象中,...
  • linux container容器技术框架性理解

    千次阅读 2015-09-28 21:10:00
    我对container原理的一些理解(基于linux kernel 2.6.38) by kin 2011.04.17 =====================================================  linux中称谓的container在内核层面由两个独立的机制保证,一个保证资源的...
  • 开源Linux容器 OpenVZ 快速上手指南

    千次阅读 2015-04-02 10:56:13
    Linux 容器及OpenVZ 简介 OpenVZ 安装 安装内核镜像 配置sysctl 以及安装相关工具 重启至OpenVZ 内核 简单上手 下载预先准备的模板也可以称作镜像 创建以及配置容器信息 开始运行以及使用Linux 容器及OpenVZ 简介...
  • Linux容器LXC学习之Namespace

    千次阅读 2016-04-22 22:18:54
    Linux Containers即就是Linux容器,是一个加强版的Chroot。容器可以提供轻量级的虚拟化,一遍隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。;  LXC主要依赖Linux内核的3种隔离机制...
  • 通过 Linux 容器进行虚拟化

    千次阅读 2014-06-25 08:27:48
    Linux 容器是一种轻量级“虚拟化”方法,用于在单个控制主机上同时运行多个虚拟装置(容器)。另一个可用来描述 Linux 容器所执行的操作的术语是“容器化”。 Linux 容器提供操作系统级别的虚拟化,其中的内核控制...
  • Docker如火如荼,内核社区是否会因此加紧完善容器技术的隔离性安全性?华为Linux内核高级工程师李泽帆将在2015 Container技术峰会上详细解说。 2015年4月16-18日,由CSDN主办、CSDN专家顾问团支持的OpenCloud ...
  • Lxc linux容器工具

    千次阅读 2013-09-27 17:39:50
    游览和设置新的容器工具 Linux Containers 容器可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。本文循序渐进地介绍容器工具 Linux® Containers(LXC)。...
  • linux 容器(LXC) 第6章 之技术简介

    千次阅读 2018-08-03 09:51:30
    和现有技术的对比: ...VMM(VMM Virtual Machine Monitor)或者叫Hypervisor是标准的虚拟化技术,这种技术通过虚拟层(也就是VMM或叫Hypervisor),主要作用一是让多个操作系统和应用共享硬...
  • Linux 容器的建立和简单管理

    千次阅读 2016-06-21 12:38:43
    使用 LXC 的优点就是不需要安装太多的软件包,使用过程也不会占用太多的资源, LXC 是在 Linux 平台上基于容器的虚拟化技术的未来标准,最初的 LXC 技术是由 IBM 研发的,目前已经进入 Linux 内核主线,这意味着 LXC...
  • 作者 | 唐华敏(华敏) 阿里云容器平台技术专家 ...导读:Linux 容器是一种轻量级的虚拟化技术,在共享内核的基础上,基于 namespace 和 cgroup 技术做到进程的资源隔离和限制。本文将会以 docker 为例,...
  • .NET程序在Linux容器中的演变

    千次阅读 2017-04-10 14:25:57
    现在,.NET开发人员可以无障碍地使用如Docker这样的Linux容器,那么让我们来尝试如何以正确的方式配置一个容器。可能,文章的标题改成“Linux容器开发人员的演变”会更好。由于.NET可在Linux(以及Windows和macOS)...
  • Docker在当下很火,那么,当我们谈Docker,谈容器的时候,我们在谈什么? 或者说,你对Docker,对容器了解吗?容器,到底是怎么一回事儿?...容器其实是一种沙盒技术.顾名思义,沙盒就是能够像一个集装箱一样. ...
  • Docker技术( 容器虚拟化技术 )

    万次阅读 多人点赞 2019-10-18 19:59:21
    Docker虚拟化容器技术 第一章 Docker简介诞生背景Docker 介绍虚拟机技术容器虚拟化技术官方网址第二章 Docker安装前提条件安装DockerDocker底层原理Docker结构图工作原理Docker为什么比VM快第三章 Docker常用命令...
  • 编译链接:www.oschina.net/news/90833/linux-containers-vs-virtual-machines原文:www.datamation.com/open-source/linux-containers-vs-virtual-machines.html自从Linux上的容器变得流行以来,了解Linux容器和...
  • 0.前言 首先要知道一个运行的容器,其实...而本文主要来探讨Docker容器实现隔离用到的技术Linux Namespace。 1.关于 Linux Namespace Linux提供如下Namespace: Namespace Constant Isolates Cgroup CLONE_NEWCGRO...
  • 前面我们讨论了Docker容器实现隔离和资源限制用到的技术Linux namespace 、Linux CGroups,本篇我们来讨论Docker容器镜像用到的技术UnionFS。 1.关于UnionFS 1)什么是UnionFS 联合文件系统(Union File System):...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 101,657
精华内容 40,662
关键字:

linux容器技术

linux 订阅