Posted: 2015-08-10 16:30:26 by Alasdair Keyes
Containerisation seems to be taking over the OpenSource world at the moment, the increased uptake of systems like Docker is enabling systems admins and developers to perform rapid app deployment with increased portability.
Parallels proved the power of containerisation with their OpenVZ and Virtuozzo containerisation platforms showing that with the lower overheads you could run 2-3 times as many containers as you could VMs on a given bit of hardware. Containers aren't quite as isolated as VMs, but for most use cases they will do the job.
I had a cause today to require a number of machines that I could test some client server code at scale. Creating a number of VMs from scratch would be a daunting task (not to mention resource intensive) so I decided I'd give LXC a whirl. I'd been aware of LXC and what it can do for some time but I'd never tried it, I found quite a few of the articles were lacking a bit on setup so I thought I'd document my findings so others didn't have to find out the hard way.
This was installed on my LinuxMint desktop, the one package that a lot of guides missed out was the templates. Templates are build scripts build up containers for you.
sudo apt-get install lxc lxc-templates
If you look at ifconfig on the host, you'll see a new bridge interface created for your Containers to connect onto. DHCP is provided on the 10.0.3.0/255 range by dnsmasq providing your containers access to the same network as your host. It will also allow access to the internet through the host machine.
$ ifconfig lxcbr0 lxcbr0 Link encap:Ethernet HWaddr fe:c6:fc:75:66:ae inet addr:10.0.3.1 Bcast:10.0.3.255 Mask:255.255.255.0 inet6 addr: fe80::6482:4aff:fea8:407f/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:3863 errors:0 dropped:0 overruns:0 frame:0 TX packets:5951 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:362523 (362.5 KB) TX bytes:6926072 (6.9 MB)
If you're looking to run debian based containers you'll need to install debootstrap
sudo apt-get install debootstrap
and if you're wanting CentOS, you'll need yum
sudo apt-get install yum
Once this is done you have everything you need.
First see what templates are available
# ls /usr/share/lxc/templates/ lxc-alpine lxc-busybox lxc-debian lxc-gentoo lxc-oracle lxc-ubuntu lxc-altlinux lxc-centos lxc-download lxc-openmandriva lxc-plamo lxc-ubuntu-cloud lxc-archlinux lxc-cirros lxc-fedora lxc-opensuse lxc-sshd
The templates names are the files shown with the
lxc- prefix removed. First I'll build up a centos Box
# lxc-create -t centos -n lxc-centos-2 Host CPE ID from /etc/os-release: This is not a CentOS or Redhat host and release is missing, defaulting to 6 use -R|--release to specify release Checking cache download in /var/cache/lxc/centos/x86_64/6/rootfs ... Cache found. Updating... Loaded plugins: fastestmirror Setting up Update Process base | 3.7 kB 00:00 base/primary_db | 4.6 MB 00:02 extras | 3.4 kB 00:00 extras/primary_db | 26 kB 00:00 updates | 3.4 kB 00:00 updates/primary_db | 749 kB 00:00 No Packages marked for Update Loaded plugins: fastestmirror Cleaning repos: base extras updates 0 package files removed Update finished Copy /var/cache/lxc/centos/x86_64/6/rootfs to /var/lib/lxc/lxc-centos-2/rootfs ... Copying rootfs to /var/lib/lxc/lxc-centos-2/rootfs ... sed: can't read /etc/init/tty.conf: No such file or directory Storing root password in '/var/lib/lxc/lxc-centos-2/tmp_root_pass' Expiring password for user root. passwd: Success Container rootfs and config have been created. Edit the config file to check/enable networking setup. The temporary root password is stored in: '/var/lib/lxc/lxc-centos-2/tmp_root_pass' The root password is set up as expired and will require it to be changed at first login, which you should do as soon as possible. If you lose the root password or wish to change it without starting the container, you can change it from the host by running the following command (which will also reset the expired flag): chroot /var/lib/lxc/lxc-centos-2/rootfs passwd
The example above is quite a short output, when you run it for the first time, you will get much more output as LXC grabs all the files it needs from the CentOS repository.
Now just run it
lxc-start -n lxc-centos-2 CentOS release 6.7 (Final) Kernel 3.19.0-25-generic on an x86_64 lxc-centos-2 login: init: rcS main process (7) killed by TERM signal Entering non-interactive startup iptables: No config file. [WARNING] Bringing up loopback interface: [ OK ] Bringing up interface eth0: Determining IP information for eth0... done. [ OK ] Starting system logger: [ OK ] awk: cmd. line:1: fatal: cannot open file `/etc/mtab' for reading (No such file or directory) Mounting filesystems: [ OK ] Generating SSH2 RSA host key: [ OK ] Generating SSH1 RSA host key: [ OK ] Generating SSH2 DSA host key: [ OK ] Starting sshd: [ OK ] CentOS release 6.7 (Final) Kernel 3.19.0-25-generic on an x86_64 lxc-centos-2 login:
There you are, you can see all your containers with
# lxc-ls lxc-centos-1 lxc-centos-2
# lxc-info -n lxc-centos-2 Name: lxc-centos-2 State: RUNNING PID: 21055 IP: 10.0.3.201 CPU use: 1.06 seconds BlkIO use: 56.00 KiB Memory use: 2.85 MiB KMem use: 0 bytes Link: veth3GI7HY TX bytes: 1.42 KiB RX bytes: 5.25 KiB Total bytes: 6.67 KiB
You can see the network interface for the container on your host
# ifconfig veth3GI7HY veth3GI7HY Link encap:Ethernet HWaddr fe:c6:2d:53:f1:d8 inet6 addr: fe80::fcc6:2dff:fe53:f1d8/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:13 errors:0 dropped:0 overruns:0 frame:0 TX packets:36 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:1458 (1.4 KB) TX bytes:5607 (5.6 KB)
You can see how lightweight these containers are in disk usage
# du -hs /var/lib/lxc/lxc-centos-2/ 385M/var/lib/lxc/lxc-centos-2/
To test it's speed lets create 10 containers
# time for NUM in `seq 10 20`; do lxc-create -t centos -n lxc-centos-$NUM; lxc-start -d -n lxc-centos-$NUM; done ... ... real0m52.756s user0m36.676s system 0m16.356s
52 seconds to create and start 10 Containers
# lxc-ls lxc-centos-10 lxc-centos-11 lxc-centos-12 lxc-centos-13 lxc-centos-14 lxc-centos-15 lxc-centos-16 lxc-centos-17 lxc-centos-18 lxc-centos-19 lxc-centos-20
Don't need them anymore? lets just get rid of them.
# time for NUM in `seq 10 20`; do lxc-destroy -f -n lxc-centos-$NUM; done real0m3.815s user0m0.176s system 0m2.744s
Each container runs SSH, so you can treat it as just another server when it comes to management. For development an use of leightweight systems, LXC really is the way forward.
If you found this useful, please feel free to donate via bitcoin to 1NT2ErDzLDBPB8CDLk6j1qUdT6FmxkMmNz
I'm now available for IT consultancy and software development services - Cloudee LTD.
Happy user of Digital Ocean (Affiliate link)