你好,Linux 新手朋友!你是不是经常听到 "容器""Docker""资源隔离" 这些词,感觉又高大上又难懂?是不是觉得这些都是大佬才玩得转的黑科技?
别慌,今天咱们就用最接地气的方式,通过 LXC 这个工具,亲手创建一个容器,一步步搞明白 Linux 到底是怎么把一台机器 "劈成" 好几台用的。全程保姆级操作,每一步都告诉你在哪敲、敲什么、会看到啥,零基础也能跟上。
1、先唠明白:容器到底是个啥?
在动手之前,咱们先用大白话把概念说清楚,不整虚的。
1.1 虚拟机 vs 容器:两家的 "装修方案" 不一样
你可以把一台电脑想象成一栋大房子。
- 虚拟机:相当于在房子里砌了好几堵承重墙,隔出好几间独立的小房子。每间都有自己的墙、自己的门、自己的水电系统,互相完全不打扰。但缺点是费材料、占地方,开多了房子就挤不动了。
- 容器:相当于在房子里用轻质隔板隔出好多小隔间。大家共享房子的地基、主水管和主电线,但是每个隔间有自己的小房间、小桌子,你在隔间里干啥,隔壁基本看不见也管不着。省材料、搭得快,是现在的主流玩法。
咱们今天玩的 LXC,就是 Linux 原生的 "轻质隔板工具",大名鼎鼎的 Docker 早期也是靠它起家的。学会了 LXC,你再看 Docker 就会觉得:哦,原来就是包装得更花哨了而已。
1.2 Linux 靠啥实现 "隔间" 效果?
就两个核心法宝,记住这俩词你就超过一半外行:
- Namespace(命名空间):负责 "眼睛上的隔离"------ 让每个隔间里的人,都以为自己拥有一整台电脑。看不到别的进程、看不到别的用户、连主机名都不一样。
- Cgroups(控制组):负责 "实际上的限流"------ 给每个隔间分配好最多用多少 CPU、多少内存、多少硬盘 IO,谁也别抢谁的。
说一千道一万,不如亲手干一遍。咱们现在就开始实战。
2、战前准备:把 LXC 工具装上
咱们分 Ubuntu 和 CentOS 两种系统来讲,你是什么系统就看哪一节。
操作窗口说明 :以下所有命令,都在你的宿主机终端窗口(也就是你平时敲 Linux 命令的那个黑窗口)里执行,全程用 root 用户或者加 sudo。
2.1 Ubuntu 系统安装步骤
2.1.1 先检查一下有没有装过旧版本
如果之前装过,建议先清理干净,避免出奇怪的问题。没装过直接跳到 2.1.2。
在哪操作 :宿主机终端 执行命令:
bash
systemctl status lxc
做了什么 :查看 lxc 服务当前状态 预期效果:
- 如果提示 "Unit lxc.service could not be found",说明没装过,直接往下走。
- 如果显示正在运行,说明之前装过,可以先停止所有容器再卸载。
需要卸载的话依次执行:
bash
# 先查看有哪些容器
lxc-ls -f
# 逐个停止容器(把xxx换成你的容器名)
lxc-stop -n xxx
# 逐个删除容器
lxc-destroy -n xxx
# 卸载软件
apt-get purge --auto-remove lxc lxc-templates -y
2.1.2 正式安装
在哪操作 :宿主机终端 执行命令:
bash
apt install lxc lxc-templates bridge-utils -y
做了什么:一次性装三个东西
lxc:主程序,容器的核心引擎lxc-templates:各种系统模板,相当于 "隔间装修样板间"bridge-utils:网桥工具,用来给容器分配网络
预期效果:命令跑完没有报错,最后出现类似 "0 upgraded, 0 newly installed, 0 to remove" 或者安装成功的提示。
2.1.3 检查服务状态
在哪操作 :宿主机终端 执行命令:
bash
systemctl status lxc
做了什么 :确认 lxc 服务正常运行 预期效果 :看到绿色的 active (exited) 字样,说明服务启动成功了。
2.2 CentOS 系统安装步骤
2.2.1 先配置软件源
CentOS 默认源里没有 LXC,得先装 epel 源。
在哪操作 :宿主机终端 执行命令:
bash
yum -y install epel-release
做了什么:安装扩展软件源,里面包含 LXC 相关包
2.2.2 正式安装
在哪操作 :宿主机终端 执行命令:
bash
yum -y install lxc lxc-templates bridge-utils lxc-libs libcgroup libvirt lxc-extra debootstrap
做了什么:安装 LXC 全家桶,比 Ubuntu 多装了几个依赖库和虚拟化管理工具
2.2.3 启动服务并检查
在哪操作 :宿主机终端 执行命令:
bash
systemctl start lxc
systemctl start libvirtd
systemctl status lxc
做了什么:启动 lxc 服务和虚拟化监控服务,然后查看状态
预期效果 :看到 active (running) 就表示正常运行了。
3、第一步:检查你的系统支不支持 "造隔间"
装完软件先别急着建容器,先确认一下你的 Linux 内核把该开的开关都打开了。这一步很重要,就像装修前先检查水电通不通。
3.1 执行环境检查命令
在哪操作 :宿主机终端 执行命令:
bash
lxc-checkconfig
做了什么:让 LXC 帮你做一次全身体检,看看内核的各项容器功能有没有开启
3.2 教你看懂检查报告
输出内容会很长,你重点看这几大块:
3.2.1 Namespaces 部分
看到下面这些项后面都是 enabled,就说明 "视觉隔离" 功能全开了:
- Namespaces: enabled
- Utsname namespace: enabled(主机名隔离)
- Ipc namespace: enabled(进程间通信隔离)
- Pid namespace: enabled(进程号隔离)
- User namespace: enabled(用户隔离)
- Network namespace: enabled(网络隔离)
3.2.2 Control groups 部分
这部分都是 enabled,说明 "资源限流" 功能也正常:
- Cgroups: enabled
- Cgroup memory controller: enabled(内存控制)
- Cgroup cpu account: enabled(CPU 统计)
- Cgroup blkio: enabled(磁盘 IO 控制)
3.2.3 Misc 部分
看到 Veth pair device: enabled, loaded 和 Bridges: enabled, loaded,说明网络桥接功能没问题,容器能正常上网。
一句话总结:只要大部分都是 enabled,你就可以放心往下走了。
4、第二步:看看都有哪些 "装修模板" 可选
LXC 自带了很多现成的系统模板,就像奶茶店的菜单,想喝什么口味直接点。
4.1 查看可用模板列表
在哪操作 :宿主机终端 执行命令:
bash
ls /usr/share/lxc/templates/
做了什么:列出 LXC 自带的所有系统模板文件
预期效果:你会看到一长串名字,比如:
lxc-ubuntu:Ubuntu 系统模板lxc-centos:CentOS 系统模板lxc-debian:Debian 系统模板lxc-alpine:超轻量的 Alpine 模板lxc-busybox:最小巧的 busybox 系统
咱们今天就用 Ubuntu 模板来演示,创建一个叫 lxchost1 的容器。
5、第三步:亲手创建第一个容器
激动人心的时刻到了,咱们正式 "搭隔间"。
5.1 执行创建命令
在哪操作 :宿主机终端 执行命令:
bash
lxc-create -t ubuntu -n lxchost1 -- -r xenial -a amd64
做了什么:咱们拆开讲,每个参数都是干啥的
-t ubuntu:指定用 ubuntu 模板,相当于 "我要装修成 Ubuntu 风格"-n lxchost1:给容器起个名字叫 lxchost1,以后都用这个名字找它-- -r xenial:指定系统版本是 xenial(也就是 Ubuntu 16.04)-a amd64:指定架构是 64 位
小提示 :如果你的宿主机是 CentOS,想建 CentOS 容器,用这条命令:
lxc-create -t centos --name centos1 -- --release 7 --arch x86_64
5.2 耐心等待下载过程
预期效果:命令执行后,屏幕会哗哗地滚日志,显示正在下载各种软件包。这个过程快慢取决于你的网速,慢的话可能要等几分钟。
5.3 创建成功的标志
当你看到下面这几行字,就说明容器创建成功了:
bash
# The default user is 'ubuntu' with password 'ubuntu'!
# Use the 'sudo' command to run tasks as root in the container.
划重点:
- 默认用户名:
ubuntu - 默认密码:
ubuntu - 进去之后可以用 sudo 获得 root 权限
5.4 容器文件存在哪了?
咱们来瞅一眼 Linux 把这个 "隔间" 的东西放哪了。
在哪操作 :宿主机终端 执行命令:
bash
ls -l /var/lib/lxc/lxchost1/
做了什么 :查看容器目录结构 预期效果:你会看到两个关键东西:
config:容器的配置文件,相当于 "隔间的设计图纸"rootfs/:容器的根文件系统,相当于隔间里的所有文件都在这
再看看下载缓存:
bash
ls -l /var/cache/lxc/
这里存着下载好的软件包,下次再建同样的容器就不用重新下载了,速度会快很多。
6、第四步:启动容器,看看它活了没
容器创建好了是 "关机状态",咱们把它开起来。
6.1 先看一眼当前状态
在哪操作 :宿主机终端 执行命令:
bash
lxc-ls -f
做了什么 :列出所有容器及其详细状态,-f 就是 fancy 的意思,显示完整信息
预期效果:输出大概长这样:
bash
NAME STATE AUTOSTART GROUPS IPV4 IPV6 UNPRIVILEGED
lxchost1 STOPPED 0 - - - false
STATE 那一栏显示 STOPPED,说明容器躺着呢,还没开机。
6.2 启动容器
在哪操作 :宿主机终端 执行命令:
bash
lxc-start -n lxchost1 -d
做了什么:
-n lxchost1:指定启动哪个容器-d:后台运行(daemon 模式),就像你平时开软件最小化到后台一样
6.3 再看状态,确认跑起来了
在哪操作 :宿主机终端 执行命令:
bash
lxc-ls -f
预期效果:
bash
NAME STATE AUTOSTART GROUPS IPV4 IPV6 UNPRIVILEGED
lxchost1 RUNNING 0 - 10.0.3.248 - false
看到没?变化来了:
- STATE 变成了
RUNNING:容器正在运行 - IPV4 出现了
10.0.3.248:容器分到了一个内网 IP 地址
恭喜你,你的第一个容器成功跑起来了!
7、第五步:查看容器详细信息
咱们来扒一扒这个容器到底用了多少资源。
7.1 查看详细运行信息
在哪操作 :宿主机终端 执行命令:
bash
lxc-info -n lxchost1
做了什么:查看指定容器的详细状态数据
预期效果:你会看到一整套数据,咱们一个个解释:
bash
Name: lxchost1 # 容器名字
State: RUNNING # 运行状态
PID: 282127 # 容器一号进程在宿主机上的 PID 号
IP: 10.0.3.248 # 容器 IP 地址
CPU use: 0.59 seconds # 累计用了多久 CPU
BlkIO use: 29.45 MiB # 磁盘读写了多少数据
Memory use: 59.52 MiB # 占用了多少内存
KMem use: 6.82 MiB # 内核内存占用
Link: vethbg8LKH # 虚拟网卡名字
TX bytes: 1.73 KiB # 发出去了多少数据
RX bytes: 6.61 KiB # 收到了多少数据
是不是很神奇?宿主机清清楚楚地盯着这个容器用了多少资源,这就是 Cgroups 在干活。
8、第六步:钻进容器里,体验 "独立世界"
现在咱们进到容器里面去,亲身体验一下 "我就是一整台机器" 的错觉。
进入容器有两种方式,咱们都试试。
8.1 方式一:SSH 远程登录进去
这是最有 "远程服务器" 感觉的方式。
在哪操作 :宿主机终端 执行命令:
bash
ssh ubuntu@10.0.3.248
做了什么:用 ssh 命令连接容器的 IP 地址,用户名是 ubuntu
预期效果 :提示你输入密码,输入 ubuntu 回车。
登录成功后,你会发现命令提示符变了,变成了 ubuntu@lxchost1:~$。恭喜你,现在你已经身在容器之中了!
8.1.1 体验一:看看容器里的网络
在哪操作 :容器内部终端(刚 SSH 进去的这个窗口) 执行命令:
bash
ip addr
做了什么:查看容器里的网卡和 IP
预期效果:你会看到容器只有两块网卡:一个本地回环 lo,一个 eth0 网卡,IP 就是 10.0.3.248。它完全不知道宿主机还有多少块网卡。
8.1.2 体验二:看看容器里的进程
在哪操作 :容器内部终端 执行命令:
bash
ps -ef
做了什么:列出容器里所有正在运行的进程
预期效果 :你会发现进程号从 1 开始,一号进程是 /sbin/init。整个容器里也就十几个进程,它完全看不到宿主机上那上百个进程。
这就是 PID Namespace 的魔力 ------ 给你造一套全新的进程号体系,让你以为自己是系统一号进程。
8.1.3 体验三:看看容器里的文件系统
在哪操作 :容器内部终端 执行命令:
bash
ls /
做了什么:查看根目录下的文件
预期效果:你会看到 bin、boot、dev、etc、home 这些标准 Linux 目录,和一台真实的 Ubuntu 机器一模一样。
再看看磁盘:
bash
df -h
你会看到根分区大小和宿主机一样,但这是共享宿主机的磁盘。以后我们可以通过配置限制容器最多用多少磁盘空间。
8.1.4 体验四:看看主机名
在哪操作 :容器内部终端 执行命令:
bash
hostname
做了什么:查看当前主机名
预期效果 :输出 lxchost1,就是你创建容器时起的名字。容器以为自己叫这个,完全不知道宿主机真名叫啥。
这就是 UTS Namespace 在起作用。
8.1.5 退出容器
体验完了,输入 exit 回车,就回到宿主机终端了。
8.2 方式二:用 lxc-attach 直接钻进去
除了 SSH,还有一种更直接的方式,不用输密码,一步到位。
在哪操作 :宿主机终端 执行命令:
bash
lxc-attach -n lxchost1
做了什么:直接进入指定容器,默认以 root 身份打开一个 shell
预期效果:提示符直接变成容器内的 root 提示符,你已经在容器里了。
咱们在容器里执行一条命令试试:
bash
echo "Hello bit"
预期效果 :屏幕输出 Hello bit。
输入 exit 退回宿主机。
小技巧:还可以不进去,直接在外面让容器执行命令:
bashlxc-attach -n lxchost1 --clear-env -- echo "Hello bit"效果是一样的,适合写脚本的时候用。
9、第七步:停止和删除容器
玩够了咱们收拾一下,有始有终。
9.1 停止容器
在哪操作 :宿主机终端 执行命令:
bash
lxc-stop -n lxchost1
做了什么:优雅地关闭容器,相当于正常关机
验证一下:
bash
lxc-ls -f
预期效果 :STATE 又变回了 STOPPED,IP 地址也消失了。
9.2 删除容器
注意:容器必须是停止状态才能删,正在运行的删不掉。
在哪操作 :宿主机终端 执行命令:
bash
lxc-destroy -n lxchost1
做了什么:彻底删除容器,包括它的 rootfs 和配置文件,全部清干净
验证一下:
bash
lxc-ls -f
预期效果:什么都不输出,空空如也,说明容器已经被完全删除了。
10、复盘总结:你到底学会了啥?
敲了这么多命令,咱们回头捋一捋,把知识点串起来。
10.1 容器隔离的本质
今天你亲手验证了 Linux 容器的六大隔离:
- PID 隔离:容器里有自己的 1 号进程,看不到宿主机进程
- 网络隔离:容器有自己独立的网卡、IP、端口
- 主机名隔离:容器有自己的 hostname
- 文件系统隔离:容器有自己的根目录 /
- 用户隔离:容器里的 root 和宿主机的 root 不是一回事
- 进程间通信隔离:容器之间不能直接发消息
这六个,就是 Namespace 干的活。
10.2 资源控制的本质
你用 lxc-info 看到的 CPU、内存、磁盘 IO 使用量,背后都是 Cgroups 在统计和管控。
- 想限制容器最多用 512M 内存?Cgroups 能做到
- 想限制容器只能用 20% 的 CPU?Cgroups 能做到
- 想限制容器磁盘读写速度?Cgroups 也能做到
这些就是 Linux 资源控制的核心能力,Docker、Kubernetes 这些花里胡哨的容器工具,底层全靠这俩东西撑着。
10.3 常用命令速查表
最后给你整理一份懒人清单,忘了就回来翻:
表格
| 命令 | 作用 |
|---|---|
lxc-checkconfig |
检查内核是否支持容器 |
lxc-create -t 模板 -n 名字 |
创建容器 |
lxc-ls -f |
列出所有容器状态 |
lxc-start -n 名字 -d |
后台启动容器 |
lxc-info -n 名字 |
查看容器详细信息 |
lxc-attach -n 名字 |
进入容器 |
lxc-stop -n 名字 |
停止容器 |
lxc-destroy -n 名字 |
删除容器 |
写在最后
看到这里,你已经亲手完成了一次完整的 Linux 容器资源控制实战。从安装工具、检查环境、创建容器、启动、进入体验、到最后停止删除,走完全流程。
你可能会问:既然有 Docker 了,为啥还要学 LXC? 因为 Docker 是 "精装房",开箱即用但很多东西被包起来了,你看不见里面咋回事。而 LXC 是 "毛坯房",能让你清清楚楚看到容器技术最原始的样子。理解了 LXC,你再去学 Docker 就会有一种 "降维打击" 的感觉 ------ 原来不过如此嘛。
接下来你可以试着创建不同系统的容器玩玩,或者研究一下怎么给容器限制 CPU 和内存配额。Linux 的世界很大,慢慢来,你已经迈出了扎实的第一步。