docker(2):docker的“前身”—lxc
这篇文章写了很久了,整理发布吧。更了解容器是什么东西,当时真没想到docker会这么火。
docker(2):docker的“前身”—lxc
https://www.cnblogs.com/along21/p/9184293.html
https://blog.csdn.net/wangtaoking1/article/details/45043523
1. LXC介绍
- Linux Container容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源。
- LXC为Linux Container的简写。可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。相当于C++中的NameSpace。容器有效地将由单个操作系统管理的资源划分到孤立的组中,以更好地在孤立的组之间平衡有冲突的资源使用需求。与传统虚拟化技术相比,它的优势在于:
- 与宿主机使用同一个内核,性能损耗小;
- 不需要指令级模拟;
- 不需要即时(Just-in-time)编译;
- 容器可以在CPU核心的本地运行指令,不需要任何专门的解释机制;
- 避免了准虚拟化和系统调用替换中的复杂性;
- 轻量级隔离,在隔离的同时还提供共享机制,以实现容器与宿主机的资源共享。
总结:Linux Container是一种轻量级的虚拟化的手段。
Linux Container(namespace命名空间 隔离环境)
Cgroups :限制一个进程使用的资源。CPU,内存,磁盘IO等。类似于虚拟机的资源限制(1c,2g,20g这种)
- Linux Container提供了在单一可控主机节点上支持多个相互隔离的server container同时执行的机制。Linux Container有点像chroot,提供了一个拥有自己进程和网络空间的虚拟环境,但又有别于虚拟机,因为lxc是一种操作系统层次上的资源的虚拟化。
- LXC与docker的关系
Docker并不是LXC的替代品,Docker的底层就是使用了LXC来实现的。LXC将Linux进程沙盒化,使得进程之间相互隔离,并且能够控制各进程的资源分配。
在LXC的基础之上,Docker提供了一系列更强的功能。
- Ø 可移植性
Docker定义了一种新的格式,将应用和其依赖环境全部打包到一个单一对象中,这个对象可以在任何安装有Docker的机器上共享,在任何机器上执行这个对象的效果都是一样的。LXC仅仅实现了进程沙盒化,并不能在不同机器上进行移植。Docker将应用的所有配置进行抽象,打包到一个容器中,使得该容器具有可移植性。
- Ø 以应用为中心
Docker针对应用的部署做了优化,反映在其API,用户接口,设计原理及文档上面。而LXC仅仅关注容器作为一个轻量级的服务器。
- Ø 自动化构建
Docker中支持Dockerfile,将应用的所有依赖项,构建工具和包都以源码的形式写在Dockerfile中,然后Docker可以根据Dockerfile构建镜像。该镜像在任何机器上面运行的效果都一样。
- Ø 版本控制
Docker对容器提供了类git的版本控制功能,支持版本回滚等功能。Docker也实现了增量上传和下载的功能,节约了上传和下载时的带宽资源。
- Ø 组件重用
一个镜像可以作为基础镜像来创建更多特定的镜像,镜像之间支持多层重用。
- Ø 镜像共享
Docker开发了一个Docker Hub,里面包含了各种常用的镜像,非常方便,我们也可以将自己的镜像上传到Docker Hub中。用户也可以在私有环境中搭建自己的Docker仓库,用来满足镜像的内部共享。
- Ø 工具生态系统
Docker定义了一个API,用于自动化和本地化容器的创建和部署。已经存在大量的集成了Docker的工具集,例如Deis,mesos,docker-ui,jenkins等等。
2. LXC安装和使用
2.1 安装epel源
yum install epel-release -y
2.2编译epel源配置文件
#sudo vim /etc/yum.repos.d/epel.repo [epel] name=Extra Packages for Enterprise Linux 7 - $basearch baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/$basearch #mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch failovermethod=priority enabled=1 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 [epel-debuginfo] name=Extra Packages for Enterprise Linux 7 - $basearch - Debug baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/$basearch/debug #mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-debug-7&arch=$basearch failovermethod=priority enabled=0 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 gpgcheck=1 [epel-source] name=Extra Packages for Enterprise Linux 7 - $basearch - Source baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/SRPMS #mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-source-7&arch=$basearch failovermethod=priority enabled=0 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 gpgcheck=1
2.3 安装
2.3.1 安装lxc
sudo yum install lxc-* -y sudo yum install libcgroup* -y sudo yum install bridge-utils.x86_64 -y
2.3.2 检测安装lxc-checkconfig
[admin@pe-jira ~]$ sudo lxc-checkconfig Kernel configuration not found at /proc/config.gz; searching... Kernel configuration found at /boot/config-3.10.0-123.el7.x86_64 --- Namespaces --- Namespaces: enabled Utsname namespace: enabled Ipc namespace: enabled Pid namespace: enabled User namespace: enabled newuidmap is not installed
2.3.3 创建一个lxc
lxc-create -n c1 -t /usr/share/lxc/templates/lxc-centos
2.3.4 查看修改lxc密码
cat /var/lib/lxc/c1/tmp_root_pass #查询密码 chroot /var/lib/lxc/c1/rootfs passwd #修改密码
2.4 开启lxc容器
2.4.1 尝试启动
lxc-start -n c1
lxc-start: conf.c: instantiate_veth: 3115 failed to attach 'veth51EVP7' to the bridge 'virbr0': No such device lxc-start: conf.c: lxc_create_network: 3407 failed to create netdev lxc-start: start.c: lxc_spawn: 875 failed to create the network lxc-start: start.c: __lxc_start: 1149 failed to spawn 'c1' lxc-start: lxc_start.c: main: 336 The container failed to start. lxc-start: lxc_start.c: main: 340 Additional information can be obtained by setting the --logfile and --logpriority options.
2.4.2 创建网桥
- 下包
yum install bridge-utils -y
- 查看网桥信息
brctl show
- 创建virbr0 网桥
brctl addbr virbr0
- 查看网桥创建成功
ip a |grep virbr0
- 激活网桥
ip link set dev virbr0 up ip a #查询是否激活
- 配置网桥地址
ip addr add 10.1.0.1/24 dev virbr0
2.4.3 启动/登录
2.4.3.1 登录
2.4.3.2 添加ip 地址与宿主机相通
ip addr add 10.1.0.2/24 dev eth0
2.5 开启第2台容器
- 创建c2
lxc-create -n c2 -t /usr/share/lxc/templates/lxc-centos
- 改密码
chroot /var/lib/lxc/c2/rootfs passwd
- 登录
lxc-start -n c2
- 添加ip 地址10.1.0.3
ip addr add 10.1.0.3/24 dev eth0
- 测试与宿主机和另一台容器c1 的连通
[root@c2 ~]# ping 10.1.0.1 PING 10.1.0.1 (10.1.0.1) 56(84) bytes of data. 64 bytes from 10.1.0.1: icmp_seq=1 ttl=64 time=0.560 ms --- 10.1.0.1 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 0.560/0.560/0.560/0.000 ms [root@c2 ~]# ping 10.1.0.2 PING 10.1.0.2 (10.1.0.2) 56(84) bytes of data. 64 bytes from 10.1.0.2: icmp_seq=1 ttl=64 time=0.147 ms 64 bytes from 10.1.0.2: icmp_seq=2 ttl=64 time=0.100 ms --- 10.1.0.2 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 999ms rtt min/avg/max/mdev = 0.100/0.123/0.147/0.026 ms [root@c2 ~]#
2.6 在宿主机上,查询容器状况lxc-top
2.7 使容器联通外网
2.7.1 在宿主机 配置 NAT规则
- 打开核心转发
sysctl -w net.ipv4.ip_forward=1
- 做NAT 规则
iptables -t nat -A POSTROUTING -s 10.1.0.0/24 -j SNAT --to-source 192.168.0.136
2.7.2 在两个容器内添加网关
ip route add default via 10.1.0.1 #添加网关 ip route sh #查询网关 ping www.baidu.com #测试网关是否生效
[root@c1 ~]# ping www.baidu.com PING www.a.shifen.com (220.181.38.149) 56(84) bytes of data. 64 bytes from 220.181.38.149 (220.181.38.149): icmp_seq=1 ttl=50 time=24.3 ms 64 bytes from 220.181.38.149 (220.181.38.149): icmp_seq=2 ttl=50 time=26.8 ms --- www.a.shifen.com ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1002ms rtt min/avg/max/mdev = 24.386/25.629/26.872/1.243 ms
2.8 LXC的web管理页面
2.8.1 下载git 项目
git clone https://github.com/lxc-webpanel/LXC-Web-Panel.git
2.8.2 使用pip安装flask
#需要安装pip #有时需要升级 python -m pip install --upgrade pip pip install flask pip3 install flask
2.8.3 开启lxc web管理页面的服务
cd LXC-Web-Panel/ python lwp.py
默认用户密码:admin/admin
容器的控制;开启,关闭,创建/克隆/重启容器,调节容器资源限制... ...
2.9 lxc简单操作命令
lxc-checkconfig:
检查系统环境是否满足容器使用要求;
lxc-create:创建lxc容器;
lxc-create -n NAME -t TEMPLATE_NAME
lxc-start:启动容器;
lxc-start -n NAME -d
lxc-stop:停止容器;(停止命令很慢)
lxc-stop -n NAME –d
lxc-attach -n c1:登录
lxc-info:查看容器相关的信息;
lxc-info -n NAME
lxc-destory:删除处于停机状态的容器;
lxc-snapshot:创建和恢复快照;