Instalar Docker en Ubuntu y desplegar servidor web Apache con PHP utilizando Docker Compose

Tiempo de lectura: 4 minutos

En este tutorial voy a enseñaros cómo desplegar un servidor web en pocos segundos utilizando Docker + Docker Compose.

Docker Compose sirve para ejecutar distintos contenedores Docker, en este ejemplo podríamos utilizar solo un archivo Docker para desplegar Apache2 pero lo vamos a tomar de base para completar nuestro ejemplo con más contenedores, por lo que utilizaremos Docker Compose.

Para empezar vamos a instalar Docker en nuestra máquina, en este caso un Ubuntu.

Instalamos Docker Compose en Ubuntu siguiendo las instruciones de la web oficial de Docker

Actualizamos dependencias e instalamos nuevos paquetes necesarios

sudo apt-get update

Instalamos dependencias necesarias

 sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

Añadimos la clave GPG oficial de Docker

 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

Añadimos el repositorio estable de Docker

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Actualizamos nuestros respositorios

 sudo apt-get update

Instalamos Docker y Docker Compose

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

Ahora comprobamos que Docker funciona ejecutando el hello-world de ejemplo

sudo docker run hello-world

Si devuelve error de Docker

docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.
See 'docker run --help'.

Tendremos que levantar el servicio de forma manual con el siguiente comando

sudo service docker start

Y probar de nuevo a ejecutar el Hello-World

Para no tener que usar el comando sudo al invocar docker:

  1. Crear grupo docker
sudo groupadd docker

2. Añadir al usuario al grupo docker:

sudo usermod -aG docker $USER

3. Guardar los cambios del grupo:

newgrp docker

4. Ya puedes usar docker sin sudo

docker run hello-world

Ahora vamos a crear una nueva carpeta dónde añadiremos nuestro fichero de Docker Compose.

Una vez creado el directorio, creamos un archivo que se tiene que llamar docker-compose.yml

Vamos a instalar una versión de Apache2 que ya tiene incluido además PHP, esa versión es la php:7.0-apache.

Creamos el siguiente archivo qué explico en los comentarios:

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

Es importante mantener bien la tabulación de los espacios del documento, ya que se basa en lenguaje YALM

Con este código queda creado nuestro contenedor Docker.

Utilizamos la imagen oficial php:7.0-apache

Nota: los puertos funcionan de la siguiente manera

  • PUERTO_MAQUINA : PUERTO DOCKER

Añadimos nombre al contenedor con la línea de container_name: apache-container en este caso lo llamamos apache-container.

Con la etiqueta volumes, indicamos dónde queremos alojar los archivos web. Esto se puede entender cómo un acceso directo o carpeta compartida entre nuestra máquina y el contenedor Docker. Sigue la siguiente estructura:

  • ./www/:/var/www/html –> CARPETA_NUESTRA_MAQUINA:CARPETA_INTERNA_CONTENEDOR

Esto quiere decir que tenemos que crear una carpeta en el mismo directorio dónde hemos creado ejemplo.yml

Aquí dentro podemos crear una web index.html y añadirla dentro de la carpeta www.

Como la siguiente:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8"/>
  <title>Document</title>
  <meta name="keywords" content=""/>
  <meta name="description" content=""/>
  <meta name="viewport" content="width=device-width"/>
</head>
<body>
Ejemplo de <a href="https://devcodelight.com">DevCodeLight</a>

</body>
</html> 

Quedaría entonces www/index.html

Ahora ya podemos ejecutar nuestro ejemplo con el siguiente comando:

docker compose up -d

*Si docker-compose no funciona, hay que volver a instalar Docker Compose ejecutando estos comandos:

sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version

Ahora tendria que devolver la versión de docker-compose:

Este comando levanta nuestro Docker Compose en segundo plano, la primera vez va a tardar un rato mientras descarga la imagen y la configura.

Comienza a descargar las dependencias y contenedor:

Una vez descargada ya estaría desplegado.

Para comprobar que funciona correctamente ponemos en nuestro navegador: http://localhost

Y ya tenemos nuestro pequeño contenedor desplegado. Recuerda qué si queremos mostrar una página web que hayamos desarrollado, tendremos que añadir los archivos en la carpeta www que tenemos en raíz de nuestro proyecto.

Aquí os dejo el código de este tutorial disponible en mi GitHub para que podáis utilizarlo.

10 comentarios en «Instalar Docker en Ubuntu y desplegar servidor web Apache con PHP utilizando Docker Compose»

Deja un comentario