因为阿里云服务器本身应该是虚拟机,在上面再创建虚拟机是不行的。但是我想把一台阿里云服务器安装几个隔离的服务。
安装一个docker太重了。。
所以直接安装lxc吧。
选择一个centos7的阿里云服务器,centos7才支持lxc
先yum一个lxc
yum install lxc
然后配置一个网桥,阿里云是eth0是内网,eth1是外网,在外网网卡上配网桥有点危险,所以可以把网桥配在内网,也就是eth0上面
网桥配置如下:
cat /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE="br0"
TYPE=Bridge
ONBOOT=yes
BOOTPROTO=static
IPADDR=阿里云内网ip
NETMASK=阿里云内网掩码
然后我们可以修改eth0的配置,让网桥绑在eth0上。
cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
ONBOOT=yes
BRIDGE=br0
4.有了网桥,lxc就可以连接网络了,然后专心搞lxc配置
给lxc一个运行的硬盘。
思路是将整个/复制到一个子目录下,作为lxc的根。
但是这里有两个问题,其一,/dev/ /sys /proc是没法复制的。
其二,有可能我们需要在usr目录下安装自己的应用。
所以直接copy是不行的,而用mount所有的目录的方法也是不行的。
所以首先,创建/dev /sys /proc目录,把原来的根下面的/dev /sys /proc 给mount过来,然后将usr等目录给拷贝到子目录下面
cp -rf /boot /export/lxc/nagios_lxc/rootfs/
cp -rf /bin /export/lxc/nagios_lxc/rootfs/
cp -rf /etx /export/lxc/nagios_lxc/rootfs/
cp -rf /etc /export/lxc/nagios_lxc/rootfs/
cp -rf /lib /export/lxc/nagios_lxc/rootfs/
cp -rf /lib64 /export/lxc/nagios_lxc/rootfs/
cp -rf /usr /export/lxc/nagios_lxc/rootfs/
cp -rf /sbin /export/lxc/nagios_lxc/rootfs/
这里有个坑的地方是usr目录太大了,要1个G,其实这地方docker采用的autfs,或者任何一个支持快照和日志的文件系统都可以用快照的方式,在/usr目录上做增量。能够极大地减少硬盘占用。不过我懒得弄,而且阿里云服务器的内存是要钱的,因此直接就copy了。
这里可以创建lxc。。
lxc-create -n 虚拟机名 -f /export/lxc/nagios_lxc/rootfs/etc/lxc/default.conf
然后在/var/lib/lxc目录下,出现了虚拟机名的config文件,下面开始修改这个lxc提供的配置文件
lxc提供的配置文件,有两个重要的接口——rootfs和fstab的配置
lxc默认配置文件在/etc/lxc下,而创建后的配置文件在/var/lib/lxc下面
cat /var/lib/lxc/basic/config
lxc.mount = /export/lxc/basic_lxc/rootfs/etc/fstab
lxc.utsname = basic
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = br0
lxc.rootfs = /export/lxc/basic_lxc/rootfs
lxc.network.name=eth0
lxc.network.ipv4=192.168.199.3/24
lxc.network.ipv4.gateway=192.168.199.1
这里解释一下:
lxc.mount 是挂载目录的配置,相当于虚拟机的fstab文件,这个其实可以放在任何地方,属于在虚拟机之外的配置,这里可以实现将/dev /proc /sys挂到lxc的子目录下
cat /export/lxc/basic_lxc/rootfs/etc/fstab
#
# /etc/fstab
# Created by anaconda on Fri Nov 21 18:16:53 2014
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev /export/lxc/basic_lxc/rootfs/dev none rw,bind 0 0
/dev/pts /export/lxc/basic_lxc/rootfs/dev/pts none rw,bind 0 0
/proc /export/lxc/basic_lxc/rootfs/proc proc defaults 0 0
/sys /export/lxc/basic_lxc/rootfs/sys sysfs defaults 0 0
注意/dev/pts要挂一个带读写的
lxc.rootfs = /export/lxc/basic_lxc/rootfs 这里指向的是lxc虚拟机的根目录位置。进入/export/lxc/basic_lxc/目录后,就是虚拟机的可以看到的内容了,虚拟机的里面应用的变化和写入都在rootfs里面,这个目录可以指向自己喜欢的目录。这个根目录要模拟一个真实的根的样子,所以才有各种copy和fstab的挂载
然后就是网络了
lxc.network.link = br0
表明这个lxc挂在br0上面,之前的网桥配置有用了。
lxc与普通虚拟机不一样,不需要再虚拟机里面指定ip和网络配置,lxc的网络配置,都是在外面配的
lxc.network.ipv4=192.168.199.3/24
这个是虚拟机的网络ip,我配成了192.168.199.3 ,子网掩码是255.255.255.0
给虚拟机一个网关,这样,虚拟机可以通过本机连接到网络:
lxc.network.ipv4.gateway=192.168.199.1
现在出现了一个新的ip,192.168.199.1
我这里不能用阿里给的内网ip,而我的网桥在内网上,如果配成内网ip,很可能有ip冲突,所以我这边给阿里云主机的内网配置一个别名,相当于两个ip。
因为用了网桥,所以第一个ip也配置在网桥上面,在/etc/sysconfig/network-scripts/下创建ifcfg-br0:0文件
cat /etc/sysconfig/network-scripts/ifcfg-br0:0
DEVICE="br0:0"
TYPE=Bridge
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.199.1
NETMASK=255.255.255.0
重启网络服务就可以了。
配置到这一步,可以启动lxc了。
lxc-execute -n 虚拟机名 /usr/sbin/sshd -D
然后可以ssh 192.168.199.3 访问我们的虚拟机
现在还有最后一步,就是为虚拟机配置一个snat
iptables -t nat -A POSTROUTING -s 192.168.199.0/24 -o eth1 -j SNAT --to 阿里云外网IP
然后我们虚拟机也要对外提供服务,配置一个dnat
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 10086 -j DNAT --to 192.168.199.3:80
完工!