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介绍

  1. Linux Container容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源。
  2. LXC为Linux Container的简写。可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。相当于C++中的NameSpace。容器有效地将由单个操作系统管理的资源划分到孤立的组中,以更好地在孤立的组之间平衡有冲突的资源使用需求。与传统虚拟化技术相比,它的优势在于:
  • 与宿主机使用同一个内核,性能损耗小;
  • 不需要指令级模拟;
  • 不需要即时(Just-in-time)编译;
  • 容器可以在CPU核心的本地运行指令,不需要任何专门的解释机制;
  • 避免了准虚拟化和系统调用替换中的复杂性;
  • 轻量级隔离,在隔离的同时还提供共享机制,以实现容器与宿主机的资源共享。

总结:Linux Container是一种轻量级的虚拟化的手段。

Linux Container(namespace命名空间 隔离环境)

Cgroups :限制一个进程使用的资源。CPU,内存,磁盘IO等。类似于虚拟机的资源限制(1c,2g,20g这种)

  1. Linux Container提供了在单一可控主机节点上支持多个相互隔离的server container同时执行的机制。Linux Container有点像chroot,提供了一个拥有自己进程和网络空间的虚拟环境,但又有别于虚拟机,因为lxc是一种操作系统层次上的资源的虚拟化。
  2. 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:创建和恢复快照;

 

posted on 2019-08-06 13:40  光阴8023  阅读(530)  评论(0编辑  收藏  举报