第1章 LXC简介
1.1 LXC 基本概念
LinuX Contains 是linux 容器,是操作系统级别的虚拟化技术,它可以提供轻量级的虚拟化、以便隔离进程和资源。
1.1.1 容器的隔离
容器有效地将操作系统管理的资源划分到独立的组中,并把各个独立的组进行隔离,可以让各自的组占用独立的资源,完成自己独立的任务。因为容器最终执行的命令也是调用统一的os api 来实现,是基于整个os 来实现的,(所以不需要单独操作系统的编译系统、执行解释器);一切工作都是基于os 的基础上来完成的。
通过提供一种创建和进入容器的方式,让程序像跑在独立机器那样在容器中运行,并且相互之间不影响,而且还可以共享底层的资源 。
1.1.2 容器的共享
容器提供环境隔离的前提下,还提供了资源共享的机制,所以容器比真正kvm 虚拟机的资源要节省许多。
1.1.3 LXC 的应用
在一台服务器上通过LXC 可以提供多个相互隔离的server contains 同时运行;LXC 通过chroot 提供独立的进程或者网络环境,用namespace 来实现多个容器环境的隔离,用cgroups 实现对每个容器资源的分配和限制。
1.2 LXC 的三个核心的技术
linux contains 的技术是linux 内核的代码,并非Docker 开发出来的,Docker或者其他的虚拟化容器都是基于LXC 的技术,在基础的lxc上包了一层代码,让LXC 更简单、更友好,更加好推广。
下面是LXC 的三个核心技术:
- chroot: 创建一个虚拟的根目录文件系统(实质还是调用底层的文件系统),不过是建立一个虚拟的,可以跟其他容器的虚拟文件系统相互隔离,但共享底层的文件系统。
- namespace : 命名空间可以提供一个进程相互隔离的独立网络空间,不同的容器间进程pid可以相同,进程并不冲突影响,但可以共享底层的计算和存储(cpu + mem)。
- cgroups: 实现了对容器的资源分配和限制,比如给容器1分配10core 30G 内存,那这个容器最多用这么大的资源;如果内存超过30G,会启动swap,效率降低,也可能会被调度系统给kill掉。
1.3 KVM和Docker的对比
- 虚拟化技术对比:
- KVM:全虚拟化,需要模拟各种硬件
- docker:严格来说不算是虚拟化技术,只是进程隔离和资源限制
- 实例启动进程对比:
- 在kvm虚拟机中执行top命令,看宿主机进程树,根本看不到top的进程
- 在docker容器中,同样执行top命令,在宿主机进程数中直接可以看到top进程
- 占用内容资源对比:
- KVM虚拟机一般会独占一段内存,即使闲置,其他虚拟机也无法使用。
- 容器可以只有一个内存上限,没有下限。如果它只使用1MB内存,那么它只占用宿主机1MB内存,宿主机可以将富余内存作为他用。
- 实例的内核对比:
- kvm的虚拟机内核无需与宿主机一致
- docker:实例内核和宿主机内核一致
- 操作系统支持度对比:
- kvm:支持多种操作系统,除了linux,还支持windows,uninx、solaris等
- docker:只支持linux
- 启动一个实例需要的时间对比:
lxc容器技术将操作系统抽象到了一个新的高度。直接从init启动,省去了硬件自检、grub引导、加载内核、加载驱动等传统启动项目,因此启动飞速。
- docker:秒级
- kvm:分钟级别
- 镜像模板占用空间对比:
- kvm:占用空间大
- docker:占用空间小
- 磁盘读写性能对比:
kvm
docker
- 网络性能测试对比:
kvm
docker
综合来说:docker比kvm更省资源,可以提供非常接近宿主机的性能,而kvm资源隔离比docker更高,kvm支持的操作系统类型更多。
参考资料:http://www.qstack.com.cn/archives/148.html
第2章 安装配置LXC
2.1 系统准备
2.1.1 系统环境准备
[[email protected] ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) [[email protected] ~]# uname -r 3.10.0-327.el7.x86_64 [[email protected] ~]# hostname -I 172.16.1.20 10.0.0.20
2.1.2 配置宿主机桥接网卡
[[email protected] ~]# cp /etc/sysconfig/network-scripts/ifcfg-{eth0,br0} [[email protected] ~]# cat > /etc/sysconfig/network-scripts/ifcfg-eth0 < EOF TYPE=Ethernet BOOTPROTO=none NAME=eth0 DEVICE=eth0 ONBOOT=yes BRIDGE=br0 EOF [[email protected] ~]# cat > /etc/sysconfig/network-scripts/ifcfg-br0 < EOF TYPE=Bridge BOOTPROTO=none NAME=br0 DEVICE=br0 ONBOOT=yes DNS1=223.5.5.5 IPADDR=10.0.0.20 PREFIX=24 GATEWAY=10.0.0.254 EOF
2.2 安装LXC
2.2.1 安装epel源
[[email protected] ~]# curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
2.2.2 安装依赖程序
[[email protected] ~]# yum install -y libcgroup* bridge-utiles wget
2.2.3 安装lxc
[[email protected] ~]# yum install -y lxc* [[email protected] ~]# rpm -qa | grep lxc lxc-devel-1.0.11-1.el7.x86_64 python34-lxc-1.0.11-1.el7.x86_64 lua-lxc-1.0.11-1.el7.x86_64 lxc-1.0.11-1.el7.x86_64 lxc-templates-1.0.11-1.el7.x86_64 lxc-doc-1.0.11-1.el7.noarch lxc-libs-1.0.11-1.el7.x86_64 lxc-extra-1.0.11-1.el7.x86_64
2.3 配置LXC使用桥接网卡
[[email protected] ~]# vim /etc/lxc/default.conf lxc.network.type = veth lxc.network.link = br0 lxc.network.flags = up
2.4 启动LXC
[[email protected] ~]# systemctl enable cgconfig.service [[email protected] ~]# systemctl start cgconfig.service
第3章 使用LXC
3.1 获取镜像
3.1.1 交互式获取镜像
[[email protected] ~]# lxc-create -t download -n my-container -- --server mirrors.tuna.tsinghua.edu.cn/lxc-images Distribution: centos Release: 7 Architecture: amd64
提示:LXC对CentOS7镜像的支持不好,bug较多,不建议使用。
3.1.2 非交互式获取镜像
[[email protected] ~]# lxc-create -t download -n centos6_amd64 -- --server mirrors.tuna.tsinghua.edu.cn/lxc-images -d centos -r 6 -a amd64
3.1.3 查看获取的镜像(仅缓存)
[[email protected] ~]# tree /var/cache/lxc/download/centos /var/cache/lxc/download/centos ├── 6 │ └── amd64 │ └── default │ ├── build_id │ ├── config │ ├── config-user │ ├── create-message │ ├── excludes-user │ ├── expiry │ ├── rootfs.tar.xz │ └── templates └── 7 └── amd64 └── default ├── build_id ├── config ├── config-user ├── create-message ├── excludes-user ├── expiry ├── rootfs.tar.xz └── templates 6 directories, 16 files
3.2 使用已有镜像创建容器
3.2.1 创建容器
[[email protected] ~]# lxc-create -t download -n centos7_amd64 -- --server mirrors.tuna.tsinghua.edu.cn/lxc-images -d centos -r 7 -a amd64 Using image from local cache Unpacking the rootfs ...省略部分输出内容...
3.2.2 查看容器目录
[[email protected] ~]# tree -dL 1 /var/lib/lxc/ # 系统真正的位置 /var/lib/lxc/ ├── centos6_amd64 ├── my-container └── centos7_amd64 3 directories
3.3 容器的简单操作
3.3.1 查看容器列表
[[email protected] ~]# lxc-ls centos6_amd64 centos7_amd64 my-container
3.3.2 删除lxc容器
[[email protected] ~]# lxc-destroy -n my-container [[email protected] ~]# lxc-ls centos6_amd64 centos7_amd64
3.3.3 启动一个容器
[[email protected] ~]# lxc-start -n centos6_amd64 [[email protected]_amd64 ~]#
3.3.4 停止一个容器
[[email protected] ~]# lxc-stop -n centos6_amd64
3.3.5 进入一个正在运行的容器
3.3.5.1 lxc-console
[[email protected] ~]# lxc-console -n web01 Connected to tty 1 Type <Ctrl+a q> to exit the console, <Ctrl+a Ctrl+a> to enter Ctrl+a itself Login incorrect web01 login: root Password: Last login: Thu Dec 7 02:57:13 on lxc/console [[email protected] ~]#
3.3.5.2 lxc-attach(相当于只登陆bash,命令基本都不可以使用)
[[email protected] ~]# lxc-attach -n web01
3.4 配置SSH登陆容器
3.4.1 配置root密码
[[email protected] ~]# chroot /var/lib/lxc/centos6_amd64/rootfs passwd Changing password for user root. New password: 123456 Retype new password: 123456 passwd: all authentication tokens updated successfully.
3.4.2 启动容器
[[email protected] ~]# lxc-start -n centos6_amd64
3.4.3 编辑网卡文件
[[email protected]_amd64 ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 BOOTPROTO=static ONBOOT=yes NETMASK=255.255.255.0 IPADDR=10.0.0.21 GATEWAY=10.0.0.254 HOSTNAME=centos6-amd64 NM_CONTROLLED=no TYPE=Ethernet MTU= DHCP_HOSTNAME=`hostname`
3.4.4 配置DNS
[[email protected]_amd64 ~]# vi /etc/resolv.conf nameserver 223.5.5.5
3.4.5 重启容器网络
[[email protected]_amd64 ~]# service network restart
3.4.6 配置并使用本地yum源
[[email protected]_amd64 ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo [[email protected]_amd64 ~]# curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo [[email protected]_amd64 ~]# echo "10.0.0.1 mirrors.aliyun.com" >> /etc/hosts
3.4.7 安装openssh-server
[[email protected]_amd64 ~]# yum install -y openssh-server
3.4.8 启动SSHD服务
[[email protected]_amd64 ~]# chkconfig sshd on [[email protected]_amd64 ~]# service sshd start
3.4.9 登陆测试
[c:\~]$ ssh 10.0.0.21 22 Connecting to 10.0.0.21:22... Connection established. To escape to local shell, press 'Ctrl+Alt+]'. Last login: Wed Dec 6 22:16:13 2017 from mirrors.aliyun.com [[email protected]_amd64 ~]#
3.5 克隆一个容器
3.5.1 关闭容器
[[email protected] ~]# lxc-stop -n centos6_amd64
3.5.2 克隆容器
[[email protected] ~]# lxc-clone centos6_amd64 web01 Created container web01 as copy of centos6_amd64
3.5.3 在宿主机修改网卡配置文件
[[email protected] ~]# vim /var/lib/lxc/web01/rootfs/etc/sysconfig/network-scripts/ifcfg-eth0 IPADDR=10.0.0.22 # 主要修改IP地址,否则会地址冲突
3.5.4 开启克隆后的容器
[[email protected] ~]# lxc-start -n web01
3.5.5 使用容器运行服务
[[email protected] ~]# yum install -y httpd [[email protected] ~]# service httpd start
3.5.6 检查运行结果
[[email protected] ~]# pstree init-+-crond |-httpd---8*[httpd] |-login---bash---pstree |-4*[mingetty] |-rsyslogd---3*[{rsyslogd}] |-2*[sendmail] `-sshd
3.5.7 在宿主机查看容器进程
[[email protected] ~]# yum install -y psmisc # 包含pstree命令 [[email protected] ~]# pstree systemd─┬─NetworkManager───2*[{NetworkManager}] ├─agetty ├─crond ├─dbus-daemon ├─dockerd─┬─docker-containe───10*[{docker-containe}] │ └─11*[{dockerd}] ├─irqbalance ├─lvmetad ├─polkitd───5*[{polkitd}] ├─rsyslogd───2*[{rsyslogd}] ├─sshd─┬─sshd───bash───pstree │ ├─sshd───bash │ └─sshd───bash───lxc-start───init─┬─crond │ ├─httpd───8*[httpd] │ ├─login───bash───top │ ├─4*[mingetty] │ ├─rsyslogd───3*[{rsyslogd}] │ ├─2*[sendmail] │ └─sshd ├─systemd-journal ├─systemd-logind ├─systemd-udevd ├─tuned───4*[{tuned}] └─wpa_supplicant
