如何在Ubuntu Linux 14.04 LTS上创建非特权LXC容器
如何在Ubuntu Linux 14.04 LTS服务器上安装,创建和管理非特权LXC容器?
LXC是Linux容器的缩写。
它只不过是用于在单个Linux主机上运行多个隔离的Linux发行版(系统容器)的操作系统级虚拟化技术。
在本教程中,您将学习如何在Ubuntu Linux服务器上安装和管理LXC容器。
LXC Linux容器
LXC通常被描述为轻量级虚拟化技术。
您可以将LXC视为类固醇的根基 Jail。
没有涉及来宾操作系统。
您只能使用LXC运行Linux发行版。
您不能使用LXC运行Windows或BSD或任何其他操作系统。
您可以使用LXC运行CentOS或Gentoo或任何其他Linux发行版。
传统的虚拟化(例如KVM/XEN/VMWARE)和半虚拟化需要为每个实例提供完整的操作系统镜像。
您可以使用传统虚拟化来运行任何操作系统。
在Ubuntu上安装lxc
输入以下apt-get命令进行安装:
$ sudo apt-get install lxc
输出示例:
在Ubuntu上安装LXC
LXC和网络
LXC为您创建一个称为lxcbr0的NATed网桥。
每个容器都有一个veth NIC,所有流量都使用lxcbr0网桥路由。
要查看当前设置,请执行:
$ sudo brctl show
输出示例:
bridge name bridge id STP enabled interfaces lxcbr0 8000.fe09977d9e4f no vethH1OXMH
要查看分配给lxcbr0的IP地址,请执行:
$ sudo ifconfig lxcbr0
输出示例:
lxcbr0 Link encap:Ethernet HWaddr fe:09:97:7d:9e:4f inet addr:10.0.3.1 Bcast:10.0.3.255 Mask:255.255.255.0 inet6 addr: fe80::4820:9fff:fe01:4d52/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:40 errors:0 dropped:0 overruns:0 frame:0 TX packets:42 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:3553 (3.5 KB) TX bytes:4383 (4.3 KB)
要查看容器使用的DHCP范围,请执行:
$ ps aux | grep lxc-dns | grep -o 'dhcp-range.[0-9].* '
输出示例:
dhcp-range 10.0.3.2,10.0.3.254 --dhcp-lease-max=253 --dhcp-no-override --except-interface=lo --interface=lxcbr0 --dhcp-leasefile=/var/lib/misc/dnsmasq.lxcbr0.leases
要检查当前内核是否支持lxc,请执行:
$ lxc-checkconfig
输出示例:
Kernel configuration not found at /proc/config.gz; searching... Kernel configuration found at /boot/config-3.13.0-76-generic --- Namespaces -- Namespaces: enabled Utsname namespace: enabled Ipc namespace: enabled Pid namespace: enabled User namespace: enabled Network namespace: enabled Multiple /dev/pts instances: enabled --- Control groups -- Cgroup: enabled Cgroup clone_children flag: enabled Cgroup device: enabled Cgroup sched: enabled Cgroup cpu account: enabled Cgroup memory controller: enabled Cgroup cpuset: enabled --- Misc -- Veth pair device: enabled Macvlan: enabled Vlan: enabled Bridges: enabled Advanced netfilter: enabled CONFIG_NF_NAT_IPV4: enabled CONFIG_NF_NAT_IPV6: enabled CONFIG_IP_NF_TARGET_MASQUERADE: enabled CONFIG_IP6_NF_TARGET_MASQUERADE: enabled CONFIG_NETFILTER_XT_TARGET_CHECKSUM: enabled --- Checkpoint/Restore -- checkpoint restore: enabled CONFIG_FHANDLE: enabled CONFIG_EVENTFD: enabled CONFIG_EPOLL: enabled CONFIG_UNIX_DIAG: enabled CONFIG_INET_DIAG: enabled CONFIG_PACKET_DIAG: enabled CONFIG_NETLINK_DIAG: enabled File capabilities: enabled Note : Before booting a new kernel, you can check its configuration usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig
创建非特权容器
非特权容器的运行方式与特权容器相同,只是无需使用sudo或root访问权限即可。
这是更安全的方法,因为即使您设法转义了容器,也无法以root身份出现在主机上。
步骤如下:
- 为lxc创建一个新用户。
- 设置lxc的密码。
- 找出为lxc用户分配的subuid和subgids。
- 为lxc用户创建默认的容器配置文件
- 创建一个新的容器。
- 启动一个新的容器。
- 在新创建的非特权容器中部署应用程序。
步骤1:为lxc创建一个新用户
执行以下命令以添加一个名为mylxcusr的用户:
$ sudo useradd -s /sbin/bash -c 'unprivileged lxc user' -m mylxcusr
步骤2:为Lxc设置密码
设置mylxcusr的密码
$ sudo passwd mylxcusr
步骤-3:找出为lxc用户分配的subuid和subgids
输入以下命令
$ sudo grep mylxcusr /etc/sub{gid,uid}
输出示例:
/etc/subgid:mylxcusr:100000:65536 /etc/subuid:mylxcusr:100000:65536
记下这些值。
步骤4:为lxc用户创建默认的容器配置文件
确保允许用户mylxcusr最多创建10个veth类型的设备并将其添加到名为lxcbr0的网桥。
换句话说,只有添加以下行,网络才能工作:
$ sudo vi /etc/lxc/lxc-usernet
追加以下行:
mylxcusr veth lxcbr0 10
保存并关闭文件。
现在使用su切换到新用户,或仅使用ssh客户端登录:
$ su - mylxcusr
或者
$ ssh [email protected] $ ssh [email protected] $ id
输出示例:
uid=1002(mylxcusr) gid=1002(mylxcusr) groups=1002(mylxcusr)
登录到远程计算机后,执行以下命令以创建~/.config/lxc/Director,如下所示:
$ mkdir -p ~/.config/lxc
最后,如下创建~/.config/lxc/default.conf文件:
$ cp /etc/lxc/default.conf ~/.config/lxc/default.conf
编辑文件,执行:
$ vi ~/.config/lxc/default.conf
追加如下配置(使用步骤3中映射的用户名和组ID范围100000:65536):
lxc.id_map = u 0 100000 65536 lxc.id_map = g 0 100000 65536
步骤5:建立新的容器
让我们创建一个名为httpd的新Ubuntu容器,执行:
$ lxc-create -t download -n httpd -- -d ubuntu -r trusty -a amd64
输出示例:
创建一个Ubuntu容器
这就是创建名为httpd的Ubuntu容器所需的全部工作。
步骤6:启动新容器
要启动httpd容器类型:
$ lxc -n httpd -d $ echo $? $ lxc-ls --fancy
NAME STATE IPV4 IPV6 AUTOSTART -------------------------------------------- httpd RUNNING 10.0.3.61 - NO
要在正在运行的容器中启动进程或仅进行登录,请执行:
$ lxc-attach -n httpd
httpd容器中的示例会话:
root@httpd:/# id uid=0(root) gid=0(root) groups=0(root) root@httpd:/# ifconfig eth0 Link encap:Ethernet HWaddr 00:16:3e:ea:ce:fa inet addr:10.0.3.61 Bcast:10.0.3.255 Mask:255.255.255.0 inet6 addr: fe80::216:3eff:feea:cefa/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:37 errors:0 dropped:0 overruns:0 frame:0 TX packets:35 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:3502 (3.5 KB) TX bytes:3362 (3.3 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:65536 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) root@httpd:/# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 14.04.3 LTS Release: 14.04 Codename: trusty
出于安全原因,容器镜像出厂时没有用户帐户,也没有root密码。
设置httpd容器的root密码:
# passwd root
要为httpd容器启用sshd,请运行:
# apt-get install openssh-server
您可以使用ssh从主机登录到容器:
$ ssh [email protected]
步骤7:在新创建的非特权容器中部署应用
您现在可以安装nginx,php或任何其他应用程序。
只需追加到容器并根据需要运行命令或应用即可。
重要管理命令
以下是有用命令的快速概述:
如何启动容器?
$ lxc-start -n {container-name-here} -d $ lxc-start -n mysql -d
如何停止集装箱?
$ lxc-stop -n {container-name-here} $ lxc-stop -n mysql
如何销毁(删除)容器?
$ lxc-destroy -n {container-name-here} $ lxc-destroy -n mysql
如何列出所有容器?
$ lxc-ls $ lxc-ls --fancy
如何更新或修补容器?
使用lxc-attach命令更新由Ubuntu或Debian驱动的容器:
$ lxc-attach -n mysql apt-get -- -qq update $ lxc-attach -n mysql apt-get -- -qq upgrade $ lxc-attach -n nginx yum -- -y update
如何强制DHCP为我的容器提供永久IP地址?
作为主机的根用户,运行以下命令:
$ sudo vi /etc/lxc/dnsmasq.conf
要为lxcbr0上的容器提供基于域名的持久IP地址,可以按以下方式添加条目:
dhcp-host=httpd,10.0.3.20 dhcp-host=mysql,10.0.3.21 dhcp-host=nginx,10.0.3.23 dhcp-host=php7,10.0.3.24
保存并关闭文件。
如何创建CentOS/Gentoo/Fedora或其他任何形式的LXC?
$ lxc-create -t download -n {container-name-here} -- -d {DISTRONAME} -r {RELEASE} -a {ARCH} $ lxc-create -t download -n bar -- -d centos -r 6 -a amd64 $ lxc-create -t download -n foo -- -d gentoo -r current -a amd64 $ lxc-create -t download -n db -- -d ubuntu -r precise -a i386 $ lxc-create -t download -n nginx -- -d debian -r jessie -a amd64 $ lxc-create -t download -n mysql -- -d fedora -r 22 -a amd64 $ lxc-create -t download -n maridb -- -d oracle -r 6.5 -a amd64 $ lxc-create -t download -n cahcing -- -d plamo -r 5.x -a amd64