Docker es un programa de software que se utiliza para la virtualización a nivel del sistema operativo. También se llama contenedorización. Las aplicaciones PHP consisten principalmente en un servidor web, un intérprete de idiomas y un DBMS (base de datos). En este tutorial estamos usando una pila PHP completa con Docker. Nosotros mismos organizaremos contenedores para Nginx (el servidor web), MySQL (sistema de base de datos) y el lenguaje PHP.

Para este tutorial crearemos una aplicación simple que tomará una lista de ciudades de la base de datos y la mostrará en el sitio web. Esto ayuda a comprender y demostrar la forma completa de trabajo.

requisitos

  • Docker CE instalado
  • Conocimiento mínimo de Docker
  • Conocimiento de la contenerización

Paso 1: configurar el entorno de trabajo

Una aplicación sencilla basada en Docker consta de varios contenedores. Es difícil gestionar todo esto manualmente. Para resolver este problema usamos docker-compose, ayuda a administrar múltiples contenedores usando un archivo de configuración.

Utilice los siguientes comandos para instalar docker-compose

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

Vamos a crear una carpeta para almacenar todos los archivos aquí. Luego cd en él y se usará como nuestro directorio de trabajo.

$ mkdir ~/docker
$ cd ~/docker

Utilice este comando para crear carpetas adicionales.

$ mkdir php nginx app

En la carpeta php tenemos nuestra imagen php personalizada, ngnix tiene una imagen ngix personalizada y la carpeta de la aplicación contiene el código fuente y los archivos de configuración.

Paso 2: configure el contenedor PHP

Usaremos php-fpm para conectarnos al servidor web Nginx. En la carpeta php, cree un archivo llamado Dockerfile y pegue el siguiente contenido.

FROM php:7.1-fpm-alpine3.4
RUN apk update--no-cache 
    && apk add--no-cache $PHPIZE_DEPS 
    && apk add--no-cache mysql-dev 
    && docker-php-ext-install pdo pdo_mysql

Estamos usando la versión Alpine aquí. Alpine es una pequeña distribución que apunta a los contenedores.

$ docker build -t name-php php/

Como se mencionó anteriormente sobre el archivo de configuración yml de docker-compose, creemos el archivo

$ touch app/docker-compose.yml

Agregue las siguientes configuraciones al archivo

version: '2'
services:
  php:
    image: vultr-php
    volumes:
      -./:/app
    working_dir: /app

Versión es la versión de docker-compose.yml que se usa aquí. Tenga en cuenta que cada servicio tiene una clave específica dentro del bloque de servicios. El nombre dado aquí se utilizará más adelante para referirse a este contenedor en particular. También definimos un mapeo de volumen.

volumes:
  - ./:/app

Esto le dice a docker-compose que asigne el directorio actual (./) al directorio / app en el contenedor. La última línea asegura que se ejecuten los comandos de esta carpeta, es decir ./app

Organice los contenedores usando los siguientes comandos

$ cd ~/docker/app
$ docker-compose up -d

Para comprobar si el contenedor PHP se estaba ejecutando. Utilice el siguiente comando:

$ docker ps

Paso 3: ejecutar comandos en el contenedor

Use el comando docker-compose a continuación y asegúrese de estar todavía en la carpeta de la aplicación.

$ docker-compose exec [service] [command]

El marcador de posición de servicio se refiere a la clave de servicio.

Ejecute el siguiente comando en docker-compose para verificar la versión de PHP.

$ docker-compose exec php php -v

Verá el siguiente mensaje:

PHP 7.1.14 (cli) (built: Feb  7 2018 00:40:45) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies

Paso 4: configurar el contenedor de Nginx

Como antes, crearemos una imagen personalizada para Nginx. Para hacer esto, use los siguientes comandos.

$ cd ~/docker
$ touch nginx/Dockerfile

Pegue las siguientes configuraciones en el Dockerfile

FROM nginx:1.13.8-alpine
COPY ./default.conf /etc/nginx/conf.d/default.conf

Simplemente copiamos un archivo de configuración a este archivo Docker en la configuración de nuestra aplicación.

$ touch nginx/default.conf

