Docker es un proyecto de código abierto que automatiza el despliegue de aplicaciones dentro de contenedores de software, proporcionando una capa adicional de abstracción y automatización de Virtualización a nivel de sistema operativo en Linux. Docker utiliza características de aislamiento de recursos del kernel de Linux, tales como cgroups y espacios de nombres (namespaces) para permitir que «contenedores» independientes se ejecuten dentro de una sola instancia de Linux, evitando la sobrecarga de iniciar y mantener máquinas virtuales.

El soporte del kernel de Linux para los espacios de nombres4 aísla de vista, en su mayoría, una aplicación del entorno operativo, incluyendo árboles de proceso, red, ID de usuario y sistemas de archivos montados, mientras que los cgroups del kernel proporcionan aislamiento de recursos, incluyendo la CPU, la memoria, el bloque de E / S y de la red. Desde la versión 0.9, Docker incluye la biblioteca libcontainer como su propia manera de utilizar directamente las facilidades de virtualización que ofrece el kernel de Linux, además de utilizar las interfaces abstraídas de virtualización mediante libvirt, LXC (Linux Containers) y systemd-nspawn.

Podemos ver la documentación en Docker-Docs

Docker puede utilizar diferentes interfaces para acceder a las capacidades de virtualizacion del kernel de Linux

Para instalar docker en debian jessie debemos instalar el paquete desde el repositorio «backports», para ver donde se encuentra un paquete, nos dirigimos a un navegador e insertamos esta direccion packages.debian.org/[nombre_paquete]

El paquete donde se encuentra docker es docker.io lo hemos podido observar porque buscamos un paquete que su función sea (Linux Container Runtime)

Para instalar un paquete desde jessie_backports debemos ejecutar el siguiente comando apt -t rama-backports install nombre_del_paquete

Donde:

rama: Se deberá sustituir por la rama de Debian estable que estamos usando(En nuestro caso «jessie»).

nombre_del_paquete: Se deberá sustituir por el nombre de los paquetes que queremos instalar.

Por tanto para instalar el paquete docker ejecutamos el siguiente comando apt -t jessie-backports install docker.io

Primeros pasos con Docker

Lo mas recomendable es agregar nuestro usuario a el grupo «docker»:

root@Juanlu-PC:/home/juanlu# adduser juanlu docker
Añadiendo al usuario `juanlu' al grupo `docker' ...
Añadiendo al usuario juanlu al grupo docker
Hecho.
Info! En mi caso mi usuario es juanlu, pero es usuario varia según el usuario de vuestra maquina.

Para comprobar que tenemos docker instalado cerramos la sesión y ya podemos comprobarlo con un docker ps

Instalar un contenedor

Para importar la imagen de debian debemos ejecutar el siguiente comando docker pull debian

Listar imágenes en nuestro host

Si queremos ver las imágenes que tenemos en docker de nuestro host ejecutamos docker images

Ejecutar un contenedor

Arrancar un contenedor y ejecutar un comando docker run -t debian echo "Hola!"

Contenedores arrancados o apagados

Y por ultimo para ver que contenedores hemos arrancado o tenemos arrancado docker ps -a, podemos observar que con el comando anteriormente ejecutado el contenedor se ha arrancado a realizado una tarea y el contenedor se ha apagado.

Eliminar un contenedor

Para eliminar un contenedor docker rm [CONTAINER ID]

Comprobar salida del comando

Para ver la salida del comando basta con ejecutar el siguiente comando docker logs [CONTAINER ID]

Arrancar contenedor con /bin/bash/

Mientras yo no ejecute el siguiente comando docker run -i -t debian /bin/bash nunca voy a tener una terminal para poder ejecutar distintos comandos, una vez arrancado el contenedor podemos ejecutar tantos comandos como necesitemos.

-i, –interactive=false Keep STDIN open even if not attached
-t [Nombre_Template] Template

Dicho contenedor podemos ejecutar todos los comandos comunes en un Debian.

Por ejemplo tenemos una direccion ip por eth0 que esta conectado a un bridge en nuestra maquina que se llamara Docker0 dicho bridge se creara en nuestra maquina anfritiona al instalar el paquete docker.

Red Contenedor

Podemos observar haciendo un simple ping 8.8.8.8 dado que tenemos un bridge interior que conecta con una regla de «ip tables» a la interfaz de red de nuestro host

Buscar un contenedor

Para buscar un contenedor ejecutamos lo siguiente docker search training/[Nombre]

Descargar contenedor con apache

Como regla general la maquina tendra el siguiente nombre training/[Nombre]

La maquina que contiene apache es «training/webapp» docker pull training/webapp

Eliminar imagenes

Para borrar una imagen solo debemos en la terminal ejecutar lo siguiente docker rmi [CONTAINER ID]

Eliminar un contenedor

Para eliminar un contenedor ejecutamos el siguiente comando docker rm [ID_CONTENEDOR]

Crear una imagen a partir de otra maquina

Cuando ya tenemos una maquina la cual tenemos preparada para nuestro trabajo podemos crear una imagen a partir de esa.

Peligro!!!! Es importante saber que si la maquina tiene datos nuestros o documentacion importante la cual no quieres que nadie tenga acceso es recomendable no subirla a docker Hub.

Para crear la imagen ejecutamos el siguiente comando docker commit [CONTAINER_ID] [Nombre_Imagen] si queremos añadirla al «DockerHub» antes de la imagen vamos a añadir nuestro usuario creado en «DockerHub» docker commit [CONTAINER_ID] [Nombre_Usuario]/[Nombre_Imagen]

Debemos tener en cuenta que para poder arrancar un servicio en un contenedor debemos especificarlo, dado que no va a arrancar ningún proceso, si necesitamos arrancar el proceso ejecutamos el siguiente comando docker run -t [Nombre_Imagen] [Servicio a arrancar] por ejemplo el servicio a arrancar el de apache apache2ctl start

Info! El servicio de apache es un servicio que se ejecuta en segundo plano por eso tendremos que arrancarlo en primer plano docker run -t [Nombre_Imagen] [Servicio a arrancar] -D FOREGROUND.

Ya podemos observar que arranca el servidor apache pero en primer plano

Redirigir el puerto sea accesible desde otras maquinas

Para redirigir el puerto es tan simple como añadir -p [Puerto_destino]:[Puerto_origen], por ejemplo, docker run -p 8000:80 -t debian-apache2 apache2ctl -D FOREGROUND