Contenedores Docker

Docker es un proyecto que se basa en la contenedorización. Los contenedores Docker son pequeños sistemas encapsulados e independientes (tienen su propio árbol de procesos, sus interfaces de red ..) y se pueden limitar los recursos que se asignan a cada contenedor.

 
Docker (container engine) logo
 

Autoría de la imagen: dotCloud, Inc.

 

 
En este artículo:

 

 

 

 

 

1. Contenedores Docker VS Máquinas Virtuales (Diferencia entre Docker y virtualización)

 

Los contenedores Docker se ejecutan como un proceso, y consumen poca memoria. Están optimizados. El contenedor comparte el Kernel de la máquina host con otros contenedores.
 
Una máquina virtual, sin embargo, consume más recursos. Una máquina virtual ejecuta un sistema operativo invitado completo con acceso virtual a los recursos del host. Normalmente con las máquinas virtuales ofrecen más recursos de los que una aplicación necesita.
 
Por tanto en este sentido, los contenedores Docker están más optimizados porque son independientes y pueden limitarse los recursos asignados.

 

 

1.1 Diferencia entre contenedores Docker y Máquina Virtual:

 
diferencia contenedores docker maquina virtual

 

 

1.2 Cómo funciona un contenedor Docker

 

Un contenedor se inicia ejecutando una imagen. El archivo Dockerfile define una imagen, y por tanto cómo será el contenedor que se creará a partir de esa imagen. Por tanto, un contenedor es una instancia de una imagen.
 
–> Documentación oficial sobre imagenes en Docker.

 

 

Y ese Dockerfile (que es un documento de texto) contiene todos los comandos que normalmente se ejecutan manualmente para construir una imagen para Docker. Docker puede leer las instrucciones de el archivo Dockerfile y construir una imagen para Docker automáticamente.
 

 

1.3 Crear una imagen desde un Dockerfile

 
Para crear una imagen de Docker, necesitaremos crear un archivo Dockerfile.

Como ejemplo de Dockerfile mostramos este de Træfik:
 
traefik dockerfile
 

FROM hypriot/rpi-alpine:3.6
ADD https://github.com/containous/traefik/releases/download/v1.3.8/traefik_linux-arm /traefik
RUN apk upgrade --no-cache &&\
apk add --no-cache ca-certificates &&\
chmod +x /traefik
EXPOSE 80 8080 443
ENTRYPOINT ["/traefik"]

 

Podemos crear una imagen Docker desde un archivo Dockerfile con el comando:

docker build -t nombre_imagen .

 
en nuestro caso

docker build -t hey .
docker build -f /path/to/a/Dockerfile .

 
Docker ejecutará las ordenes contenidas en el archivo Dockerfile y construirá la imagen. A continuación podemos ver la imagen Docker que hemos creado:
 
docker image creada dockerfile

 

 

e iniciamos el contenedor basado en esa imagen:

docker run -dit mi_imagen nombre_contenedor

 

Y comprobamos que el contenedor se está ejecutando
 
docker contenedor creado imagen

 

Respecto a las imagenes: Si el sistema no encuentra una imagen, intentará conectarse a Docker Hub para descargarla si existe.

contenedor docker corriendo
 

 

1.4 Ejemplo de creación de contenedor con una imagen ya creada (descargada de Docker Hub)

 
En este caso vamos a descargar una imagen ya compilada para poder crear un contenedor en una máquina con Docker.

Recordemos que los contenedores que ejecutemos en Raspberry Pi han de provenir de imagenes compiladas para Raspberry (arquitectura ARM),
 
podemos utilizar el repositorio de Hypriot en Docker Hub: https://hub.docker.com/u/hypriot/

, y otros repositorios para ARM.
 

Y elegimos el servidor web de Hypriot

hypriot httpd web server docker image raspberry arm

 

 
Nos vamos a la terminal y lo descargamos (vemos que en el enlace de Hypriot, nos indica el comando necesario para descargar la imagen):

docker pull hypriot/rpi-busybox-httpd

 
docker pull-descargar imagen docker de repositorio
 

 
Y ahora podremos ver la imagen disponible en Portainer (la interfaz gráfica que podemos instalar para gestionar un clúster, o Swarm de Docker):

docker portainer images
 

 
Y estas imagenes también podemos verlas por terminal, con

docker image ls

 
docker image ls
 

 

1.5 Comandos de docker image:

 
docker image

 

  • build : construye una imagen desde un Dockerfile.
  • history : muestra el historial de una imagen Docker.
  • import : importa el contenido de un archivo especial tarball, para crear una imagen de un sistema de archivos.
  • inspect : Muestra información detallada de una o más imagenes.
  • load : Carga una imagen de un archivo tar o STDIN.
  • ls : lista imagenes.
  • prune : elimina las imagenes no utilizadas.
  • pull : extrae una imagen o un repositorio procedente un registro Docker.
  • push : Sube/carga una imagen o un repositorio hacia un registro Docker.
  • rm : elimina una o más imagenes.
  • save : guarda una o más imagenes en un archivo tar.
  • tag : crea una etiqueta imagen_destino que referencia a una imagen fuente u origen.

 

 

Y ahora procedemos a crear el contenedor Docker con la imagen

 

sudo docker run -d -p puerto_real:puerto_container imagen
o sea:
docker run -d -p 80:80 fbd9685c5f

 
o

docker run -d -p 80:80 hypriot/rpi-busybox-httpd

 

Y accediendo a la IP de la máquina veremos que el contenedor que realiza la función de Servidor Web, se está ejecutando:

contenedor web server docker funcionando
 

 

Comandos Docker Container

 
Podemos comprobar que el sistema muestra los contenedores en funcionamiento con:

docker container ls

 
crear contenedor docker run
 

 

Y en Portainer podremos verlos también:

 
portainer docker containers
 
Se puede ver la lista de contenedores Docker en ejecución con el comando:

docker container ps

 
Para ver el estado de los contenedores:

docker container stats

 
docker container stats
 
El comando nos mostrará las columnas:

  • ID del contenedor
  • Nombre.
  • Porcentaje de CPU utilizado.
  • Memoria utilizada/Límite de Memoria.
  • Porcentaje de memoria utilizada.
  • NET I/O (el tráfico de red).
  • BLOCK IO (las lecturas y escrituras físicas en disco).

 

 

Otros comandos de Docker Container:

 
docker container commands
 

 

Crear Contenedores Docker desde PORTAINER:

 
Vamos a crear un contenedor Docker en Portainer.

Es importante que prestemos atención a estos parámetros:

  • Nombre identificativo del contenedor
  • Ports configuration
  • Command
  • Network
  • Runtime & Resources

 

crear contenedor docker en portainer

 

 

Desde esta última opción (Runtime & Resources) podremos elegir los recursos que consumirá este contenedor:

portainer docker container runtime and resources
 

 
Ahora comprobaremos que el nuevo contenedor ha sido creado y se está ejecutando en el puerto 84 tal y como hemos configurado:

contenedor docker portainer funcionando

 

 

CONCLUSIÓN

 

Hemos visto qué son los contenedores Docker, cómo funcionan y cómo se construyen.

También hemos hablado de los archivos Dockerfile, cómo usarlos para crear imagenes Docker, y su uso en los contenedores Docker.

Y por último hemos hecho un pequeño repaso de los comandos que podemos usar con docker image (gestionar imagenes Docker) y docker container (gestionar Contenedores Docker).

Ahora es momento de comenzar a practicar lo explicado.
 
Para más info puedes revisar también los artículos: