0% encontró este documento útil (0 votos)
21 vistas17 páginas

Tutorial Dockerfile

El documento proporciona una guía sobre el uso de Docker y la creación de Dockerfiles para desplegar aplicaciones web, destacando la importancia de las instrucciones en el Dockerfile para construir imágenes de contenedor. Se incluyen ejemplos prácticos de cómo configurar un contenedor con diferentes servicios como MySQL y Nginx, así como instrucciones para publicar imágenes en Docker Hub. Además, se menciona el uso de herramientas como Visual Studio para facilitar la gestión de contenedores.

Cargado por

Sergio Navarro
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
21 vistas17 páginas

Tutorial Dockerfile

El documento proporciona una guía sobre el uso de Docker y la creación de Dockerfiles para desplegar aplicaciones web, destacando la importancia de las instrucciones en el Dockerfile para construir imágenes de contenedor. Se incluyen ejemplos prácticos de cómo configurar un contenedor con diferentes servicios como MySQL y Nginx, así como instrucciones para publicar imágenes en Docker Hub. Además, se menciona el uso de herramientas como Visual Studio para facilitar la gestión de contenedores.

Cargado por

Sergio Navarro
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Despliegue de aplicaciones web

UD 04. Servidores web


Docker. Dockerfile

Revisado Noviembre 2024


Licencia

Reconocimiento – NoComercial - Compartir Igual (BY-NC-SA): No se permite un uso


comercial de la obra original ni de las posibles obras derivadas, la distribución de las cuales
se debe hacer con una licencia igual a la que regula la obra original.

Nomenclatura
A lo largo de este tema se utilizarán distintos símbolos para distinguir elementos importantes
dentro del contenido. Estos símbolos son:

📖 Importante

❕ Atención

💬 Interesante
ÍNDICE DE CONTENIDO
1. Introducción​ 4
2. Instrucciones principales​ 4
3. Dockerfile - Ejemplo​ 6
4. Visual Studio Plugin​ 9
5. Docker - Ejemplo Servidor Web​ 10
6. Docker - Publicar una imagen​ 14
7. Bibliografía​ 17
8. Autores (en orden alfabético)​ 17

UD04. SERVIDORES WEB


1.​ INTRODUCCIÓN

Dockerfile es un archivo de texto que contiene instrucciones para construir una imagen de
contenedor en Docker. El Dockerfile es fundamental para definir cómo se debe construir una
imagen de contenedor.

En un Dockerfile, puedes especificar una serie de comandos y configuraciones que Docker seguirá
para crear una imagen de contenedor. Estos comandos pueden incluir instrucciones para copiar
archivos, instalar software, configurar variables de entorno, definir puertos de exposición y más.

En definitiva, lo habitual es definir nuestra propia imagen ya que en ella definimos nuestra
configuración para luego lanzarla con un solo comando muy simple, ya que los aspectos complejos
se han definido en ese fichero.

●​ Importante: las imágenes que nosotros creemos con Dockerfile siempre tienen que estar
basadas en una imagen que ya exista, es decir, no creamos imágenes desde cero.

Ejemplos:

●​ Quiero tener un contendor con debian y apache, para ello, puedo crear mi imagen
partiendo de una imagen de apache, pero le añado mi directorio de trabajo, instalo
software adicional, cambios algunas configuraciones por defecto de apache, etc. Con
Dockerfile defino mi imagen a mi gusto, partiendo de una base.

●​ Quiero tener una imagen con debian, apache, mysql y PHP 7, pero la imagen de apache no
me sirve, puedo partir de una imagen con un debian limpio sin software adicional y definir
en el Dockerfile la instalación de apache, mysql y php.

2.​ INSTRUCCIONES PRINCIPALES

IMPORTANTE: destacar que Dockerfile trabaja en tiempo de CONSTRUCCIÓN de la imagen no en


tiempo de CONSTRUCCIÓN Y EJECUCIÓN del contenedor, eso significa que hay ciertas instrucciones
que no podremos hacer con Dockerfile.

Instrucciones principales que podemos usar en el Dockerfile:

●​ FROM image: esta instrucción define la imagen base que se utilizará como punto de partida
para construir tu contenedor. Es la primera instrucción en un Dockerfile y debe especificar
el nombre de la imagen y, opcionalmente, una etiqueta.

