2013年10月28日

Lxc简介


lxc简介。

安装lxc

在一台ubuntu(1204)机器上安装lxc

sudo apt-get install lxc

安装成功后,主机的以下方面发生了变化。

目录

出现了以下目录

/var/cache/lxc  用于缓存容器的rootfs
/var/lib/lxc    用于存储容器

网络配置

执行ifconfig查看网络配置

paas@ubuntu:~$ ifconfig
eth0      Link encap:以太网  硬件地址 00:50:56:8f:7c:4d
          inet 地址:192.168.0.116  广播:192.168.0.255  掩码:255.255.255.0
          inet6 地址: fe80::250:56ff:fe8f:7c4d/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  跃点数:1
          接收数据包:562634 错误:0 丢弃:0 过载:0 帧数:0
          发送数据包:139062 错误:0 丢弃:0 过载:0 载波:0
          碰撞:0 发送队列长度:1000
          接收字节:243629522 (243.6 MB)  发送字节:12584350 (12.5 MB)

lo        Link encap:本地环回
          inet 地址:127.0.0.1  掩码:255.0.0.0
          inet6 地址: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  跃点数:1
          接收数据包:266 错误:0 丢弃:0 过载:0 帧数:0
          发送数据包:266 错误:0 丢弃:0 过载:0 载波:0
          碰撞:0 发送队列长度:0
          接收字节:19823 (19.8 KB)  发送字节:19823 (19.8 KB)

lxcbr0    Link encap:以太网  硬件地址 ca:ed:10:82:66:08
          inet 地址:10.0.3.1  广播:10.0.3.255  掩码:255.255.255.0
          inet6 地址: fe80::e463:7eff:fe23:9c1d/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  跃点数:1
          接收数据包:970 错误:0 丢弃:0 过载:0 帧数:0
          发送数据包:1298 错误:0 丢弃:0 过载:0 载波:0
          碰撞:0 发送队列长度:0
          接收字节:153435 (153.4 KB)  发送字节:122386 (122.3 KB)

可以看到多了一个网桥设备lxcbr0

执行route查看路由情况

paas@ubuntu:~$ route
内核 IP 路由表
目标            网关            子网掩码        标志  跃点   引用  使用 接口
default         192.168.0.1     0.0.0.0         UG    100    0        0 eth0
10.0.3.0        *               255.255.255.0   U     0      0        0 lxcbr0
192.168.0.0     *               255.255.255.0   U     0      0        0 eth0

服务进程

通过ps命令可以看到多了一个dnsmasq进程

dnsmasq -u lxc-dnsmasq --strict-order --bind-interfaces --pid-file=/var/run/lxc/dnsmasq.pid --conf-file= --listen-address10.0.3.1 --dhcp-range10.0.3.2,10.0.3.254 --dhcp-lease-max=253 --dhcp-no-override --except-interface=lo --interface=lxcbr0

这个进程是用来做本机的dhcp服务器,为容器提供dhcp服务的。

cgroup

/sys/fs/cgroup目录下的各个子目录中都出现了一个lxc目录,用于后续对容器进行资源隔离。

创建容器

使用lxc-create命令创建两个容器

lxc-create -t ubuntu -n p1
lxc-create -t debian -n p2

创建成功后,/var/lib/lxc目录中出现了两个目录p1、p2。

此时主机的网络配置、服务进程、cgroup配置都没有变化。

启动容器

sudo lxc-start -n p1

主机网络配置

执行ifconfig查看网络配置,可以看到增加了一个网络设备

vethCUYVnP Link encap:以太网  硬件地址 4a:a3:63:b2:28:c7
          inet6 地址: fe80::48a3:63ff:feb2:28c7/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  跃点数:1
          接收数据包:20 错误:0 丢弃:0 过载:0 帧数:0
          发送数据包:15 错误:0 丢弃:0 过载:0 载波:0
          碰撞:0 发送队列长度:1000
          接收字节:1836 (1.8 KB)  发送字节:1543 (1.5 KB)

主机进程

通过ps命令查看lxc-start相关进程

paas@ubuntu:~$ ps -ef | grep lxc-start
root     31378 30329  0 15:09 pts/15   00:00:00 sudo lxc-start -n p1
root     31379 31378  0 15:09 pts/15   00:00:00 lxc-start -n p1
paas     31926 31820  0 15:12 pts/10   00:00:00 grep --color=auto lxc-start

