Create a Docker Compose container with Apache + PHP + MySQL (XAMP with Docker)

Tiempo de lectura: 3 minutos

Continuing with the series of Docker Compose tutorials and based on the last one Associate a Docker file to have a custom image (Apache + PHP + Python) within Docker Compose we are going to create a XAMPP or LAMPP service that includes Apache2, PHP and MySQL taking advantage of Docker containers and linking them together using Docker Compose.

Using the base code, download Github code

version: "3"
#Indicate the docker compose version that we use
#And then the services we are going to implement
services:
#Here we indicate the name we want
  mi_servicio_apache:
    #Indicate the folder where we save the Docker File
    build: 
      context: ./Dockerfile
      #Indicate the dockerfile of this container
      dockerfile: apache_file
    # We remove this line that is replaced by the dockerfile
    #image: php:7.0-apache
    container_name: apache-container
    volumes:
      #Folder where we will save the web files: internal Docker folder
      - ./www/:/var/www/html
    expose:
      #Port that we want to expose to so we can share it with other containers
      - 80
    ports:
      # Port of our machine: port inside Docker (it will always be 80 for apache or 443 for SSL)
      - 80:80

Let’s add the MySQL container of mysql:5.7

contendor_mysql:
    image: mysql:5.7
    container_name: mysql-container
    environment:
        MYSQL_DATABASE: db
          # You can use the user you want, in the example we use test
        MYSQL_USER: test
         # Password for the MySQL user
        MYSQL_PASSWORD: testp
          # Password for root
        MYSQL_ROOT_PASSWORD: root
    volumes:
      # We mount a volume for MySQL so as not to lose the db data
      - ./mysql:/var/lib/mysql
    expose:
      - 3306
    ports:
      - 3306:3306

We create the container exposing the MySQL default port 3306.

We also create a volume that we call MySQL, it is a folder where we are going to add our initial database if we have it, this container is capable of loading it automatically.

Now we are going to join the two containers inside the same Docker Compose file, we are going to add MySQL first.

version: "3"
services:
  contendor_mysql:
    image: mysql:5.7
    container_name: mysql-container
    environment:
        MYSQL_DATABASE: db
        MYSQL_USER: test
        MYSQL_PASSWORD: testp
        MYSQL_ROOT_PASSWORD: root
    volumes:
      - ./mysql:/var/lib/mysql
    expose:
      - 3306
    ports:
      - 3306:3306
  mi_servicio_apache:
    build: 
      context: ./Dockerfile
      dockerfile: apache_file
    # We remove this line that is replaced by the dockerfile
    #image:php:7.0-apache
    container_name: apache-container
    volumes:
      #Folder where we will save the web files: internal Docker folder
      - ./www/:/var/www/html
    expose:
      #Port that we want to expose to so we can share it with other containers
      - 80
    ports:
      # Port of our machine: port inside Docker (it will always be 80 for apache or 443 for SSL)
      - 80:80
Once the two containers are joined, we have to make a link between the apache container and MySQL, for this we are going to add
  links: 
      - contendor_mysql
And it remains as follows:
version: "3"
services:
  contendor_mysql:
    image: mysql:5.7
    container_name: mysql-container
    environment:
        MYSQL_DATABASE: db
        MYSQL_USER: test
        MYSQL_PASSWORD: testp
        MYSQL_ROOT_PASSWORD: root
    volumes:
      - ./mysql:/var/lib/mysql
    expose:
      - 3306
    ports:
      - 3306:3306
  mi_servicio_apache:
    build: 
      context: ./Dockerfile
      dockerfile: apache_file
    container_name: apache-container
    volumes:
      - ./www/:/var/www/html
    expose:
      - 80
    ports:
      - 80:80
    links: 
      - contendor_mysql
NOTE: now we have created a link to the MySQL container which we have named mysql_container. This means that when we make a connection in PHP with MySQL we will have to put container_mysql instead of localhost (where the host of our connection is indicated) that is, it would be as follows:
$conn = new mysqli('contenedor_mysql', 'test', 'testp');
Now we have everything ready to deploy.

The folder structure looks like this:
And now we can deploy our Dockerized XAMP.
sudo docker-compose up -d

Download the code HERE from GitHub.

If you are looking for Second Hand books I recommend www.quierolibros.com

Leave a Comment