lxc的使用
因为自己比较鶸,所以blog里面肯定会有很多error和warning,大佬们看到了希望能够提醒一下,在下不胜感激
lxc和lxd
lxc
lxc是指Linux Container,是一种轻量级的虚拟化,它与一般的虚拟机最大的不同就在于:
- 容器中的系统与宿主机使用同一个内核,性能损耗小;
- 不需要指令级模拟;
- 不需要即时(Just-in-time)编译;
- 容器可以在CPU核心的本地运行指令,不需要任何专门的解释机制;
- 避免了准虚拟化和系统调用替换中的复杂性;
- 轻量级隔离,在隔离的同时还提供共享机制,以实现容器与宿主机的资源共享。
可以看出来,lxc相对于传统虚拟机最大的优势就在于虚拟化程度低,运行效率高,同时实现了基本的虚拟机的功能,对服务器的备份和运维等非常有利。
而lxc的缺点也正是因为lxc使用了宿主机的内核。如果给予了容器特权,那么容器就有可能对宿主机进行破坏。
lxd
官方文档第一句介绍到:LXD is a container “hypervisor” and a new user experience for LXC.
然后,组成部分:
Specifically, it’s made of three components:
- A system-wide daemon (lxd)
- A command line client (lxc)
- An OpenStack Nova plugin (nova-compute-lxd)
可以看出来,lxd是基于lxc的,用来对lxc中容器进行管理和维护的一个平台。
docker和lxc的区别
lxc内运行的容器基于一个干净的发行版镜像,可以支持长期运行。而docker关注点在临时的、无状态的、最小化容器上面,通常不会升级或重新配置,而是整个被替换掉。因此,docker的通常是一个容器运行一个软件或者服务,lxc容器内可以由用户自定义,灵活性更高。正因如此,lxc的镜像通常会特别大,一般大于1g,而docker的镜像一般500m以下。
本来还想写点docker的。。。看了下资料,发现docker的东西真不少。。。下次吧
如何配置lxc和lxd
1.初始化容器
在初始化之前,你需要装上一些dependence.
apt update
apt install zfs
然后
lxd init
一路回车,按默认配置就行了。
然后就需要添加镜像,原镜像源是国外的,速度你懂的。(可选)
比如添加大清和重邮(内网有加成的哦)的:
lxc remote add <name> <url> [--accept-certificate] [--password=PASSWORD] [--public] [--protocol=PROTOCOL] # usage
lxc remote add tsinghua-mirror https://mirrors.tuna.tsinghua.edu.cn/lxc-images --public
lxc remote add cqupt-mirror https://mirrors.cqupt.edu.cn/lxc-images --public
然后启动时就可以通过国内的镜像源启动:
lxc launch [remote:]<image> [remote:][<name>] [--ephemeral|-e] [--profile|-p <profile>...] [--config|-c <key=value>...] # usage
lxc launch cqupt-mirror:ubuntu16.04 test-container
配置容器:
lxc config device set <[remote:]container> <name> <key> <value> # usage
lxc config device set test-container limits.memory 1024M # memory
lxc config device set test-container limits.cpu 1 # cpu
运行/停止容器:
lxc start test-container
lxc stop test-container
lxc restart test-container
在容器和宿主之前复制文件:
lxc file pull <source> [<source>...] <target> # pull file from container
lxc file push [--uid=UID] [--gid=GID] [--mode=MODE] <source> [<source>...] <target> # push file into container
lxc file pull test-container/root/.ssh/authorized_keys . # pull file /root/.ssh/authorized_keys in container to current dir
lxc file push authorized_keys test-container/root/.ssh/ . # push file authorized_keys into container/root/.ssh/
注意push进容器后文件的权限,有些文件(比如.ssh/authorized_keys)权限不对是会炸的
配置profile,就不用每次都去单独配置每个容器了:
lxc profile create test
lxc profile edit test
在容器中执行命令:
lxc exec test-container bash
这样你就直接在容器内的shell里了。
实战
在容器内搭建web服务器:
lxc launch cqupt-mirror:ubuntu16.04 lnmp
lxc config device set lnmp limits.memory 1024M
lxc config device set lnmp limits.cpu 1
lxc exec bash
然后现在就在容器内了
后面就是搭建web服务器的过程了,跳过。
如果你之前直接将虚拟网卡桥接到与主机同一局域网下,容器会分配到一个独立ip,直接ifconfig
找到ip,访问这个ip就可以了。
如果你是直接建立的虚拟网桥,需要在宿主机上添加iptables规则,也就是NAT:
iptables -t nat -A PREROUTING -d host_ip -p tcp --dport 80 -j DNAT --to-destination container_ip:80 # replace host_ip and aontainer_ip with yours
PS:lxc的所有配置都在这儿