●​ RUN comando: se utiliza para ejecutar comandos en el contexto de la imagen durante la


construcción del contenedor. Puedes usarla para instalar paquetes, configurar el entorno, o
realizar cualquier otra tarea necesaria.

●​ ENTRYPOINT comando: define el comando que se ejecutará cuando inicies un contenedor


basado en esta imagen. Puede ser un script o una aplicación que se ejecutará como
proceso principal.
●​ CMD comando: Este comando se encarga de pasar valores por defecto a un contenedor.
Entre estos valores se pueden pasar ejecutables.

○​ [Link] (diferencia CMD y


Entrypoint).

●​ WORKDIR path: para definir el directorio de trabajo en el contenedor.

●​ ENV var=value: para definir variables de entorno en el contenedor.

●​ EXPOSE puerto: para definir puertos donde el contenedor acepta conexiones (Esta
instrucción no abre ni mapea los puertos en el host en sí, sino que simplemente proporciona
información sobre los puertos en los que una aplicación dentro del contenedor escuchará
conexiones. Es útil para que otros desarrolladores sepan qué puertos están diseñados para
su uso cuando ejecutan el contenedor.)

●​ VOLUME path: para especificar donde se esperan los volúmenes en el contenedor (al igual
que el mapeo de puertos, la construcción y montaje de volúmenes se realiza en tiempo de
ejecución, no en tiempo de construcción de la imagen).

●​ COPY origen destino: se utiliza para copiar archivos o directorios desde el sistema de
archivos del host al sistema de archivos del contenedor durante la construcción del
contenedor.

Para una lista completa de las instrucciones disponibles ir a la documentación oficial.

docker build -t <image_name> <contexto>

Utilizado para construir una imagen de contenedor a partir de un Dockerfile:

●​ -t: significa tag y se utiliza para darle un nombre a la imagen que vamos a construir.
●​ contexto: indica el directorio donde se encuentra el fichero Dockerfile el cual se utiliza para
construir la imagen. Es habitual ejecutar el comando estando en el directorio donde está el
Dockerfile, por lo tanto, se suele poner un punto: “.”
○​ docker build -t mi-image:1 .
3.​ DOCKERFILE - EJEMPLO

Vamos a construir nuestra imagen de mysql como hicimos en el tutorial anterior pero esta vez con
Dockerfile. Primero, crea un fichero Dockerfile (organiza tus directorios):

Vamos primero a definir el Dockerfile más básico, simplemente con la instrucción FROM:

Ahora vamos a construir nuestra imagen:

Ya tenemos la imagen construida con su tag, como podrás deducir, podríamos tener varias
versiones de nuestra imagen, y ahora ya podríamos construir nuestro contenedor a partir de
nuestra imagen:

Pero aquí realmente no hemos utilizado la potencialidad de Dockerfile, hemos hecho un ejemplo
sencillo, vamos a complicarlo, vamos a modificar el Dockerfile y vamos a añadir más
configuraciones que nos simplificarán mucho a la hora de construir un contenedor:

●​ FROM: especifico la imagen base de la que quiero partir.


●​ ENV: defino las variables de entorno que me indican en las instrucciones de uso de la
imagen (en este caso, indico la contraseña de ROOT y una base de datos por defecto que
quiero crear).
●​ RUN: quiero que esta imagen esté construida con las últimas actualizaciones y con el editor
de texto VIM (podría haber instalado nano).
●​ EXPOSE: indico que el puerto que se debería mapear es el 3306 que es el servicio principal
que está funcionando en este contenedor. (NO MAPEA EL PUERTO)
●​ VOLUME: indico que directorio se debería guardar en un volumen (NO CREA NI MONTA EL
VOLUMEN).

Destacar que un fichero Dockerfile en definitiva es un script SECUENCIAL, va ejecutando cada


instrucción de una en una, por lo tanto, el orden de las instrucciones es MUY IMPORTANTE (Por
ejemplo, imagínate que quieres copiar un fichero a una carpeta que no existe, antes de ejecutar la
instrucción de copiar tienes que ejecutar la instrucción que crea la carpeta).

