2. Docker

2.7. Crear tu propia imagen Docker

Si tu búsqueda en Docker Hub ha sido infructuosa o requieres una imagen específica para tus necesidades, la solución es crearla tú mismo.

En primer lugar, instalaremos software en una sesión interactiva. Para ello utilizaremos la imagen de Alpine que previamente habíamos creado e intentaremos instalar en paquete de python numpy. Alpine no es la distribución en la que querríais basaros para desarrollar vuestros proyectos; seguramente Ubuntu o Debian sean unas elecciones más apropiadas. Antes de empezar una imagen es importante que sepáis qué necesitaréis instalar, cuáles son vuestros requerimientos y escoger la distribución más apropiada. También es una buena práctica no instalar muchos programas en cada imagen, ya que serán más difíciles de crear y mantener. Es la misma filosofía que aplicábamos a los entornos Conda.

$ docker container run -it alpine sh

Seguidamente comprobaremos si tenemos Python instalado:

/ # python --version

Y podemos observar que no está instalado.

Alpine tiene un gestor de paquetes llamado Alpine Package Keeper (apk) para instalar software. Dependiendo de la distribución de Linux que os hayáis instalado podríais utilizar apt-get, yum, zypper

En primer lugar, instalaremos Python y otros paquetes necesarios, y posteriormente el paquete numpy.

/ # apk --no-cache --update-cache add gcc gfortran python3 py3-pip python3-dev build-base wget freetype-dev libpng-dev openblas-dev

/ # pip install numpy

Si ahora entramos en Python podemos comprobar que se ha instalado correctamente el paquete numpy.

Una vez salgas de este contenedor los cambios no se habrán guardado. Para crear tu propia imagen lo más recomendable es utilizar un Dockerfile.

Un Dockerfile es un archivo de texto con la siguiente estructura mínima:

  • FROM <Imagen preexistente>
  • RUN <Comandos para instalar desde la línea de comandos>
  • CMD <Comandos que deben correrse por defecto>

Las instrucciones que se lanzan por defecto (CMD) tienen una estructura definida. Solo puede haber una línea de CMD en el Dockerfile; si hubiera más de una se ejecutaría la última.

Así si quisiéramos reproducir el contenedor anterior deberíamos crear un archivo nombrado Dockerfile de la siguiente manera:

FROM alpine

RUN apk --no-cache --update-cache add gcc gfortran python3 py3-pip python3-dev build-base wget freetype-dev libpng-dev openblas-dev

RUN pip install numpy

CMD python3 --version

Una vez tenemos el Dockerfile definido crearemos la imagen:

$ docker image build -t uoc/numpy .

La opción -t nos indica el nombre que le queremos dar a nuestra imagen. Siguiendo la nomenclatura anteriormente mencionada indicamos el autor y el paquete. El «.» nos indica que Dockerfile está en la misma carpeta donde estamos ejecutando los comandos; debemos especificar la ruta al directorio del Dockerfile.

Ahora podréis ver la nueva imagen creada:

$ docker image ls

Tabla 3.

REPOSITORY        TAG IMAGE ID      CREATED        SIZE
uoc/numpy latest af1700de32cb 25 minutes ago 588MB

Si corremos el contenedor Docker nos devolverá la versión de Python que tenemos instalada en la imagen:

$ docker container run uoc/numpy

Si entrásemos comandos en la línea de ejecución del contenedor, estos son los que se utilizarían en detrimento de los que estuviesen en el Dockerfile. Así:

$ docker container run uoc/numpy which python3

Te indicará la localización de Python3 en el filesystem del contenedor.