Asociar un Docker file para tener una imagen personalizada (Apache + PHP + Python) dentro de Docker Compose

Tiempo de lectura: 3 minutos

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

4 comentarios en «Asociar un Docker file para tener una imagen personalizada (Apache + PHP + Python) dentro de Docker Compose»

Deja un comentario