Introducción al trabajo con Dockerfile

Continuamos con los posts de Docker, en éste otro post hemos visto los comandos básicos para manejarnos con docker. Ahora vamos a entrar con Dockerfile para después centrarnos en docker-compose.

DOCKERFILE
El dockerfile consiste en un fichero con el nombre “Dockerfile” el cual contiene una “receta” para construir una imagen para después desplegarla como contenedor. Éste fichero lo encontraremos solo o acompañado de ficheros que se usarán para el despliegue del contenedor. Éste fichero tiene unas palabras reservadas que atienden a lo siguiente (se describen los mas usados):

FROM indica cuál es la imagen en la que se basa el contenedor que vamos a crear

MAINTAINER los datos del autor de la imagen
Sintaxis: MAINTAINER

RUN Esta instrucción ejecuta cualquier comando en una capa nueva encima de una imagen y hace un commit de los resultados. Esa nueva imagen intermedia es usada para el siguiente paso en el Dockerfile. Cuando creamos una imagen nos interesa hacerla con el mínimo de capas posible. RUN tiene 2 formatos
Sintaxis: RUN comando
Sintaxis: RUN [“ejecutable”, “parametro1”, “parametro2”]

ENV variables de entorno a pasar al crear el contenedor (-e)
Éstas variables pueden usarse dentro de cualquier fichero del entorno, por ejemplo un script ejecutable. Éstos son los valores por defecto a menos que se especifique otro en -e
Sintaxis: ENV key value
Sintaxis: ENV key=value

ADD/COPY copiar ficheros o directorios que se encuentran en el mismo sitio que el Dockerfile hacia dentro del contenedor. ADD permite descargar un fichero alojado por http.

Sintaxis: ADD [–chown=:] src1 src2 dst
Sintaxis: ADD [–chown=:] [“src1”, “src2”, “dst”]
Sintaxis: COPY [–chown=:] src1 src2 dst
Sintaxis: COPY [–chown=:] [“src1”, “src2”, “dst”]

EXPOSE puertos a exponer (-P y -p)
Sintaxis: EXPOSE 80 443

CMD el comando por defecto a ejecutar cuando utilicemos esta imagen. Es el punto de entrada a la imagen si no especificamos otro comando con RUN o CREATE. En un dockerfile sólo puede existir un CMD

ENTRYPOINT

VOLUME mapear un directorio del host de dentro la imagen. Se pueden mapear múltiples directorios. Éstos a menos que se especifique lo contrario con -v en el docker run, va a mapearlas en el host en /var/lib/docker/volumes/
Ejemplo:

FROM debian
RUN mkdir /myvol
RUN echo "hello world" > /myvol/greeting
VOLUME /myvol

WORKDIR Este comando nos permitirá indicarle a Docker cual es el directorio por default donde ejecutara las acciones
Sintaxis: WORKDIR /var/www/html

USER Por defecto, todos los comandos son ejecutados como el usuario root. A través de esta expresión podemos cambiar el usuario
Sintaxis: USER usuario/uid

LABEL Es información extra que podemos añadir a la imagen

HEALTHCHECK Comando a ejecutar para comprobar que el contenedor funciona correctamente
Sintaxis: HEALTHCHECK –interval=2m –timeout=3s CMD curl -f http://127.0.0.1/ || exit 1
• –interval=duración: indica el intervalo de comprobación, por defecto 30s.
• –timeout=duración: indica el tiempo de espera para la comprobación, por defecto también 30s.
• –retries=intentos: el numero de intentos antes de declarar un contenedor como fallido.

STOPSIGNAL

ONBUILD

Un ejemplo muy básico de Dockerfile sería

root@docker-master:~/tests/debian_and_update# vi Dockerfile
FROM debian:latest
RUN apt-get update && apt-get install -y vim
CMD /bin/bash

Construir un Dockerfile

root@docker-master:~/tests/debian_and_update# docker build --no-cache --rm --pull -t debian_and_update:v1 .
Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM debian:latest
latest: Pulling from library/debian
Digest: sha256:8414aa82208bc4c2761dc149df67e25c6b8a9380e5d8c4e7b5c84ca2d04bb244
Status: Image is up to date for debian:latest
 ---> 1510e8501783
