Getting started with Linux containers(LXC)

In my previous article, I talked about the confusing world of virtualization. To the uninitialized, it can be really confusing which technology or tool to use.

But to sum it all up, if you are running a data center, then KVM/XEN are your best bet, if you are system admin or Devops guy who wishes to have isolated or network server environments, then Linux containers are your thing, but if you are developer wanting to ship your app from development to production, then docker is the tool for the job.

I mainly fall in the Devops area, so my point of interest is with Linux containers and to some extend Docker containers. So this post, I'll introduce you to some commands and how to setup Linux containers or LXC on any Linux distro.

Installing and Creating Linux Containers on Ubuntu/Debian
#install lxc
sudo apt-get update  
sudo apt-get install lxc

#create a new container
lxc-create -t ubuntu -n c1 

#list containers
lxc-ls --fancy  
NAME STATE    IPV4       IPV6  AUTOSTART  
-----------------------------------------------------
c1  RUNNING  10.0.3.21  -     NO  
c2  STOPPED  -          -     NO  

#start a container
sudo lxc-start -n c1  
→ use the -d (daemon option ) to daemonize the container 

#attach to a running container from host
lxc-attach -n c1

#stop a container
lxc-stop -n c1

#clone a container
lxc-copy -n old-container -N new-container

#destroy a container
lxc-destroy -n container-name

Tip: Creating a Linux container takes a hours on slow internet connections. It took about an hour on my localhost while in the cloud it took about 3 minutes!

Actually I had issues with this on my localhost. So I created a lxc container on a cloud box, zipped the container folder in /var/lib/lxc/container-name and downloaded it. Then moved it to /var/lib/lxc/container-name on my localhost.

LXC Config file location
Container config files is usually located at /var/lib/lxc/$container-name/config. Here you can make several tweaks to your container such as specifying static ip, whether it should autostart among other settings.

Here's my sample config file

cat /var/lib/lxc/c1/config

# Template used to create this container: /usr/share/lxc/templates/lxc-ubuntu
# Parameters passed to the template:
# For additional config options, please look at lxc.container.conf(5)

# Common configuration
lxc.include = /usr/share/lxc/config/ubuntu.common.conf

# Container specific configuration
lxc.rootfs = /var/lib/lxc/c1/rootfs  
lxc.mount = /var/lib/lxc/c1/fstab  
lxc.utsname = c1  
lxc.arch = amd64

# Network configuration
lxc.network.type = veth  
lxc.network.flags = up  
lxc.network.link = lxcbr0  
lxc.network.hwaddr = 00:16:3e:fb:89:1b  
########my config
lxc.network.ipv4 = 10.0.3.100/24 10.0.3.255  
lxc.network.ipv4.gateway = auto  
lxc.start.auto = 1  
lxc.start.delay = 15  
lxc.start.order = 10  
lxc.mount.entry = /home/oquidave/lxc_mount share none bind 0 0  
Mount host directory to an LXC container

Sometimes you want to have a shared directory between containers or between the host and the lxc containers, here's how you do it;

On the host machine, create the directory you wish to mount on the LXC container.

mkdir /media/data/share && chmod 7777 /media/data/share
Create directory in lxc container
mkdir /share
Edit lxc config file on host
vi /var/lib/lxc/containername/config
Add the following entry;
lxc.mount.entry = /media/data/share share none ro,bind 0.0

David Okwii

David Okwii is a Ugandan-based Technology writer and System's Engineer.

Kampala Uganda http://www.davidokwii.com

Subscribe to oquidave@geek:~ #

Get the latest posts delivered right to your inbox.

or subscribe via RSS with Feedly!