如何在Ubuntu Linux 14.04 LTS上创建非特权LXC容器

时间:2020-01-09 14:17:02  来源:igfitidea点击:

如何在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