Linux容器技术原理和使用

提示:读完这篇文章大概需要5分钟

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

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、登录成功

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java_python

java架构之路-(MQ专题)RabbitMQ安装和基本使用

  我这里安装是使用阿里云的CentOS7.5来安装的,使用CentOS版本低于7的可能会报错。

8230
来自专栏LINUX阅码场

解决Linux内核问题实用技巧之 - Crash工具结合/dev/mem任意修改内存

解决每一类问题都需要消耗大量的时间,特别是重新编译内核这种事情。于是,每一个Linux内核程序员或多或少都会掌握一些Hack技巧,以节省时间提高工作效率。

22950
来自专栏科技分享

08 在设备树里描述platform_device【转】

转自:https://blog.csdn.net/jklinux/article/details/78575281

8820
来自专栏科技分享

设备树处理之——device_node转换成platform_device【转】

转自:https://www.cnblogs.com/downey-blog/p/10486568.html

7820
来自专栏王磊的博客

Redis事务深入解析和使用

事务指的是提供一种将多个命令打包,一次性按顺序地执行的机制,并且保证服务器只有在执行完事务中的所有命令后,才会继续处理此客户端的其他命令。 事务也是其他关系型...

8910
来自专栏科技分享

Linux 设备树详解【转】

转自:http://www.pianshen.com/article/428276673/;jsessionid=D90FC6B215155680E0B89A6...

14020
来自专栏sktj

Docker docker-py模块

官方文档https://docker-py.readthedocs.io/en/stable/

11830
来自专栏python小教程

Python 环境搭建

你可以通过终端窗口输入 "python" 命令来查看本地是否已经安装Python以及Python的安装版本。

11440
来自专栏Java编程指南

Linux安装软件的几种方式

10310
来自专栏科技分享

linux设备驱动程序-设备树(2)-device_node转换成platform_device

设备树的产生就是为了替代driver中过多的platform_device部分的静态定义,将硬件资源抽象出来,由系统统一解析,这样就可以避免各驱动中对硬件资源大...

7610

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励