Debian 7 wheezy: lxc + docker

Me disponía a probar LXC (Linux Containers) y tenía una duda, así que pregunté en twitter por ayuda, a los pocos segundos ya salió un follower ofreciéndomela y dándome a conocer un gestor que me ayudaría con la tarea de administrar con LXC, se trata de docker.
Ahora mismo no os puedo contar mucho mas de docker, ya que ni uno ni otro los conozco pero intuyo que hacen! así que este manual vamos a instalar docker + lxc en una debian wheezy.

Podría parecer trivial, la problemática es que docker no está para debian, si para ubuntu y otras distribuciones, pero ubuntu al haberse alejado tanto de debian quizás podría darnos algunos problemas, así que vamos a instalar docker en una debian stable.

Partimos de una debian 7 wheezy recién instalada, os presento a Rigel, estrella de la constelación de Orión :)

Instalamos algunos paquetes necesarios:

root@rigel:~# apt-get install lxc debootstrap bridge-utils libvirt-bin

libvirt-bin nos trae el soporte de otros tipos de virtualización. No voy a entrar en detalles, más info aquí.

Vamos a montar cgroup

root@rigel:~# echo "cgroup /sys/fs/cgroup cgroup defaults 0 0" >> /etc/fstab
root@rigel:~# mount cgroup

Ahora vamos a verificar que todo es correcto y ejecutamos el verificador de la configuración de lxc

root@rigel:~# lxc-checkconfig 
Kernel config /proc/config.gz not found, looking in other places...
Found kernel config file /boot/config-3.2.0-4-amd64
--- 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
File capabilities: enabled

Note : Before booting a new kernel, you can check its configuration
usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig

Si en namespaces nos pone required es que nuestro kernel no está compilado con CONFIG_USER_NS=y y tendremos que instalar un kernel mas nuevo. Para hacerlo lo podemos hacer desde backports (con la 3.2.0-4-amd64 parece que si que está compilado, así que si todos los valores indica que están correctos no sigas con el paso entre #####)

#########
Añadimos los backports en sources.list

root@rigel:~# echo "# backports" >> /etc/apt/sources.list
root@rigel:~# echo "deb http://ftp.de.debian.org/debian wheezy-backports main" >> /etc/apt/sources.list
root@rigel:~# apt-get update

E instalamos el último kernel que encontremos en backports

root@rigel:~# apt-cache search linux-image -t wheezy-backports
root@rigel:~# apt-get install linux-image-3.12-0.bpo.1-amd64 -t wheezy-backports

A continuación hacemos una modificación de grub en el fichero /etc/default/grub y modificamos la opción con el siguiente contenido

root@rigel:~# vi /etc/default/grub
GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"

Reinstalamos grub para que aplique los cambios

root@rigel:~# update-grub

########

Activamos la redirección de puertos (activo la de ipv6 ya que esta máquina va a trabajar con IPv6 también)

root@rigel:~# vi /etc/sysctl.conf
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1

Reiniciamos el sistema.

Una vez reiniciado vamos a instalar docker desde las sources.

root@rigel:~# wget https://get.docker.io/builds/Linux/x86_64/docker-latest -O docker
root@rigel:~# chmod +x docker
root@rigel:~# mv docker /usr/bin/

Y lo arrancamos de momento de forma manual

root@rigel:~# docker -d &

Al arrancar me dice esto:

2014/03/06 11:11:06 WARNING: You are running linux kernel version 3.2.0-4-amd64, which might be unstable running docker. Please upgrade your kernel to 3.8.0.

De momento parece que arranca correctamente, así que feel free de instalar dicho kernel (a compilar y cosas de estas hehe porqué dicha versión aún no está en los repositorios de debian, ni siquiera en los unstable!)

cuatro comprovaciones para ver si está correctamente instalado

root@rigel:/usr/bin# docker version
Client version: 0.8.1
Go version (client): go1.2
Git commit (client): a1598d1
2014/03/06 11:11:59 GET /v1.9/version
[/var/lib/docker|3ac5e508] +job version()
[/var/lib/docker|3ac5e508] -job version() = OK (0)
Server version: 0.8.1
Git commit (server): a1598d1
Go version (server): go1.2
Last stable version: 0.8.1
root@rigel:/usr/bin# docker pull ubuntu
root@rigel:/usr/bin# docker run ubuntu echo 'ubuntu on debian'

Y verificamos que está creada

root@rigel:/usr/bin# docker ps -l
2014/03/06 11:24:03 GET /v1.9/containers/json?limit=1
[/var/lib/docker|3ac5e508] +job containers()
[/var/lib/docker|3ac5e508] -job containers() = OK (0)
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS               NAMES
2e7e5b09730b        ubuntu:12.04        echo ubuntu on debia   8 minutes ago       Exit 0                                  compassionate_ritchie  

docker ps -l vendría a ser el equivalente a vzlist -a en openvz, si ejecutamos docker ps veremos que el contenedor aún no está funcionando

root@rigel:/usr/bin# docker ps
2014/03/06 11:29:21 GET /v1.9/containers/json
[/var/lib/docker|3ac5e508] +job containers()
[/var/lib/docker|3ac5e508] -job containers() = OK (0)
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

Algunas anotaciones y comandos mas de docker, recordad que aún no me he manejado nunca con docker y no tengo ni idea de como funciona hehe pero hay un manual que os recomiendo seguir, también los docs de docker.

Para ejecutar cosas dentro del contenedor vamos a usar “docker run comando” siendo comando lo que queremos ejecutar dentro del contenedor. Por ejemplo para ejecutar una terminal bash en el contenedor:

root@rigel:/usr/bin# docker run -i -t ubuntu /bin/bash
root@26c86d1db2ef:/# 

Para ver la configuración y datos del contenedor usamos “docker inspect id”, por ejemplo del contenedor que he creado antes:

root@rigel:/usr/bin# docker inspect 2e7e5b09730b

Comentar que docker funciona un poco distinto a openvz, según lo que me han contado tu tienes los contenedores y puedes tener versiones de estos (se hacen copias incrementales), así que entiendo que puedes tener un contenedor con varios programas ya preinstalados y a partir de ahí tener una base para hacer las configuraciones especificas de cada uno, incluso que puedes tener varias versiones del mismo por si quieres realizar cambios. Así que la horrorosa tarea de crear contenedores que había en openvz se soluciona y es mucho más versátil.
Por lo que he visto tienes un repositorio de distribuciones linux que puedes instalar. Con docker search , sería un símil al apt-cache search. Hay mogollón de contenedores precreados! supongo que podrás contribuir a subir de nuevos! :)

Ahora mismo ando un poco perdida, así que espero que en pocos días va a caer otro manual de como manejarse un poco mas con docker :P

De momento espero que este manual sirva de ayuda hasta donde haya llegado!

Fuente: boronine.com

3 Comments

Deixa un comentari

L'adreça electrònica no es publicarà. Els camps necessaris estan marcats amb *

Aquest lloc utilitza Akismet per reduir els comentaris brossa. Apreneu com es processen les dades dels comentaris.