因为自己比较鶸,所以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的所有配置都在这儿