Construyo la imagen:
Creamos el contenedor a partir de nuestra nueva imagen:

Como puedes observar, hemos simplificado el comando, únicamente hemos tenido que indicar
tres aspectos:

●​ El nombre del contenedor.


●​ El mapeo de puertos.
●​ El montaje del volumen (en este caso, hemos utilizado la opción -v, lo que hace es crear
primero el volumen db_mysql2 si no existe y lo monta en la ruta indicada).

En el siguiente tema de la asignatura veremos la herramienta Docker Compose con la cual


podremos automatizar aún más la gestión de contenedores en Docker.

Un ejemplo de un dockerfile para una aplicación Flask en python podría ser:

FROM ubuntu:latest
RUN apt-get update -y
RUN apt-get install -y python-pip python-dev
WORKDIR /app
ENV DEBUG=True
EXPOSE 80
VOLUME /data
COPY . /app
RUN pip install -r [Link]
ENTRYPOINT ["python"]
CMD ["[Link]"]
4.​ VISUAL STUDIO PLUGIN

Vamos a probar el plugin de Visual Studio, abre Visual Studio y abre la carpeta con la cual estés
realizando pruebas con docker:

Haz click en el icono de Docker y verás como se abren muchas opciones:

Puedes visualizar de forma más gráfica todo lo


que hemos aprendido en comandos.

●​ Puedes ver los contenedores que tienes


creados, incluso los que están activos o
parados.
●​ Las imágenes y las versiones que tienes
descargadas.
●​ Puedes inspeccionar contenedores, ver
sus logs.
●​ Visualizar los volúmenes, etc.
●​ Échale un vistazo e investiga las posibles
opciones que te ofrece.
Además, siempre tienes la posibilidad de abrir un terminal y ejecutar los comandos:

5.​ DOCKER - EJEMPLO SERVIDOR WEB

Vamos ahora a construir un ejemplo con Nginx.

Nginx es un servidor web muy parecido a Apache, yo te voy a dar las pautas de cómo hacerlo con
Nginx y en la práctica lo harás tú pero con Apache ya que estás más familiarizado con él.

Para complicarlo un poquito más y para que veáis aspectos importantes con Dockerfile, lo que he
hecho es preparar el siguiente entorno partiendo de un debian simple si ningún servicio, es decir,
no he partido de una imagen nginx con el nginx preinstalado, por lo tanto, queremos conseguir el
siguiente entorno:

●​ Debian + Nginx + PHP


●​ Publicación de una web sencilla (HTML y PHP).

Antes de empezar, he subido a GitHub este proyecto para que lo podáis probar, descárgalo y a
continuación lo voy explicando: [Link]

Te encontrarás los siguientes elementos:

●​ web1: es el directorio que contiene el proyecto a publicar en el


contenedor.
○​ public_html: código real del proyecto.
○​ El resto de elementos que no queremos publicar (que
forman parte de la configuración de la web, pero no del
código en sí, se pueden añadir también aquí).
○​ [Link] es la configuración del Virtual Host.
●​ Dockerfile: es el dockerfile que contiene la configuración necesaria para crear el contendor
con todos los elementos necesarios (lo veremos en detalle a continuación.
●​ [Link]: una sencilla guía donde explica cómo construir y ejecutar el contenedor.

Dockerfile

Vamos por partes:

Indico la imagen de la que quiero partir, en este caso, he querido partir de


una imagen con un simple debian para yo instalar manualmente el resto
de servicios.

*Notas importantes:
●​ Os recomiendo que vayáis construyendo poco a poco los Dockerfile, id probando cada
acción que hacéis para asegurarse que va funcionando cada cosa que hacéis, si cometéis
algún error y el contendor no arranca, podéis visualizar el log del contenedor (bien con

comando o desde visual studio )

●​ Los contenedores necesitan un servicio principal para que el contendor se lance, por
ejemplo, un servidor web, una base de datos, un servidor FTP, etc… Por lo tanto, si lanzáis
un contenedor con un sistema operativo simple sin ningún servicio, éste no se lanzará, para
que se lance hay que indicar un servicio principal y que en este caso al no haber ninguno,
hay que indicar que se lance el servicio /bin/bash que básicamente es la consola
interactiva, se indicaría en el docker run (docker run -it <imagen> /bin/bash)
○​ Te lo comento porque si haces un Dockerfile y dejas únicamente esta línea (FROM
debian) si no ejecutas el run con la opción /bin/bash, no arrancará).

