Crear un contenedor Docker Compose con Apache + PHP + MySQL (XAMPP con Docker)

Tiempo de lectura: 4 minutos

Continuando con la serie de tutoriales de Docker Compose y basandonos en el último Asociar un Docker file para tener una imagen personalizada (Apache + PHP + Python) dentro de Docker Compose vamos a crear un servicio XAMPP o LAMPP que incluye Apache2, PHP y MySQL aprovechando contenedores Docker y uniéndolos mediante Docker Compose.

Utilizando el código de base, descargar código de Github

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

Vamos a añadir el contenedor de MySQL oficial mysql:5.7

contendor_mysql:
    image: mysql:5.7
    container_name: mysql-container
    environment:
        MYSQL_DATABASE: db
          # Puedes utilizar el usuario que quieras, en el ejemplo usamos test
        MYSQL_USER: test
          # Contraseña para el usuario de MySQL
        MYSQL_PASSWORD: testp
          # Contraseña para root
        MYSQL_ROOT_PASSWORD: root
    volumes:
      # Montamos un volumen para MySQL para no perder los datos de bd
      - ./mysql:/var/lib/mysql
    expose:
      - 3306
    ports:
      - 3306:3306

Creamos el contenedor exponiendo el puerto por defecto de MySQL 3306.

Creamos también un volumen que llamamos MySQL, es una carpeta dónde vamos a añadir nuestra base de datos inicial si la tenemos, este contenedor es capaz de cargarla automáticamente.

Ahora vamos a juntar los dos contenedores dentro del mismo fichero de Docker Compose, vamos a añadir MySQL primero.

version: "3"
#Indicamos la version docker compose que utilizamos
#Y luego los servicios que vamos a implementar
services:
  contendor_mysql:
    image: mysql:5.7
    container_name: mysql-container
    environment:
        MYSQL_DATABASE: db
          # Puedes utilizar el usuario que quieras, en el ejemplo usamos test
        MYSQL_USER: test
          # Contraseña para el usuario de MySQL
        MYSQL_PASSWORD: testp
          # Contraseña para root
        MYSQL_ROOT_PASSWORD: root
    volumes:
      # Montamos un volumen para MySQL para no perder los datos de bd
      - ./mysql:/var/lib/mysql
    expose:
      - 3306
    ports:
      - 3306:3306
#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

Una vez unidos los dos contenedores, nos queda hacer un link entre el contendor apache y MySQL, para ello vamos a añadir

  links: 
      - contendor_mysql

Y queda de la siguiente forma:

version: "3"
#Indicamos la version docker compose que utilizamos
#Y luego los servicios que vamos a implementar
services:
  contendor_mysql:
    image: mysql:5.7
    container_name: mysql-container
    environment:
        MYSQL_DATABASE: db
          # Puedes utilizar el usuario que quieras, en el ejemplo usamos test
        MYSQL_USER: test
          # Contraseña para el usuario de MySQL
        MYSQL_PASSWORD: testp
          # Contraseña para root
        MYSQL_ROOT_PASSWORD: root
    volumes:
      # Montamos un volumen para MySQL para no perder los datos de bd
      - ./mysql:/var/lib/mysql
    expose:
      - 3306
    ports:
      - 3306:3306
#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
    links: 
      - contendor_mysql

NOTA: ahora hemos creado un link con el contenedor de MySQL qué hemos llamado contenedor_mysql. Esto quiere decir que cuándo hagamos una conexión en PHP con MySQL tendremos que poner contenedor_mysql en vez de localhost (dónde se indica el host de nuestra conexión) es decir, quedaría de la siguiente forma:

$conn = new mysqli('contenedor_mysql', 'test', 'testp');

Ahora ya tenemos todo listo para desplegar.

La estructura de carpetas queda así:

Y ahora ya podemos desplegar nuestro XAMP Dockerizado.

sudo docker-compose up -d

Os dejo el código en GitHub en este enlace.

Si buscas libros de Segunda Mano te recomiendo www.quierolibros.com

5 comentarios en «Crear un contenedor Docker Compose con Apache + PHP + MySQL (XAMPP con Docker)»

Deja un comentario