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.