# Ejemplo 1: Implantación de Wordpress

Primero de todo vamos a crear el espacio de trabajo:

```bash
mkdir -p ~/Sites/wordpress/target && cd ~/Sites/wordpress
```

En este mismo directorio (`~/Sites/wordpress`), vamos a crear un fichero llamado `docker-compose.yaml` con el siguiente contenido:

{% code title="docker-compose.yaml" lineNumbers="true" %}

```yaml
version: '3'

services:

  # Database
  db:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
    networks:
      - wpsite
      
  # phpmyadmin
  phpmyadmin:
    depends_on:
      - db
    image: phpmyadmin
    restart: always
    ports:
      - '8080:80'
    environment:
      PMA_HOST: db
      MYSQL_ROOT_PASSWORD: password 
    networks:
      - wpsite
      
  # Wordpress
  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    ports:
      - '8000:80'
    restart: always
    volumes: ['./:/var/www/html']
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
    networks:
      - wpsite
      
networks:
  wpsite:
  
volumes:
  db_data:
```

{% endcode %}

{% hint style="info" %}
YAML es un lenguaje de serialización de datos diseñado para ser leído y escrito por personas. Se recomienda que sigas algún tutorial para entender su formato: [Aprende YAML en Y minutos](https://learnxinyminutes.com/docs/es-es/yaml-es/).
{% endhint %}

Los ficheros de *Compose* están divididos en tres secciones: *services*, *volumes* y *networks*; y deben indicar un número de versión. Nos permite realizar prácticamente lo mismo que podemos hacer con el cliente de *docker*, pero de forma automática.

{% hint style="info" %}
Si reiniciamos el ordenador, los contenedores estarán detenidos (stop), podremos reiniciarlos con `docker start` o `docker-compose start`. Este es el comportamiento predeterminado y el que nos interesa en un entorno de desarrollo.

Sin embargo, en otros entornos, o para casos concretos, igual queremos que un contenedor tenga el mismo estado en el que estaba antes de reiniciar la máquina (iniciado o parado).

Para eso usaremos el parámetro `restart`. En el caso de la base de datos de nuestro ejemplo, la configuración quedaría como:

```
services:
    db:
        image: mariadb:10.3.9
        restart: unless-stopped
        volumes:
            - data:/var/lib/mysql
        environment:
            - MYSQL_ROOT_PASSWORD=secret
            - MYSQL_DATABASE=wordpress
            - MYSQL_USER=manager
            - MYSQL_PASSWORD=secret
```

El equivalente en la consola sería:

```
$ docker run -d --name wordpress-db \
    --restart unless-stopped
    --mount source=wordpress-db,target=/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=secret \
    -e MYSQL_DATABASE=wordpress \
    -e MYSQL_USER=manager \
    -e MYSQL_PASSWORD=secret mariadb:10.3.9
```

Otros valores son: `no` (por defecto), `always` y `on-failure`.
{% endhint %}

Vamos a ejecutar esta aplicación, para ello primero hay que arrancar la aplicación con *Compose*:

```bash
docker-compose up -d
```

Ya puedes entrar en navegador en `http://IP:8080` para acceder a Wordpress. Para comprobar la información de la base de datos accede directamente al contenedor:

```bash
docker exec -it [CONTAINER_ID] sh
```
