Continuando con el Post de Desplegar servidor web Apache con PHP utilizando Docker Compose vamos a aprender cómo asociar un Docker File a un contenedor definido en un Docker Compose.
Un Docker File, permite tener una imagen personalizada, incluyendo comandos dentro de una imagen Docker. Esto permite por ejemplo instalar varios entornos en una sola imagen o simplemente configurar nuestra imagen Docker de la forma que queramos.
Vamos a coger el archivo del Post anterior:
version: "3" #Indicamos la version docker compose que utilizamos #Y luego los servicios que vamos a implementar services: #Aquí indicamos el nombre que queramos mi_servicio_apache: #Imagen de APACHE con PHP image: php:7.0-apache container_name: apache-container volumes: #Carpeta donde guardaremos los archivos web : carpeta interna de Docker - ./www/:/var/www/html expose: #Puerto que queremos exponer a para poder compartirlo con otros contenedores - 80 ports: # Puerto de nuestra máquina : puerto dentro de Docker (siempre va a ser el 80 para apache o 443 para SSL) - 80:80
Vamos a instalar MySQLi para poder utilizarlo dentro de PHP y activar distintos módulos de PHP.
Para ello vamos a crear una nueva carpeta dentro del proyecto, la llamaremos Dockerfile. Dentro de Dockerfile/ vamos a crear el archivo apache_file de forma que quede Dockerfile/apache_file, no hace falta poner extensión a este archivo.
Ahora añadimos lo siguiente en el archivo apache_file
# syntax=docker/dockerfile:1 FROM php:7.0-apache
Comenzamos incluyendo la configuración de sintaxis utilizada. Después añadimos la imagen Docker sobre la que queremos instalar nuestro entorno, en este caso utilizamos el que habíamos indicado en nuestro Docker Compose image: php:7.0-apache y lo añadimos de esta forma FROM php:7.0-apache
.
Ahora continuamos indicando que queremos instalar MySQLi y activar los módulos de PHP header y rewrite para poder utilizar .htaccess.
# syntax=docker/dockerfile:1 FROM php:7.0-apache #Instala mysqli RUN docker-php-ext-install mysqli #Activar modulos de apache: RUN a2enmod headers RUN a2enmod rewrite #Reiniciar Apache RUN /etc/init.d/apache2 restart
Como puedes observar, si queremos ejecutar un comando Bash dentro del Docker File tenemos que poner RUN seguido del comando que queremos ejecutar.
Y ahora, por ejemplo, podemos instalar también Python en nuestra imagen Docker
# syntax=docker/dockerfile:1 FROM php:7.0-apache #Instala mysqli RUN docker-php-ext-install mysqli #Activar modulos de apache: RUN a2enmod headers RUN a2enmod rewrite #Reiniciar Apache RUN /etc/init.d/apache2 restart #INSTALAR PYTHON: RUN apt update RUN apt install -y python-pip
Como veis es sencillo añadir nuevos entornos o configuraciones a una imagen Docker.
Ahora ya solo nos queda asociar este archivo al Docker Compose. Para ello vamos a modificar algunas cosas hasta dejar el archivo docker-compose.yml de la siguiente manera
version: "3" #Indicamos la version docker compose que utilizamos #Y luego los servicios que vamos a implementar services: #Aquí indicamos el nombre que queramos mi_servicio_apache: #Indicamos la carpeta donde guardamos el Docker File build: context: ./Dockerfile #Indicamos el archivo dockerfile de este contenedor dockerfile: apache_file #Eliminamos esta línea que se sustituye por el dockerfile #image: php:7.0-apache container_name: apache-container volumes: #Carpeta donde guardaremos los archivos web : carpeta interna de Docker - ./www/:/var/www/html expose: #Puerto que queremos exponer a para poder compartirlo con otros contenedores - 80 ports: # Puerto de nuestra máquina : puerto dentro de Docker (siempre va a ser el 80 para apache o 443 para SSL) - 80:80
En este caso eliminamos la línea #image: php:7.0-apache qué definía nuestra imagen y asociamos el archivo Dockerfile añadiendo el build.
De esta manera primero va a crear la imagen y ejecutar los comandos.
Aquí os dejo el código para poder descargarlo desde GitHub
Ingeniero en Informática, me encanta crear cosas o arreglarlas y darles una nueva vida. Escritor y poeta. Más de 20 APPs publicadas y un libro en Amazon.
4 comentarios en «Asociar un Docker file para tener una imagen personalizada (Apache + PHP + Python) dentro de Docker Compose»