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.