2. Docker

2.7. Crear la teva pròpia imatge Docker

Si la nostra cerca a Docker Hub ha estat infructuosa o requerim una imatge específica per a les nostres necessitats, la solució és crear-la nosaltres mateixos.

En primer lloc, instal·larem software en una sessió interactiva. Amb aquesta finalitat, utilitzarem la imatge d’Alpine que prèviament havíem creat i intentarem instal·lar el paquet de python numpy. Alpine no és la distribució en la qual voldríem basar-nos per desenvolupar els nostres projectes; segurament Ubuntu o Debian siguin unes eleccions més apropiades. Abans de començar una imatge és important que tinguem ben clar què necessitarem instal·lar, quins són els nostres requisits i, finalment, escollir la distribució més apropiada. També és una bona pràctica no instal·lar massa programes en cada imatge perquè seran més difícils de crear i de mantenir. És la mateixa filosofia que aplicàvem als entorns Conda.

$ docker container run -it alpine sh

Seguidament comprovarem si tenim Python instal·lat:

/ # python --version

I podem observar que no està instal·lat.

Alpine té un gestor de paquets anomenat Alpine Package Keeper (apk) per instal·lar software. Depenent de la distribució de Linux que tinguem instal·lat, podríem utilitzar apt-get, yum, zypper

En primer lloc, instal·larem Python i altres paquets necessaris. Posteriorment, afegirem el paquet 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 ara entrem a Python podem comprovar que s’ha instal·lat correctament el paquet numpy.

Un cop sortim d’aquest contenidor, els canvis no s’hauran guardat. Per crear la nostra pròpia imatge, el més recomanable és utilitzar un Dockerfile.

Un Dockerfile és un arxiu de text amb l’estructura mínima següent:

  • FROM <Imatge preexistent>
  • RUN <Ordres per instal·lar des de la línia d’ordres>
  • CMD <Ordres que s’han de córrer per defecte>

Les instruccions que es llancen per defecte (CMD) tenen una estructura definida. Només hi pot haver una línia de CMD al Dockerfile; si n’hi hagués més d’una, s’executaria l’última.

Així, si volguéssim reproduir el contenidor anterior, hauríem de crear un arxiu anomenat Dockerfile de la següent 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

Un cop tenim el Dockerfile definit crearem la imatge:

$ docker image build -t uoc/numpy .

L’opció -t ens indica el nom que li volem donar a la nostra imatge. Seguint la nomenclatura anteriorment esmentada indiquem l’autor i el paquet. El «.» ens indica que Dockerfile és a la mateixa carpeta on estem executant les ordres; hem d’especificar la ruta al directori del Dockerfile.

Ara podreu veure la nova imatge creada:

$ docker image ls

Taula 3.

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

Si executem el contenidor Docker, ens retornarà la versió de Python que tenim instal·lada a la imatge:

$ docker container run uoc/numpy

Si entréssim ordres en la línia d’execució del contenidor, aquestes són les que s’utilitzarien en detriment de les que estiguessin al Dockerfile. Així:

$ docker container run uoc/numpy which python3

Ens indicarà la localització de Python3 en el filesystem del contenidor.