通过pstree命令查看31379的进程树

paas@ubuntu:~$ pstree -p 31379
lxc-start(31379)───init(31386)─┬─cron(31665)
                               ├─dhclient3(31606)
                               ├─getty(31656)
                               ├─getty(31660)
                               ├─getty(31662)
                               ├─getty(31683)
                               ├─getty(31687)
                               ├─rsyslogd(31567)─┬─{rsyslogd}(31572)
                               │                 ├─{rsyslogd}(31574)
                               │                 └─{rsyslogd}(31575)
                               ├─sshd(31628)
                               ├─udevd(31560)
                               ├─upstart-socket-(31562)
                               └─upstart-udev-br(31548)

其中init(31386)即为容器p1的init进程。

主机cgroup

/sys/fs/cgroup/blkio、/sys/fs/cgroup/cpu、/sys/fs/cgroup/cpuacct、/sys/fs/cgroup/cpuset、/sys/fs/cgroup/devices、/sys/fs/cgroup/freezer、/sys/fs/cgroup/memory、/sys/fs/cgroup/memory目录的子目录lxc中都有一个p1目录。

p1目录的tasks文件内容:

31386
31548
31560
31562
31567
31606
31628
31656
31660
31662
31665
31683
31687

即init(31386)进程和其所有子进程的进程号。

其余cgroup配置为默认配置。

容器p1中的网络配置

ubuntu@p1:~$ ifconfig
eth0      Link encap:Ethernet  HWaddr 00:16:3e:97:d3:48
          inet addr:10.0.3.77  Bcast:10.0.3.255  Mask:255.255.255.0
          inet6 addr: fe80::216:3eff:fe97:d348/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:15 errors:0 dropped:0 overruns:0 frame:0
          TX packets:20 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1543 (1.5 KB)  TX bytes:1836 (1.8 KB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

容器p1中的进程

ifconfig

ubuntu@p1:~$ ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 07:09 ?        00:00:00 /sbin/init
root       131     1  0 07:09 ?        00:00:00 upstart-udev-bridge --daemon
root       143     1  0 07:09 ?        00:00:00 /sbin/udevd --daemon
root       145     1  0 07:09 ?        00:00:00 upstart-socket-bridge --daemon
syslog     150     1  0 07:09 ?        00:00:00 rsyslogd -c5
root       189     1  0 07:09 ?        00:00:00 dhclient3 -e IF_METRIC=100 -pf /
root       211     1  0 07:09 ?        00:00:00 /usr/sbin/sshd -D
root       239     1  0 07:09 ?        00:00:00 /sbin/getty -8 38400 tty4
root       243     1  0 07:09 ?        00:00:00 /sbin/getty -8 38400 tty2
root       245     1  0 07:09 ?        00:00:00 /sbin/getty -8 38400 tty3
root       248     1  0 07:09 ?        00:00:00 cron
root       266     1  0 07:09 ?        00:00:00 /bin/login --
root       270     1  0 07:09 ?        00:00:00 /sbin/getty -8 38400 tty1
ubuntu     297   266  0 07:24 lxc/console 00:00:00 -bash
ubuntu     308   297  0 07:24 lxc/console 00:00:00 ps -ef

route

ubuntu@p1:~$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         10.0.3.1        0.0.0.0         UG    100    0        0 eth0
10.0.3.0        *               255.255.255.0   U     0      0        0 eth0

resolv.conf

ubuntu@p1:~$ cat /etc/resolv.conf
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 10.0.3.1
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 10.1.1.4
nameserver 10.1.1.2

# 其中10.1.1.4和10.1.1.2为主机原有的nameserver配置

hostname

ubuntu@p1:~$ cat /etc/hostname
p1

hosts

ubuntu@p1:~$ cat /etc/hosts
127.0.0.1   localhost
127.0.1.1   p1

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

lxc容器使用

网络访问

默认情况下从主机上容器内部访问外部网络时,与从主机上访问外部网络一样。

默认情况下从外部主机无法直接连接到主机上的容器。需要配置iptable规则后才能连接到容器内部的服务。

运行应用

每个容器内部都启动了sshd服务,可以从主机上把可执行程序拷贝到容器内部,然后执行。