Docker: una pequeña introducción y algunos comandos útiles para tener a mano.

22/06/2018 | Autor: Eduardo Enriquez

¿Qué es Docker?

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. Con otras palabras, gracias a unas increibles features del kernel Linux (principalmente cgroups y namespaces), un contenedor de Docker no requiere de un sistema operativo independiente.

container

Docker es una plataforma de software que te permite crear, probar e implementar aplicaciones rápidamente. Docker empaqueta software en unidades estandarizadas llamadas contenedores que incluyen todo lo necesario para que el software se ejecute, incluidas bibliotecas, herramientas de sistema, código y tiempo de ejecución. Con Docker, puede implementar y ajustar la escala de aplicaciones rápidamente en cualquier entorno con la certeza de saber que su código se ejecutará.

¿Qué es un container?

A diferencia de una virtual machine (VM) un container es un ambiente mucho más controlado. Los servicios que corren están más controlados de la misma forma que las interfaces de red o los archivos que puede leer y escribir. En este sentido, su aislamiento es una ventaja que incluso trae aparejado un menor consumo de recursos. 

 

A la acción, algunos comandos básicos de docker

 

PULL - Los containers corren imagenes esas imágenes se pueden bajar:

docker pull python

 

IMAGES - Listar todas las imagenes bajadas:

$ docker images

REPOSITORY              TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
python                 latest              c51f86c28340        4 weeks ago         1.109 MB

 

RUN - Correr una imagen en un container:

docker run python

Cuando se llama a run, el cliente de Docker encuentra la imagen (python en este caso), carga el contenedor y luego ejecuta un comando en ese contenedor. Cuando hacemos docker run python a secas no estamos proporcionamos un comando y entonces docker corre la image de python en un contendor, no ejecuta nada porque no hay comando y luego sale. Por eso no hay salida del comando y parece que nada ha pasado.

Fijensé la diferencia con este comando:

$ docker run -ti python
Python 3.7.0 (default, Jul 17 2018, 11:04:33)
[GCC 6.3.0 20170516] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

O este otro:

$ docker run python echo 'hola mundo!'
hola mundo!

También podemos usar busybox que es una imagen con casi todas las funcionalidades de un sistema tipo unix. 

$ docker run -it busybox sh
/ # ls
bin   dev   etc   home  proc  root  sys   tmp   usr   var
/ # ls -l
total 36
drwxr-xr-x    2 root     root         12288 Jul 31 20:20 bin
drwxr-xr-x    5 root     root           360 Aug 15 20:33 dev
drwxr-xr-x    1 root     root          4096 Aug 15 20:33 etc
drwxr-xr-x    2 nobody   nogroup       4096 Jul 31 20:20 home
dr-xr-xr-x  165 root     root             0 Aug 15 20:33 proc
drwx------    1 root     root          4096 Aug 15 20:33 root
dr-xr-xr-x   13 root     root             0 Aug 15 20:33 sys
drwxrwxrwt    2 root     root          4096 Jul 31 20:20 tmp
drwxr-xr-x    3 root     root          4096 Jul 31 20:20 usr
drwxr-xr-x    4 root     root          4096 Jul 31 20:20 var
/ # uname -a
Linux ed5b6deafa10 4.9.93-linuxkit-aufs #1 SMP Wed Jun 6 16:55:56 UTC 2018 x86_64 GNU/Linux

También incluso podemos correr un container con ubuntu 16.04:

docker run ubuntu:16.04

Si corremos a secas el run sin haber hecho previamente un pull, docker se encargará de bajarse la imagen de Ubuntu 16.04 para poder ejecutarla en nuestro container. Vale aclarar que hay un repositorio público de imagenes. En dicho repositorio Ubuntu tiene un lugar oficial: https://hub.docker.com/_/ubuntu/

Bueno pero para correr el container de modo interactivo, esto es no solo correr el container con una imagen de Ubuntu y acceder adentro de dicho container, el comando es:

docker run -it ubuntu:16.04

Los parametros -it especifican, por un lado, el modo interactivo y por otro lado la posibilidad de acceder a una pseudo interfaz de terminal TTY. Recordemos la diferencia entre una terminal y una consola:

  • terminal = tty = entorno de entrada y salida de texto (stdin and stdout)
  • console = sería una terminal fisica con acceso a terminal
  • shell = es un intérprete de linea de comandos

 

PS - Fijarse los containers que están corriendo:

docker ps

Si queremos ver todos incluso lo que no estan corriendo:

$ docker ps -a

CONTAINER_ID  IMAGE      COMMAND       CREATED       STATUS     PORTS NAMES
ed5b6deafa10  busybox    "sh"          25min ago     Exited (0)       sad_haibt
fe5258b6b9ba  python:3.7 "echo holas!" About 1hr ago Exited (0)       vigilant_swirles

 

BORRAR - Para eliminar alguna imagenes necesitamos usar rmi un alias para remove images (para forzar tenemos -f en el caso que hay un container corriendo esa imagen)
docker rmi <hash de imagen>

Para eliminar un container:

docker rm <hash>

docker images

Para seguir leyendo: algunos tips más para ir perdiéndole el miedo a las imágenes y los contenedores