Ahora agregue las siguientes configuraciones al archivo

server {
    listen80 default_server;
    listen [::]:80 default_server ipv6only=on;

    root /app;
    index index.php;

    #server_name server_domain_or_IP;

    location / {
        try_files$uri$uri/ /index.php?$query_string;
    }

    location~ .php$ {
        try_files$uri /index.php =404;
        fastcgi_split_path_info ^(.+.php)(/.+)$;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

Internamente, docker-compose crea una red y asigna el nombre del servicio como nombre de host a cada uno de los servicios definidos. Crea la imagen de Nginx.

$ docker build -t name-nginx nginx/

Ahora el archivo docker-compose.yml con las siguientes configuraciones:

version: '2'
services:
  php:
    image: vultr-php
    volumes:
      -./:/app
    working_dir: /app
  web:
    image: vultr-nginx
    volumes:
      -./:/app
    depends_on:
      -php
    ports:
      -80:80

Crea un archivo llamado index.php con el siguiente comando

$ <?php phpinfo();

Antes de ejecutar los siguientes comandos, asegúrese de que el puerto 80 esté activo y funcionando

$ cd ~/docker/app
$ docker-compose up -d

Paso 5: Configuración del contenedor MySQL

Actualice el archivo ~ / docker / app / docker-compose.yml con las siguientes configuraciones

version: '2'
services:
  php:
    image: name-php
    volumes:
      -./:/app
    working_dir: /app
  web:
    image: name-nginx
    volumes:
      -./:/app
    depends_on:
      -php
    ports:
      -80:80
  mysql:
    image: mysql:5.7.21
    volumes:
      -./:/app
      - dbdata:/var/lib/mysql
    environment:
      -MYSQL_DATABASE=world
      -MYSQL_ROOT_PASSWORD=root
    working_dir: /app
volumes:
  dbdata:

Ahora descargue la base de datos de muestra MySQL usando el siguiente comando en la carpeta de la aplicación

$ curl -L http://downloads.mysql.com/docs/world.sql.gz -o world.sql.gz
$ gunzip world.sql.gz

Ahora orquesta el contenedor con el siguiente comando

$ docker-compose up -d

Ahora complete la base de datos mundial

$ docker-compose exec -T mysql mysql -uroot -proot world < world.sql

Ahora, verifiquemos que los datos se hayan introducido correctamente en la base de datos. Para hacer esto, acceda al indicador de MySQL en el contenedor. Utilice el siguiente comando.

$ docker-compose exec mysql mysql -uroot -proot world

En el símbolo del sistema, realice la siguiente consulta

select * from city limit10;

Se muestra una lista de datos en la base de datos, en este caso ciudades. Salga del símbolo del sistema con el siguiente comando.

mysql> exit

Paso 6: construya la aplicación PHP

Los contenedores se están ejecutando, ahora podemos construir la aplicación PHP. Vaya al archivo app / index.php y pegue el siguiente código.

<?php

$pdo = new PDO('mysql:host=mysql;dbname=world;charset=utf8', 'root', 'root');

$stmt = $pdo->prepare("
    select city.Name, city.District, country.Name as Country, city.Population
    from city
    left join country on city.CountryCode = country.Code
    order by Population desc
    limit 10
");
$stmt->execute();
$cities = $stmt->fetchAll(PDO::FETCH_ASSOC);

?>

<!doctype html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Vultr Rocks!</title>
</head>
<body>
    <h2>Most Populous Cities In The World</h2>
    <table>
    <thead>
        <tr>
            <th>Name</th>
            <th>Country</th>
            <th>District</th>
            <th>Population</th>
        </tr>
    </thead>
    <tbody>
        <?phpforeach($cities as $city): ?>
            <tr>
                <td><?=$city['Name']?></td>
                <td><?=$city['Country']?></td>
                <td><?=$city['District']?></td>
                <td><?=number_format($city['Population'], 0)?></td>
            </tr>
        <?phpendforeach?>
    </tbody>
    </table>
</body>
</html>

Si ahora accede a la dirección IP en su navegador, verá la lista de las ciudades más populares. Felicitaciones, ha implementado con éxito una aplicación PHP utilizando Docker.