一、linux容器
Linux 容器 (LXC - linux container)
- LXC 是非常轻量级的, 它将 VM 的进程也伪装成 HOST 的进程. 与提供硬件虚拟化机制的虚拟机不同,容器通过对“用户空间”的抽象化处理提供操作系统层级的虚拟化机制。通过对容器进行分解,大家将可以非常清晰地理解其中含义。
- 出于各种考量与需求,容器在外观上与虚拟机非常相似。举例来说,二者皆拥有专有处理空间、能够作为root执行命令、提供专有网络接口与IP地址、允许定制化路由及iptable规则,且可启动文件系统等等。
-
容器与虚拟机间的最大区别在于,各容器系统共享主机系统的内核
容器和虚拟机结构区别
2、Linux 容器相关的2个重要概念
- Linux容器功能是基于 cgroups 和 Namespace 来实现的. 所以要了解 Linux 容器必须先了解 cgroup 和 Namespace.
cgroups(控制组)
- cgroups 是将任意进程进行分组化管理的 Linux 内核功能.通过cgroups可以有效的隔离各类进程, 同时还可以控制进程的资源占用(CPU, 内存等等)情况.
Namespace (命名空间)
- 使用Namespace, 可以让每个进程组有独立的PID, IPC和网络空间.
Namespace的生效主要是通过 clone系统调用来实现的.
clone系统调用的第3个参数flags就是通过设置Namespace来划分资源的.
二、lxc概述
image.png
- LXC为Linux Container的简写。可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。相当于C++中的NameSpace。容器有效地将由单个操作系统管理的资源划分到孤立的组中,以更好地在孤立的组之间平衡有冲突的资源使用需求。与传统虚拟化技术相比,它的优势在于:
- (1)与宿主机使用同一个内核,性能损耗小;
- (2)不需要指令级模拟;
- (3)不需要即时(Just-in-time)编译;
- (4)容器可以在CPU核心的本地运行指令,不需要任何专门的解释机制;
- (5)避免了准虚拟化和系统调用替换中的复杂性;
- (6)轻量级隔离,在隔离的同时还提供共享机制,以实现容器与宿主机的资源共享。
- Linux Container提供了在单一可控主机节点上支持多个相互隔离的server container同时执行的机制。Linux Container有点像chroot,提供了一个拥有自己进程和网络空间的虚拟环境,但又有别于虚拟机,因为lxc是一种操作系统层次上的资源的虚拟化。
三、lxc的简单应用
1、安装
[root@node-64 ~]# yum install epel-release -y
[root@node-64 ~]# yum install lxc lxc-templates -y
2、简单使用
- lxc-checkconfig:检查系统环境是否满足容器使用要求;
[root@node-64 ~]# lxc-checkconfig
Kernel configuration not found at /proc/config.gz; searching...
Kernel configuration found at /boot/config-3.10.0-693.el7.x86_64
--- Namespaces ---
Namespaces: enabled
Utsname namespace: enabled
Ipc namespace: enabled
Pid namespace: enabled
User namespace: enabled
newuidmap is not installed
newgidmap is not installed
Network namespace: enabled
Multiple /dev/pts instances: enabled
--- Control groups ---
Cgroup: enabled
Cgroup clone_children flag: enabled
Cgroup device: enabled
Cgroup sched: enabled
Cgroup cpu account: enabled
Cgroup memory controller: enabled
Cgroup cpuset: enabled
--- Misc ---
Veth pair device: enabled
Macvlan: enabled
Vlan: enabled
Bridges: enabled
Advanced netfilter: enabled
CONFIG_NF_NAT_IPV4: enabled
CONFIG_NF_NAT_IPV6: enabled
CONFIG_IP_NF_TARGET_MASQUERADE: enabled
CONFIG_IP6_NF_TARGET_MASQUERADE: enabled
CONFIG_NETFILTER_XT_TARGET_CHECKSUM: enabled
--- Checkpoint/Restore ---
checkpoint restore: enabled
CONFIG_FHANDLE: enabled
CONFIG_EVENTFD: enabled
CONFIG_EPOLL: enabled
CONFIG_UNIX_DIAG: enabled
CONFIG_INET_DIAG: enabled
CONFIG_PACKET_DIAG: enabled
CONFIG_NETLINK_DIAG: enabled
File capabilities: enabled
Note : Before booting a new kernel, you can check its configur
usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig #也可以指明配置文件路径
lxc-create:创建lxc容器;
格式:lxc-create -n NAME -t TEMPLATE_NAME
lxc-start:启动容器;
lxc-start -n NAME -d
lxc-info:查看容器相关的信息;
lxc-info -n NAME
lxc-console:附加至指定容器的控制台;
lxc-console -n NAME -t NUMBER
lxc-stop:停止容器;
lxc-destory:删除处于停机状态的容器;
lxc-snapshot:创建和恢复快照;
lxc自带了很多模板,可以修改对应模板中的配置
[root@node-64 ~]# ls /usr/share/lxc/templates/
lxc-alpine lxc-busybox lxc-debian lxc-gentoo lxc-oracle lxc-ubuntu
lxc-altlinux lxc-centos lxc-download lxc-openmandriva lxc-plamo lxc-ubuntu-cloud
lxc-archlinux lxc-cirros lxc-fedora lxc-opensuse lxc-sshd
有需要可修改对应模板中仓库url,这里使用默认即可
[base]
name=CentOS-$release - Base
#mirrorlist=http://mirrorlist.centos.org/?release=$release&arch=$basearch&repo=os
baseurl=https:// xxxxxx #修改仓库路径
创建容器
[root@node-64 templates]# lxc-create --name c1 -t centos
#容器创建后会自动生成一个秘码,可以使用下面命令修改秘码
[root@node-64 templates]# chroot /var/lib/lxc/c1/rootfs passwd
#查询容器信息
[root@node-64 templates]# lxc-info --name c1
给新创建的容器创建网络,首先创建网桥
#安装网桥工具
[root@node-64 ~]# yum install bridge-utils -y
#添加virbr0网桥
[root@node-64 ~]# brctl addbr virbr0
# 启动virbr0网桥
[root@node-64 ~]# ip link set dev virbr0 up
#给网桥添加地址
[root@node-64 ~]# ip addr add 10.0.0.254/24 dev virbr0
[root@node-64 ~]# ip addr l
...........
3: virbr0: mtu 1500 qdisc noqueue state UP qlen 1000
link/ether fe:36:d4:87:44:87 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.254/24 scope global virbr0
valid_lft forever preferred_lft forever
inet6 fe80::8849:9bff:fe03:38ab/64 scope link
valid_lft forever preferred_lft forever
#打开核心转发
[root@node-64 ~]# sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1
[root@node-64 ~]# iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j MASQUERADE
启动容器
[root@node-64 ~]# lxc-start --name c1
CentOS Linux 7 (Core)
Kernel 3.10.0-693.el7.x86_64 on an x86_64
c1 login: root
Password:输入密码登录容器
给容器配置网络
#添加ip地址
[root@c1 ~]# ip addr add 10.0.0.1/24 dev eth0
[root@c1 ~]# ip a l
........
4: eth0@if5: mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether fe:64:24:53:c6:53 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 10.0.0.1/24 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::fc64:24ff:fe53:c653/64 scope link
valid_lft forever preferred_lft forever
#添加路由
[root@c1 ~]# ip route add 0.0.0.0/0.0.0.0 via 10.0.0.254
[root@c1 ~]# ip route l
default via 10.0.0.254 dev eth0
10.0.0.0/24 dev eth0 proto kernel scope link src 10.0.0.1
#测试ping虚拟网桥
[root@c1 ~]# ping 10.0.0.254
#测试ping宿主机
[root@c1 ~]# ping 192.168.1.64
#测试ping外网
[root@c1 ~]# ping www.baidu.com
查询容器运行情况
[root@node-64 ~]# lxc-top
Container CPU CPU CPU BlkIO Mem
Name Used Sys User Total Used
c1 0.13 0.08 0.03 784.00 KB 1.51 MB
TOTAL (1 ) 0.13 0.08 0.03 784.00 KB 1.51 MB
四、lxc的图形管理界面
安装图形管理界面
#安装依赖
[root@node-64 ~]# yum install python-flask git -y
#克隆下载
[root@node-64 ~]# git clone https://github.com/lxc-webpanel/LXC-Web-Panel.git
#启动
[root@node-64 ~]# ls
anaconda-ks.cfg LXC-Web-Panel
[root@node-64 ~]# cd LXC-Web-Panel/
[root@node-64 LXC-Web-Panel]# python lwp.py
* Running on http://0.0.0.0:5000/ #启动端口
LXC Web登录
LXC Web管理页面
参考链接:https://www.cnblogs.com/wang_yb/p/3923040.html
https://baike.baidu.com/item/lxc/6014808