Aquí instalo todo el software que necesito:

●​ apt update (por defecto, las imágenes


vienen sin update realizado).
●​ Instalo un editor de texto de consola (a
mi me gusta vim, puedes usar nano).
●​ Instalo nginx
●​ Instalo php-fpm ya que es necesario para que nginx pueda ejecutar código en PHP, con
apache no es necesario, puede ejecutar código php con la básica de php.

Como indica el comentario, copio el código que quiero publicar:

●​ Primer argumento: ruta origen de lo que quiero copiar del anfitrión.


●​ Segundo argumento: ruta destino donde lo quiero copiar dentro del contenedor (si no
existe alguna carpeta la crea, en este caso /var/www/html existe ya que previamente
hemos instalado apache).

●​ COPY: copio el archivo de configuración del VirtualHost.


●​ RUN ln -s: habilito el archivo que acabo de copiar para que se active en sites-enabled (con
nginx no tenemos a2ensite, tenemos que crear nosotros mismos el enlace simbólico).

Indico que va a haber un servicio escuchando por el


puerto 80 (apache), con esto sabemos que en el run
tendremos que mapear (si tuviéramos https,
deberíamos indicar también el 443, pero en este ejemplo no lo vamos a hacer).
Lo que indica el comentario, aquí lo que os aconsejo es que siempre que queráis iniciar un servicio
en el arranque, busquéis en internet cuál es la forma de arrancarlo ya que puede variar entre un
servicio y otro.

Ahora, siguiendo el [Link], voy a primero construir la imagen:

Creo y arranco el contenedor:

Ahora ya podría ir al navegador y comprobar que se ha publicado la web (importante: añade al

/etc/hosts el dominio y la ip ):

Importante: fíjate como he indicado el puerto que hemos mapeado ya que navegador por defecto
internamente hace: [Link]
6.​ DOCKER - PUBLICAR UNA IMAGEN

Como dijimos, el registro oficial de Docker es: [Link]

Vamos a registrarnos, de esta forma, podremos crear nuestros propios registros privados.

Antes de registrar una imagen, podemos indicar que somos los autores de ella poniendo en el
Dockerfile la siguiente instrucción:

Ahora sí, vamos a crear un nuevo repositorio en Docker Hub:

1.​ Inicia sesión en Docker Hub desde el terminal:

docker login
2.​ Construye tu imagen Docker: Asegúrate de estar en el directorio que contiene tu archivo
Dockerfile y los recursos necesarios para tu imagen. Luego, construye la imagen usando el
siguiente comando:

docker build -t tu_nombre_de_usuario/tu_repositorio:etiqueta .

3.​ Verifica que la imagen se ha creado correctamente:

4.​ Etiqueta la imagen con el formato de Docker Hub:

docker tag tu_nombre_de_usuario/tu_repositorio:etiqueta

5.​ Sube la imagen a Docker Hub:

docker push tu_nombre_de_usuario/tu_repositorio

6.​ Verifica en Docker Hub: Abre tu navegador web, ve a Docker Hub y verifica que tu imagen
se haya cargado correctamente en tu repositorio.
7.​ Añadir alguna descripción del contenedor (con formato .MD):

Al ser público, podrías acceder a mi repositorio y utilizarlo para crear tu contenedor:

[Link]
7.​ BIBLIOGRAFÍA

[1] [Link]

[2] [Link]

[3] [Link]

[4] [Link]

[5] [Link]

[6] Curso de Introducción a Docker de OpenWebinars

[7] Curso de Docker de Íñigo Serrano

[8] [Link]

[9] [Link]

[10] Curso de Docker para desarrolladores de OpenWebinars

8.​ AUTORES (EN ORDEN ALFABÉTICO)

A continuación ofrecemos en orden alfabético el listado de autores que han hecho aportaciones a
este documento.

●​ Silvia Amorós Hernández


●​ Miguel Mira Flor
●​ Miguel Ángel Tomás Amat

También podría gustarte