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=
Sintaxis: ADD [–chown=
Sintaxis: COPY [–chown=
Sintaxis: COPY [–chown=
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.
Pingback: Caso real de despliegue con Docker Compose – Blackhold