在一台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服务的。
/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进程。
/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配置为默认配置。
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)
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
默认情况下从主机上容器内部访问外部网络时,与从主机上访问外部网络一样。
默认情况下从外部主机无法直接连接到主机上的容器。需要配置iptable规则后才能连接到容器内部的服务。
每个容器内部都启动了sshd服务,可以从主机上把可执行程序拷贝到容器内部,然后执行。