Step 2/3 : RUN apt-get update && apt-get install -y vim
 ---> Running in c4a1e57d9b8c
Get:1 http://security.debian.org/debian-security buster/updates InRelease [65.4 kB]
[...]
update-alternatives: using /usr/bin/vim.basic to provide /usr/bin/editor (editor) in auto mode
Processing triggers for libc-bin (2.28-10) ...
Removing intermediate container c4a1e57d9b8c
 ---> 0337a63c500b
Step 3/3 : CMD /bin/bash
 ---> Running in e7e914c0d427
Removing intermediate container e7e914c0d427
 ---> 6779ba04cfb6
Successfully built 6779ba04cfb6
Successfully tagged debian_and_update:v1

Los parámetros que le podremos pasar a docker build son:
-t nombre[:etiqueta]
–no-cache Por defecto. Docker guarda en memoria cache las acciones realizadas recientemente. Si nosotros ejecutamos docker build varias veces, Docker comprobará si el fichero Dockerfile contiene las mismas instrucciones y en caso afirmativo, no genera una nueva imagen. Para generar siempre una nueva imagen sin hacer caso a la memoria utilizaremos esta opción.
–pull Por defecto. Docker sólo descargará la imagen especificada en la expresión FROM si no existe. Para forzar que descargue la nueva versión de la imagen utilizaremos esta opción.
–quiet por defecto se muestra todo el proceso de creación, los comandos ejecutados y su salida. Utilizando esta opción sólo mostrará el identificador de la imagen creada.
–rm elimina el contenedor una vez se pare

Vemos como ha creado la imagen

root@docker-master:~/tests/debian_and_update# docker images |grep debian
debian_and_update        v1                  6779ba04cfb6        16 seconds ago      165MB
debian                   latest              1510e8501783        3 weeks ago         114MB

Y para desplegarla, veremos que el CMD corresponde a ejecutar /bin/bash

root@docker-master:~/tests/debian_and_update# docker run -dti --name debian_updated debian_and_update:v1
6c7c4a6435030af874a5468e4555fbc74a7acef2f38f307690af7e7fddec262d

root@docker-master:~/tests/debian_and_update# docker ps -l
CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS               NAMES
6c7c4a643503        debian_and_update:v1   "/bin/sh -c /bin/bash"   6 seconds ago       Up 5 seconds                            debian_updated

A partir de aquí sólo nos queda ir leyendo Dockerfiles e ir viendo como los desarrolladores/sysadmins despliegan imágenes. En DockerHub es posible ver miles de Dockerfiles de ejemplo. Aquí os dejo algunos Dockerfile sencillitos

FROM ubuntu:trusty
RUN apt-get update \
    && apt-get install -y \
       python \
       python-pip \
       wget \
    && pip install Flask
COPY webtest.py webtest.py
EXPOSE 5000
ENTRYPOINT ["python"]
CMD ["webtest.py"]
FROM jboss/wildfly:10.1.0.Final

ADD https://downloads.mariadb.com/Connectors/java/connector-java-1.5.9/mariadb-java-client-1.5.9.jar /opt/jboss/wildfly/modules/system/layers/base/org/mariadb/jdbc/main/
COPY librerias/module.xml /opt/jboss/wildfly/modules/system/layers/base/org/mariadb/jdbc/main/
ADD aplicacion/Aplicacion.war /opt/jboss/wildfly/standalone/deployments/

RUN /opt/jboss/wildfly/bin/add-user.sh admin Admin#123 --silent

EXPOSE 9990
FROM debian:wheezy
ENTRYPOINT ["/bin/ping"]
CMD ["localhost"]

Algunos textos y ejemplos son del curso de DevOPs que estoy haciendo. Fuente.

Deixa un comentari

L'adreça electrònica no es publicarà. Els camps necessaris estan marcats amb *

Aquest lloc utilitza Akismet per reduir els comentaris brossa. Apreneu com es processen les dades dels comentaris.