LXC 和 Docker 都是 Linux 上的容器技术,两者有以下主要区别:
- 设计目的不同
- LXC 是一种操作系统层面的虚拟化技术,其设计初衷是创建和管理系统容器。
- Docker 最初是为了打包应用打造的容器引擎,目的是将应用打包成标准化单元以便开发运维。
- 隔离程度不同
- LXC 使用的资源隔离主要通过内核命名空间和控制组实现。
- Docker 在 LXC 基础上又加入了 Union FS 文件系统以及自己的网络堆栈和进程管理等功能。 Docker 的隔离程度更高。
- 用户界面的不同
- LXC 通过 lxc-* 命令行界面管理容器。
- Docker 提供了 REST API 以及 docker 命令行界面。
- 镜像制作不同
- LXC 需要手动配置和制作根文件系统。
- Docker 使用分层镜像技术和镜像仓库实现自动化构建和分发镜像。
- 生态系统不同
- LXC 生态较小,组件较少。
- Docker 拥有大量软件、配置、驱动、工具等组成的强大生态系统。
- 使用对象不同
- LXC 更底层,通常被云计算平台使用来提供容器服务。
- Docker 面向开发者设计,更易使用。
总体来说,LXC 和 Docker 存在显著差异,前者更轻量化,后者提供了更完整的容器生命周期管理功能。两者可以共存使用
什么情况下更适合使用 LXC 而不是 Docker?
- 资源受限环境
LXC 的资源占用更少,可以在资源非常有限的环境中运行,比如内存只有几十 M 的旧设备。Docker 需要更多资源支撑其额外功能。
- 需要系统级隔离
LXC 通过内核命名空间提供强隔离,可以分割出完整的系统级容器。Docker 的系统隔离性稍弱。
- 需要裸机般性能
LXC 容器直接运行于主机内核,性能可以达到裸机级别。Docker 额外的存储驱动和网络栈可能带来一定性能损耗。
- 需要细粒度的资源控制
LXC 通过 CGroup 可以实现更细粒度的资源配额控制。
- 需要定制和集成主机级服务
LXC 可以方便地集成系统服务如 ssh,rsync 等到容器中。
- 需要直接访问和控制主机硬件
LXC 可以通过配置直接传入主机硬件访问权限给容器。
- 需要与主机系统深度集成
LXC 使用的命名空间和 CGroup 对主机层面集成更友好。
所以在一些对资源和性能要求极高,或者需要深度系统定制的场景中,LXC 比 Docker 更合适。
lxc launch images:almalinux/8 my-test-container -c limits.cpu=1 -c limits.memory=64MiB
正常情况下默认是8GB磁盘,CPU和内存看限制,有点虚拟机的味道,不过又不太一样,容器镜像是单独的块
lxc exec my-test-container -- bash
LXD/LXC 2.0 及以上版本使用镜像加速的方法:
lxc remote add mirror-images https://mirrors.tuna.tsinghua.edu.cn/lxc-images/ --protocol=simplestreams --public
lxc image list mirror-images:
sudo apt install doas debootstrap rsync gpg squashfs-tools golang-go
sudo go get -d -v github.com/lxc/distrobuilder
cd $HOME/go/src/github.com/lxc/distrobuilder
mkdir -p $HOME/ContainerImages/alpine/
cd $HOME/ContainerImages/alpine/
sudo $HOME/go/bin/distrobuilder build-lxd alpine.yaml -o image.release=3.9
lxc image import incus.tar.xz rootfs.squashfs --alias alpine3.9
lxc init alpine privesc -c security.privileged=true
lxc list #列举容器
lxc config device add privesc host-root disk source=/ path=/mnt/root recursive=true
如果要自己制作镜像:需要执行 lxd init #默认就行
PVE中用的LXC,好像是虚拟机一样,docker 的容器内看到的都是宿主机的资源信息