[docker基础四]容器虚拟化基础之 LXC
目录
一 认识LXC
二 LXC容器操作实战
1)实战目的
2)基础知识
lxc-checkconfig
lxc-create
lxc-start
lxc-ls
lxc-info
lxc-attach
lxc-stop
lxc-destory
3)安装LXC(我的是Ubuntu)
4)操作实战
1. 检查 lxc 是否运行
2. 检查 lxc 的功能支持情况
3. 查看 lxc 提供的容器模板
4. 创建一个 lxc 虚拟主机,这个命令就会下载安装指定环境下的软件包,创建新容器。 整个过程需要时间较长,与容器的类型有关
5. 下载安装完所有软件包后,LXC 容器镜像就创建完成了,你可以看到默认的登录 界面。容器被放到 /var/lib/lxc/ 这个目录下,容器的根文件系统放在 /var/lib/lxc//rootfs 目录下。创建过程中下载的软件包保存在 /var/cache/lxc 目 录下面,当你想另外建一个一样的容器时,可以省去很多下载时间。
6. 查看创建的容器信息
7. 启动容器,我们可以看到容器状态为运行中
8. 查看容器的详细信息
9. 容器 ip 为 10.0.3.248,我们通过 ssh 进入容器,查看 ip 地址,磁盘挂载信息,目 录信息和宿主机都不一样
10. 在容器外面执行命令
11. 停止容器
12. 删除容器
一 认识LXC
LXC 是什么?
LXC(LinuX Containers)Linux 容器,一种操作系统层虚拟化技术,为 Linux 内核容 器功能的一个用户空间接口。它将应用软件系统打包成一个软件容器(Container), 内含应用软件本身的代码,以及所需要的操作系统核心和库。透过统一的名字空间和 共享 API 来分配不同软件容器的可用硬件资源,创造出应用程序的独立沙箱运行环境, 使得 Linux 用户可以容易的创建和管理系统或应用容器。 LXC 是最早一批真正把完整的容器技术用一组简易使用的工具和模板来极大的简化了 容器技术使用的一个方案 LXC 虽然极大的简化了容器技术的使用,但比起直接通过内核调用来使用容器技术, 其复杂程度其实并没有多大降低,因为我们必须要学会 LXC 的一组命令工具,且由于 内核的创建都是通过命令来实现的,通过批量命令实现数据迁移并不容易。其隔离性 也没有虚拟机那么强大。 后来就出现了 docker,所以从一定程度上来说,docker 就是 LXC 的增强版。
二 LXC容器操作实战
1)实战目的
通过 lxc 来完成容器的创建,体会容器,并了解 docker 并不是容器的唯一实现。自 docker 0.9 版本起,docker 除了继续支持 LXC 外,还开始引入自家的 libcontainer, 试图打造更通用的底层容器虚拟化库。如今的 docker 基本上都已经是使用 libcontainer 而非 LXC 了。
2)基础知识
LXC 的常用命令如下:
lxc-checkconfig
检查系统环境是否满足容器使用要求;
格式: lxc-checkconfig
lxc-create
创建 lxc 容器;
格式: lxc-create -n NAME -t TEMPLATE_NAME [-- template-options]
lxc-start
启动容器;
格式: lxc-start -n NAME -d
lxc-ls
列出所有容器,-f 表示打印常用的信息 ;
格式: lxc-ls -f
lxc-info
查看容器相关的信息;
格式: lxc-info -n NAME
lxc-attach
进入容器执行命令;
格式: lxc-attach --name=NAME [-- COMMAND]
lxc-stop
停止容器;
格式: lxc-stop -n NAME
lxc-destory
删除处于停机状态的容器;
格式: lxc-destory -n NAME
3)安装LXC(我的是Ubuntu)
安装前执行检查看下是否需要卸载,如果需要卸载,执行下面的命令完成卸载,不需 要直接到第 2 步
#一、安装
#lxc 主程序包
#lxc-templates lxc 的配置模板
#bridge-utils 网桥管理工具
apt install lxc lxc-templates bridge-utils -y
#二、检查服务是否正常运行
systemctl status lxc
4)操作实战
1. 检查 lxc 是否运行
2. 检查 lxc 的功能支持情况
3. 查看 lxc 提供的容器模板
4. 创建一个 lxc 虚拟主机,这个命令就会下载安装指定环境下的软件包,创建新容器。 整个过程需要时间较长,与容器的类型有关
#创建 Ubuntu LXC 容器,-t 指定模板容器,-n 指定要创建的容器名,下面创建
的是 ubuntu
#Centos 上创建 centos 的命令:lxc-create -t centos --name centos1 --
--release 7 --arch x86_64
#Ubuntu 上创建 centos 的命令,注意模板需要使用 download:lxc-create --
name centos7 --template=download -- --dist=centos --release=7 --
arch=amd64
root@139-159-150-152:/var/run/docker/netns# lxc-create -t ubuntu -
-name lxchost1 -- -r xenial -a amd64
#
#创建完成显示
##
# The default user is 'ubuntu' with password 'ubuntu'!
# Use the 'sudo' command to run tasks as root in the container.
##
5. 下载安装完所有软件包后,LXC 容器镜像就创建完成了,你可以看到默认的登录 界面。容器被放到 /var/lib/lxc/ 这个目录下,容器的根文件系统放在 /var/lib/lxc//rootfs 目录下。创建过程中下载的软件包保存在 /var/cache/lxc 目 录下面,当你想另外建一个一样的容器时,可以省去很多下载时间。
root@139-159-150-152:/var/run/docker/netns# ll
/var/lib/lxc/lxchost1/
total 16
drwxrwx--- 3 root root 4096 Mar 17 11:44 ./
drwx------ 3 root root 4096 Mar 17 11:34 ../
-rw-r----- 1 root root 679 Mar 17 11:44 config
drwxr-xr-x 17 root root 4096 Mar 17 11:42 rootfs/
root@139-159-150-152:/var/run/docker/netns# ll /var/cache/lxc/
total 12
drwx------ 3 root root 4096 Mar 17 11:34 ./
drwxr-xr-x 19 root root 4096 Mar 17 11:27 ../
drwxr-xr-x 3 root root 4096 Mar 17 11:44 xenial/
6. 查看创建的容器信息
root@139-159-150-152:/var/run/docker/netns# lxc-ls -f
NAME STATE AUTOSTART GROUPS IPV4 IPV6 UNPRIVILEGED
lxchost1 STOPPED 0 - - - false
STOPPED表示容器只是创建出来但是还没启动
7. 启动容器,我们可以看到容器状态为运行中
root@139-159-150-152:/var/run/docker/netns# lxc-start -n lxchost1
-d
root@139-159-150-152:/var/run/docker/netns# lxc-ls -f
NAME STATE AUTOSTART GROUPS IPV4 IPV6 UNPRIVILEGED
lxchost1 RUNNING 0 - 10.0.3.248 - false
容器状态由 STIPPED ->RUNNING 从停止变成运行中
8. 查看容器的详细信息
root@139-159-150-152:/var/run/docker/netns# lxc-info -n lxchost1
Name: lxchost1
State: RUNNING
PID: 282127
IP: 10.0.3.248
CPU use: 0.59 seconds
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
Total bytes: 8.33 KiB
9. 容器 ip 为 10.0.3.248,我们通过 ssh 进入容器,查看 ip 地址,磁盘挂载信息,目 录信息和宿主机都不一样
root@139-159-150-152:/var/run/docker/netns# ssh ubuntu@10.0.3.248
ubuntu@10.0.3.248's password:
ubuntu@lxchost1:~$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state
UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: eth0@if562: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc
noqueue state UP group default qlen 1000link/ether 00:16:3e:71:d8:3d brd ff:ff:ff:ff:ff:ff linknetnsid 0inet 10.0.3.248/24 brd 10.0.3.255 scope global dynamic eth0valid_lft 2844sec preferred_lft 2844secinet6 fe80::216:3eff:fe71:d83d/64 scope link valid_lft forever preferred_lft forever
ubuntu@lxchost1:~$ uname -a
Linux lxchost1 5.4.0-100-generic #113-Ubuntu SMP Thu Feb 3
18:43:29 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
ubuntu@lxchost1:~$ ll /
total 52
drwxr-xr-x 17 root root 4096 Mar 17 03:51 ./
drwxr-xr-x 17 root root 4096 Mar 17 03:51 ../
lrwxrwxrwx 1 root root 7 Mar 17 03:40 bin -> usr/bin/
drwxr-xr-x 2 root root 4096 Apr 15 2020 boot/
drwxr-xr-x 7 root root 540 Mar 17 03:51 dev/
drwxr-xr-x 63 root root 4096 Mar 17 03:51 etc/
drwxr-xr-x 3 root root 4096 Mar 17 03:44 home/
lrwxrwxrwx 1 root root 7 Mar 17 03:40 lib -> usr/lib/
lrwxrwxrwx 1 root root 9 Mar 17 03:40 lib32 -> usr/lib32/
lrwxrwxrwx 1 root root 9 Mar 17 03:40 lib64 -> usr/lib64/
lrwxrwxrwx 1 root root 10 Mar 17 03:40 libx32 -> usr/libx32/
drwxr-xr-x 2 root root 4096 Mar 17 03:40 media/
drwxr-xr-x 2 root root 4096 Mar 17 03:40 mnt/
drwxr-xr-x 2 root root 4096 Mar 17 03:40 opt/
dr-xr-xr-x 225 root root 0 Mar 17 03:51 proc/
drwx------ 2 root root 4096 Mar 17 03:40 root/
drwxr-xr-x 13 root root 420 Mar 17 04:04 run/
lrwxrwxrwx 1 root root 8 Mar 17 03:40 sbin -> usr/sbin/
drwxr-xr-x 2 root root 4096 Mar 17 03:40 srv/
dr-xr-xr-x 13 root root 0 Mar 17 03:51 sys/
drwxrwxrwt 9 root root 4096 Mar 17 04:04 tmp/
drwxr-xr-x 13 root root 4096 Mar 17 03:40 usr/
drwxr-xr-x 11 root root 4096 Mar 17 03:40 var/
ubuntu@lxchost1:~$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 40G 21G 17G 57% /
none 492K 4.0K 488K 1% /dev
tmpfs 992M 0 992M 0% /dev/shm
tmpfs 199M 108K 199M 1% /run
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 992M 0 992M 0% /sys/fs/cgroup
tmpfs 199M 0 199M 0% /run/user/1000
ubuntu@lxchost1:~$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 03:51 ? 00:00:00 /sbin/init
root 44 1 0 03:51 ? 00:00:00
/lib/systemd/systemd-journald
systemd+ 72 1 0 03:51 ? 00:00:00
/lib/systemd/systemd-networkd
root 76 1 0 03:51 ? 00:00:00 /usr/sbin/cron
-f
message+ 77 1 0 03:51 ? 00:00:00 /usr/bin/dbusdaemon --system --address=systemd: --nofork --nopidfile --systemdactivation --syslog-only
root 79 1 0 03:51 ? 00:00:00
/usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup
triggers
syslog 80 1 0 03:51 ? 00:00:00
/usr/sbin/rsyslogd -n -iNONE
root 81 1 0 03:51 ? 00:00:00
/lib/systemd/systemd-logind
systemd+ 82 1 0 03:51 ? 00:00:00
/lib/systemd/systemd-resolved
root 88 1 0 03:51 pts/0 00:00:00 /sbin/agetty -
o -p -- \u --noclear --keep-baud console 115200,38400,9600 vt220
root 89 1 0 03:51 ? 00:00:00 sshd:
/usr/sbin/sshd -D [listener] 0 of 10-100 startups
root 163 89 0 04:03 ? 00:00:00 sshd: ubuntu
[priv]
ubuntu 166 1 0 04:04 ? 00:00:00
/lib/systemd/systemd --user
ubuntu 167 166 0 04:04 ? 00:00:00 (sd-pam)
ubuntu 182 163 0 04:04 ? 00:00:00 sshd:
ubuntu@pts/5
ubuntu 183 182 0 04:04 pts/5 00:00:00 -bash
ubuntu 196 183 0 04:04 pts/5 00:00:00 ps -ef
10. 在容器外面执行命令
root@139-159-150-152:/var/run/docker/netns# lxc-attach -n lxchost1
--clear-env -- echo "Hello bit"
Hello bit
11. 停止容器
root@139-159-150-152:/var/run/docker/netns# lxc-stop -n lxchost1
root@139-159-150-152:/var/run/docker/netns# lxc-ls -f
NAME STATE AUTOSTART GROUPS IPV4 IPV6 UNPRIVILEGED
lxchost1 STOPPED 0 - - - false
12. 删除容器
root@139-159-150-152:/var/run/docker/netns# lxc-destroy -n
lxchost1
root@139-159-150-152:/var/run/docker/netns# lxc-ls -f
root@139-159-150-152:/var/run/docker/netns#
变成 STOPPED 状态只是停止运行,想要彻底销毁还是需要 destory 命令