容器技术(一)—LXC安装及使用

2017年12月7日16:52:19 发表评论 484 views

第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的对比

  • 虚拟化技术对比:
  1. KVM:全虚拟化,需要模拟各种硬件
  2. docker:严格来说不算是虚拟化技术,只是进程隔离和资源限制
  • 实例启动进程对比:
  1. 在kvm虚拟机中执行top命令,看宿主机进程树,根本看不到top的进程
  2. 在docker容器中,同样执行top命令,在宿主机进程数中直接可以看到top进程
  • 占用内容资源对比:
  1. KVM虚拟机一般会独占一段内存,即使闲置,其他虚拟机也无法使用。
  2. 容器可以只有一个内存上限,没有下限。如果它只使用1MB内存,那么它只占用宿主机1MB内存,宿主机可以将富余内存作为他用。
  • 实例的内核对比:
  1. kvm的虚拟机内核无需与宿主机一致
  2. docker:实例内核和宿主机内核一致
  • 操作系统支持度对比:
  1. kvm:支持多种操作系统,除了linux,还支持windows,uninx、solaris等
  2. docker:只支持linux
  • 启动一个实例需要的时间对比:

lxc容器技术将操作系统抽象到了一个新的高度。直接从init启动,省去了硬件自检、grub引导、加载内核、加载驱动等传统启动项目,因此启动飞速。

  1. docker:秒级
  2. kvm:分钟级别
  • 镜像模板占用空间对比:
  1. kvm:占用空间大
  2. docker:占用空间小
  • 磁盘读写性能对比:

kvm

容器技术(一)—LXC安装及使用

 

docker

容器技术(一)—LXC安装及使用

 

  • 网络性能测试对比:

kvm

容器技术(一)—LXC安装及使用

 

docker

容器技术(一)—LXC安装及使用

 

综合来说:docker比kvm更省资源,可以提供非常接近宿主机的性能,而kvm资源隔离比docker更高,kvm支持的操作系统类型更多。

参考资料:http://www.qstack.com.cn/archives/148.html

第2章 安装配置LXC

2.1 系统准备

2.1.1 系统环境准备

1
2
3
4
5
6
[root@docker ~]# cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
[root@docker ~]# uname -r
3.10.0-327.el7.x86_64
[root@docker ~]# hostname -I
172.16.1.20 10.0.0.20

2.1.2 配置宿主机桥接网卡

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@docker ~]# cp /etc/sysconfig/network-scripts/ifcfg-{eth0,br0}

[root@docker ~]# cat > /etc/sysconfig/network-scripts/ifcfg-eth0 < EOF
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
BRIDGE=br0
EOF

[root@docker ~]# 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源

1
[root@docker ~]# curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

2.2.2 安装依赖程序

1
[root@docker ~]# yum install -y libcgroup* bridge-utiles wget

2.2.3 安装lxc

1
2
3
4
5
6
7
8
9
10
[root@docker ~]# yum install -y lxc*
[root@docker ~]# 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使用桥接网卡

1
2
3
4
[root@docker ~]# vim /etc/lxc/default.conf
lxc.network.type = veth
lxc.network.link = br0
lxc.network.flags = up

2.4 启动LXC

1
2
[root@docker ~]# systemctl enable cgconfig.service
[root@docker ~]# systemctl start cgconfig.service

第3章 使用LXC

3.1 获取镜像

3.1.1 交互式获取镜像

1
2
3
4
[root@docker ~]# 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 非交互式获取镜像

1
[root@docker ~]# lxc-create -t download -n centos6_amd64 -- --server mirrors.tuna.tsinghua.edu.cn/lxc-images -d centos -r 6 -a amd64

3.1.3 查看获取的镜像(仅缓存)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@docker ~]# 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 创建容器

1
2
3
4
[root@docker ~]# 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 查看容器目录

1
2
3
4
5
6
7
[root@docker ~]# tree -dL 1 /var/lib/lxc/       # 系统真正的位置
/var/lib/lxc/
├── centos6_amd64
├── my-container
└── centos7_amd64

3 directories

3.3 容器的简单操作

3.3.1 查看容器列表

1
2
[root@docker ~]# lxc-ls
centos6_amd64  centos7_amd64  my-container

3.3.2 删除lxc容器

1
2
3
[root@docker ~]# lxc-destroy -n my-container
[root@docker ~]# lxc-ls
centos6_amd64  centos7_amd64

3.3.3 启动一个容器

1
2
[root@docker ~]# lxc-start -n centos6_amd64
[root@centos6_amd64 ~]#

3.3.4 停止一个容器

1
[root@docker ~]# lxc-stop -n centos6_amd64

3.3.5 进入一个正在运行的容器

3.3.5.1 lxc-console

1
2
3
4
5
6
7
8
9
10
11
[root@docker ~]# 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
[root@web01 ~]#

3.3.5.2 lxc-attach(相当于只登陆bash,命令基本都不可以使用)

1
[root@docker ~]# lxc-attach -n web01

3.4 配置SSH登陆容器

3.4.1 配置root密码

1
2
3
4
5
[root@docker ~]# 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 启动容器

1
[root@docker ~]# lxc-start -n centos6_amd64

3.4.3 编辑网卡文件

1
2
3
4
5
6
7
8
9
10
11
12
[root@centos6_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

1
2
[root@centos6_amd64 ~]# vi /etc/resolv.conf
nameserver 223.5.5.5

3.4.5 重启容器网络

1
[root@centos6_amd64 ~]# service network restart

3.4.6 配置并使用本地yum源

1
2
3
[root@centos6_amd64 ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
[root@centos6_amd64 ~]# curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
[root@centos6_amd64 ~]# echo "10.0.0.1        mirrors.aliyun.com" >> /etc/hosts

3.4.7 安装openssh-server

1
[root@centos6_amd64 ~]# yum install -y openssh-server

3.4.8 启动SSHD服务

1
2
[root@centos6_amd64 ~]# chkconfig sshd on
[root@centos6_amd64 ~]# service sshd start

3.4.9 登陆测试

1
2
3
4
5
6
7
8
[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
[root@centos6_amd64 ~]#

3.5 克隆一个容器

3.5.1 关闭容器

1
[root@docker ~]# lxc-stop -n centos6_amd64

3.5.2 克隆容器

1
2
[root@docker ~]# lxc-clone centos6_amd64 web01
Created container web01 as copy of centos6_amd64

3.5.3 在宿主机修改网卡配置文件

1
2
[root@docker ~]# vim /var/lib/lxc/web01/rootfs/etc/sysconfig/network-scripts/ifcfg-eth0
IPADDR=10.0.0.22        # 主要修改IP地址,否则会地址冲突

3.5.4 开启克隆后的容器

1
[root@docker ~]# lxc-start -n web01

3.5.5 使用容器运行服务

1
2
[root@web01 ~]# yum install -y httpd
[root@web01 ~]# service httpd start

3.5.6 检查运行结果

1
2
3
4
5
6
7
8
[root@web01 ~]# pstree
init-+-crond
     |-httpd---8*[httpd]
     |-login---bash---pstree
     |-4*[mingetty]
     |-rsyslogd---3*[{rsyslogd}]
     |-2*[sendmail]
     `-sshd

容器技术(一)—LXC安装及使用

3.5.7 在宿主机查看容器进程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@docker ~]# yum install -y psmisc  # 包含pstree命令
[root@docker ~]# 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
weinxin
我的微信
如果有技术上的问题可以扫一扫我的微信

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: