Cómo instalar, configurar y usar Docker Linux Containers

Qué es Docker

Docker Linux ContainersDocker es un software Open Source que hace uso del sistema de contenedores en Linux, permitiendo añadir una capa de abstracción (virtualización) a nivel de sistema operativo y poder ejecutar varias instancias de un sistema/contendor/software dentro de un único sistema Linux. Esto permite automatizar y lanzar en cuestión de segundos contenedores con distintos sistemas operativos Linux, además hay una gran cantidad imágenes preestablecidas con sistemas y software ya instalado descargables e indexadas directamente desde el buscador de Docker. Su facilidad de instalación, configuración, rendimiento y portabilidad lo hacen ideal para tener entornos de desarrollo o ejecución de aplicaciones de forma compleetamente aislada en un mismo entorno.

Cómo instalar Docker

Docker está disponible a través de repositorios, vamos a ver como instalarlo en RHEL y CentOS, tanto en versión 6 como 7.

RHEL 7

RHEL 7 ofrece el RPM de docker a través del repositorio RHEL Server Extras. Es necesario activarlo para posteriormente instalar docker:

# subscription-manager repos --enable=rhel-7-server-extras-rpms
# yum install docker

CentOS 7

CentOS 7 también ofrece docker a través de sus repositorios oficiales, en este caso a través de CentOS Extras. Es necesario pues, activar el repositorio de Extras y ejecutar la instalación .

Ejemplo de repositorio de extras:

/etc/yum.repos.d
[extras]
name=CentOS-$releasever - Extras
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras
baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch
enabled=1
gpgcheck=0
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-centos
protect=0 

CentOS y RHEL 6

En la versión 6 de CentOS y RHEL todavía no se ofrecía Docker en los repositorios oficiales pero sí que están disponibles en el repositorio de terceros EPEL:

# wget http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
# yum install epel-release-7-2.noarch.rpm

En este caso se instala con el nombre de paquete “docker-io”:

# yum install docker-io

Activar y arrancar docker

En el caso de CentOS y RHEL 6:

# chkconfig docker on
# service docker start

Y en RHEL y CentOS 7:

# systemctl enable docker
# systemctl start docker

Ver información de Docker

A partir de aquí, toda la gestión de docker se realiza con el comando “docker” seguido de los distintos parámetros. En primera instancia, para tener una visión general de docker, como por ejemplo el número de imagenes disponibles en el sistema, número de contenedores, versión, almacenamiento, etc:

# docker info
Containers: 2
Images: 3
Storage Driver: devicemapper
 Pool Name: docker-202:2-2712-pool
 Pool Blocksize: 64 Kb
 Data file: /var/lib/docker/devicemapper/devicemapper/data
 Metadata file: /var/lib/docker/devicemapper/devicemapper/metadata
 Data Space Used: 712.4 Mb
 Data Space Total: 102400.0 Mb
 Metadata Space Used: 1.0 Mb
 Metadata Space Total: 2048.0 Mb
Execution Driver: native-0.2
Kernel Version: 3.10.0-123.8.1.el7.x86_64
Operating System: Red Hat Enterprise Linux Server 7.0 (Maipo)

Buscar y descargar imágenes de contenedores Docker

A través de la línea de comandos podemos buscar y descargar imágenes tanto de sistemas operativos (CentOS, Debian, Fedora…) como de sistemas operativos + aplicativos y software y preinstalado.

Buscando “centos”, vemos que además de la imagen oficial del sistema operativo (primer resultado), también hay imágenes de terceros con software y aplicaciones ya instaladas:

# docker search centos | more
NAME             DESCRIPTION                                     STARS     OFFICIAL AUTOMATED
centos           The official build of CentOS.                   598       [OK]       
tianon/centos    CentOS 5 and 6, created using rinse instea...   28        [OK]
steeef/graphite-centos    CentOS 6.x with Graphite and Carbon via ng...   6         [OK]
tutum/centos              Centos image with SSH access. For the root...   6         [OK]
tutum/centos-6.4          DEPRECATED. Use tutum/centos:6.4 instead. ...   5         [OK]
gluster/gluster           GlusterFS 3.5 - CentOS 6.5 Docker repo          5         [OK]
ingensi/oracle-jdk        Official Oracle JDK installed on centos.        4         [OK]
[...]

El siguiente paso sería descargar una de estas imágenes para poder ejecutarla en un contenedor. Vamos a descargar las imágenes del sistema Debian, Ubuntu y Fedora:

# docker pull ubuntu
# docker pull fedora
# docker pull debian
Pulling repository debian
b5fe16f2ccba: Pulling dependent layers 
f6fab3b798be: Download complete 
fee2ea4e24af: Pulling dependent layers
511136ea3c5a: Download complete 
f10807909bc5: Download complete 
5a7d9470be44: Downloading [==========================>] 37.16 MB/37.16 MB
798202714a7c: Downloading [==========================>] 37.14 MB/37.14 MB
df7844587b22: Downloading [==========================>] 34.48 MB/34.48 MB
92fd7bcf9115: Pulling fs layer 
3c0b3ee63a7e: Pulling fs layer 
405cce5cd17d: Downloading [==================>        ] 38.18 MB/45.13 MB 5s
584162d19e17: Pulling fs layer 
69807a440ac3: Pulling fs layer 
fc771a104334: Downloading [==========================>]    175 B/175 B
ec3443b7b068: Downloading [==========================>] 37.16 MB/37.16 MB

Una vez descargadas, podemos visualizar todas las imagenes que tenemos descargadas en nuestro sistema, y por ende, disponibles para ejecutar un contenedor con ellas:

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
debian              wheezy              f6fab3b798be        9 days ago          85.1 MB
debian              7                   f6fab3b798be        9 days ago          85.1 MB
debian              7.7                 f6fab3b798be        9 days ago          85.1 MB
debian              latest              f6fab3b798be        9 days ago          85.1 MB
fedora              latest              7d3f07f8de5f        6 weeks ago         374.1 MB

Crear y acceder a un contenedor Docker

Para crear un nuevo contenedor ejecutamos el siguiente comando:

# docker run IMAGEN COMANDO_INICIAL

Por ejemplo, para arrancar un contenedor basado en la imagen “debian” y accediendo directamente a la shell bash:

# docker run -i -t debian /bin/bash

Además, en caso de que la imagen no esté disponible en nuestro repositorio local vemos como la busca y descarga automáticamente:

# docker run -i -t fedora /bin/bash
Unable to find image 'fedora' locally
Pulling repository fedora
7d3f07f8de5f: Download complete 
511136ea3c5a: Download complete 
782cf93a8f16: Download complete

Y en ambos casos, tras la ejecución del comando accedemos a nuestro contenedor fedora con ID “83fada315585”:

[root@83fada315585 /]#

Si queremos crear el contenedor con un nombre personalizado lo podemos especificar con “-name”:

# docker run -name fedora01 fedora /bin/bash

Para detener la ejecución del contenedor ejecutamos el siguiente comando:

# docker stop [container ID]
# docker stop debian01
# docker stop 83fada315585

Guardar cambios realizados en los contenedores

Si no hacemos un “commit” de los cambios que vayamos realizando en el contenedor, al pararlo perderemos toda la información y configuraciones realizadas. El modo de ejecutar el “commit” es el siguiente:

# docker commit ID_CONTENEDOR NOMBRE_IMAGEN
# docker commit 6639d05aa53f fedora
cc8f6edb4f4898279853a938e5e30a14f80065d4409e530a194d91b4848abc41

O si le hemos asignado un nombre personalizado:

# docker commit fedora01 fedora
cc8f6edb4f4898279853a938e5e30a14f80065d4409e530a194d91b4848abc41

Eliminar un contenedor

Para eliminar un contenedor, tan sencillo como pasar el parámetro “rm” a docker seguido del ID de contenedor a borrar:

# docker rm ID_IMAGEN
# docker rm debian01

Ver listado de contenedores

Para realizar las gestiones anteriores de iniciar, parar, guardar un contenedor, etc es necesario conocer ya sea el ID del contenedor o el nombre asignado. La forma más rápida de visualizar estos y otros datos relacionados con los contenedores es el parámetro “ps”:

Rl comando “docker ps” muestra sólo los contenedores activos y “docker ps -l” los activos y parados:

# docker ps -l 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                   PORTS   NAMES
257e1ff40370        fedora:latest       "/bin/bash"         7 seconds ago       Exited (0) 4 seconds ago         sleepy_babbage
d98af487177b        debian:7            "/bin/bash"         12 seconds ago      Exited (127) 3 seconds ago       debian01

Configuración avanzada de red

Con todo lo descrito anteriormente ya se puede empezar a trabajar con Docker y tener una visión de como funciona. A partir de aquí es interesante conocer como funciona la configuración avanzada de red en la cual podemos, entre otras cosas, especificar un bridge de conexión para el contenedor, activar la comunicación entre contenedores, configuración de IPTABLES, DNS, IP, etc. Estos son algunos de los parámetros disponibles a la hora de arrancar el contenedor que establecen estas configuraciones:

Configuración de bridges:

--bridge=BRIDGE

Activar la comunicación entre contenedores:

--icc=true|false

Especificar la IP a la que responderá el contenedor:

--ip=IP_ADDRESS

Habilitar IP Forwarding:

--ip-forward=true|false

Habilitar iptables:

--iptables=true|false

Especificar DNS y dominio de búsqueda DNS:

--dns=IP_ADDRESS
--dns-search=DOMAIN

Todo esto ya son configuraciones avanzadas que es recomendable ir investigando conforme os vais familiarizando con el funcionamiento de Docker. Para una visión inicial esto es suficiente. Para más información y documentación, visitad el sitio web de docker.

6 comentarios en “Cómo instalar, configurar y usar Docker Linux Containers

  1. Muy interesante!

    Básicamente podría por ejemplo iniciar un contenedor por web de cliente, no? Se podría crear un contenedor con un servidor web por cada cliente y tenerlos separados en diferentes entornos, pero finalmente corriendo todos sobre un sistema o servidor.

    Es una idea muy interesante!

  2. Una duda, ¿estás seguro de que la opción “–ip=IP_ADDRESS” que comentas para establecer la ip del conetedor existe? Es que viendo la documentación de docker no la veo por ninguna parte, en mi empresa llevamos un tiempo trabajando con docker y una de las mayores dificultades a las que nos enfrentamos es el hecho de no poder asignar una ip al contenedor y que docker la asigne una automáticamente. Es más, cuando reinicias un contenedor este cambia de ip. En cualquier caso, enhorabuena por el post, me parece que es muy útil para dar a conocer una herramienta genial como es docker ;)

    • No lo he llegado a probar todavía. Quizás lo que hace es que las peticiones que el servidor recibe hacia esa IP son redirigidas al docker. Esto dice la documentación:

      Or if you always want Docker port forwards to bind to one specific IP address, you can edit your system-wide Docker server settings (on Ubuntu, by editing DOCKER_OPTS in /etc/default/docker) and add the option –ip=IP_ADDRESS. Remember to restart your Docker server after editing this setting.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *