Phalconphp con docker


En este post realizaremos el ejercicio con Docker montar phalconphp para trabajar en con esta herramienta de contenedores.

oscar Escrito por oscar 07 August 2018 4810 0

Hace no mucho creamos un post en donde instalamos phalconphp en la raspberry pi, pero está instalación la realizamos directamente en el en nuestro equipo, el cual debe tener un servidor http como apache y php instalados para poder usar phalconphp.

Aunque es una forma de trabajar hoy en día no es muy recomendada, ya que se usa bastante recurso físico y cualquier cambio de versión requiere des instalar y volver a instalar de nuevo.

En este post realizaremos el ejercicio con Docker montar phalconphp para trabajar en con esta herramienta de contenedores.

Pueden encontrar el código del ejercicio repositorio ProjectPhalconPHP.

Instalación de Docker

Sin importar el sistema operativo o las características de la maquina podemos trabajar en docker con los contenedores.

En el post hablemos de docker comentamos a detalle del programa, sus características e instalación en diferentes sistemas operativos; ademas tenemos este otro post en donde están los comandos básicos con docker para que también lo tengas como referencia.

Crear proyecto con docker

Una ves tengamos todo listo vamos a crear nuestro proyecto para ello realizamos los siguientes pasos.

Crear directorio trabajo

Antes de iniciar vamos a crear una carpeta de trabajo, como estoy trabajo con Windows voy a crear en el disco c:/ una carpeta a la que llamare code, dentro de esa carpeta creare otra carpeta a la que llamaré ProjectPhalconPHP.

Dentro de la nueva carpeta creamos el archivo docker-compose.yml, allí vamos a añadir lo siguiente:

#ProjectPhalconPHP/docker-compose.yml
version: '2'
services:
  php:
    build: ./php
    container_name: ProjectPhalconPHP_php

En este archivo estamos creando el servicio de php, el cual con build estamos indicando donde esta el Dockerfile que tiene las instrucciones de instalación de Phalconphp.

Creando servicio de PHP

Procedemos a crear una carpeta dentro de ProjectPhalconPHP la cual llamaremos php, esta carpeta contendrá el Dockerfile del contenedor php y la instalación de Phalconphp, ademas crearemos el archivo php.ini vacío (el cual veremos mas adelante).

#ProjectPhalconPHP/php/Dockerfile
#Paso 1
FROM php:7.2.8-apache  
MAINTAINER Código Electrónica - codigoelectronica@gmail.com
#Paso 2
RUN docker-php-ext-install pdo pdo_mysql
#Paso 3
ENV PHALCON_VERSION=3.1.1
#Paso 4
WORKDIR /var/tmp
#Paso 5
RUN curl -sS https://getcomposer.org/installer | php && \
  mv composer.phar /usr/local/bin/composer
#Paso 6
RUN apt-get -y update && apt-get -y install unzip
#Paso 7
RUN set -xe && \
        curl -LO https://github.com/phalcon/cphalcon/archive/v${PHALCON_VERSION}.tar.gz && \
        tar xzf v${PHALCON_VERSION}.tar.gz && cd cphalcon-${PHALCON_VERSION}/build && ./install && \
        echo "extension=phalcon.so" > /usr/local/etc/php/conf.d/phalcon.ini && \
        cd ../.. && rm -rf v${PHALCON_VERSION}.tar.gz cphalcon-${PHALCON_VERSION} && \
        # Insall Phalcon Devtools, see https://github.com/phalcon/phalcon-devtools/
        curl -LO https://github.com/phalcon/phalcon-devtools/archive/v${PHALCON_VERSION}.tar.gz && \
        tar xzf v${PHALCON_VERSION}.tar.gz && \
        mv phalcon-devtools-${PHALCON_VERSION} /usr/local/phalcon-devtools && \
        ln -s /usr/local/phalcon-devtools/phalcon.php /usr/local/bin/phalcon
#Paso 8
COPY php.ini /usr/local/etc/php/conf.d
#Paso 9
RUN a2enmod headers rewrite
#Paso 10
WORKDIR /var/www/html

En este archivo se realiza la instalación de phalconphp con el phalcon dev tools, pero para entenderlo mejor veamos la explicación de los pasos.

  1. Usaremos la versión de php:7.2.8-apache [1], ya que sus características son ideales para trabajar con phalconphp.
  2. Instalamos las exenciones de mysql y pdo [2] para el manejo de la base de datos.
  3. Para el ejemplo usaremos la versión de phalconphp 3.1.1 [3], la cual definimos en una variable de docker.
  4. Nos ubicamos en el directorio temporal para hacer la descarga de phalconphp y phalcondevtool.
  5. Descargamos composer para poder usar las dependencias de php y poder bajar phalcon dev tools.
  6. Actualizamos e instalamos unzip para descomprimir los archivos de phalconphp.
  7. Descargamos phalconphp desde su repositorio en git, ademas descargamos el phalcon dev tools.
  8. Copiamos el archivo php.ini al contenedor.
  9. Por ultimo nos ubicamos en la carpeta html que es nuestro directorio de trabajo.

Prueba del servicio de php

Una vez realizados los pasos anteriores, procederemos a probar el servio de php con phalconphp para verificar que este quedando correctamente, para ello arrancaremos los contenedores de este servicio con la ayuda del siguiente comando.

Nos ubicamos desde la terminal en el directorio c:/code/ProjectPhalconPHP, allí ejecutamos:

#c:/code/ProjectPhalconPHP
docker-compose up

Este comando lo que hace es ejecutar docker, en nuestro archivo Dockerfile ejecuta cada uno de los pasos y creara el contenedor con el servicio de php y phalconphp instalado. Luego verificamos con docker ps para saver si nuestro contenedor se ejecuto correctamente.

#c:/code/ProjectPhalconPHP
docker ps

Con el siguiente comando podemos verificar que phalconphp y phalcon dev tools esta funcionando correctamente, para ello creemos un proyecto de prueba.

#c:\code\ProjectPhalconPHP>
c:\code\ProjectPhalconPHP>docker-compose create php phalcon project TestPhalcon

Nos mostrara la siguiente salida.

Phalconphp docker test devtools
Phalconphp docker test devtools

Para finalizar por ahora con php, copiamos el archivo php.ini a la imagen, en donde esta la configuración básica de php, ademas de la exención para habilitar phalconphp, paso que se debe hacer antes de ejecutar el comando anterior. En el repositorio de github e dejado un archivo con la configuración básica de php.

Visualicemos la estructura que tenemos hasta elementos.

c:\code\ProjectPhalconPHP>tree /f /a
Folder PATH listing
Volume serial number is XXC4-0XXA
C:.
|   docker-compose.yml
|
\---php
        Dockerfile
        php.ini

Creando Apache como servicio HTTP

La imagen de php que estamos usando tiene la características de incluir un servidor de Apache la cual nos permitirá usarlo como servicio de HTTP, conectado a nuestro php, lo único que debemos hacer es configurar los pasos 7, 8, 9 en creando un servicio con php que describimos en atrás.

Prueba de apache

Para realizar la prueba creamos una carpeta llamada code en el directorio ProjectPhalconPHP, allí creamos un archivo index.php donde colocamos lo siguiente.

//ProjectPhalconPHP/code/index.php
<?php
phpinfo();
?>

En el archivo docker-compose.yml, para el servicio de php adicionamos el puerto que va a escuchar apache que en este caso es el 80 y colocamos el volumen de la carpeta code.

#ProjectPhalconPHP/docker-compose.yml
version: '2'
services:
  php:
    build: ./php
    container_name: ProjectPhalconPHP_php
    ports:
    - '80:80'
    volumes:
    - ./code:/var/www/html

Cargamos de nuevo docker-compose up --build para ejecutar de nuevo nuestro proyecto y una vez que termine ingresamos a http://localhost:80 donde nos deberá mostrar lo siguiente:

Phalcon docker test phpinfo
Phalcon docker test phpinfo

Ya que estamos en este archivo verifiquemos si los socket de PHP están correcto los cuales deben mostrar la ruta que nos permite para la conexión, también observamos que la instalación de PDO para MYSQL se encuentra y por ultimo tenemos la versión de phalconphp que es la que descargamos de su repositorio.

Phalcon docker test phpinfo pdo phalcon
Phalcon docker test phpinfo pdo phalcon

Veamos como esta quedando la estructura de archivos en nuestro proyecto.

c:\code\ProjectPhalconPHP>tree /f /a
Folder PATH listing
Volume serial number is 5EXX-XX8A
C:.
|   docker-compose.yml
|
+---code
|       index.php
|
\---php
        Dockerfile
        php.ini

Creando servidor MYSQL

Vamos a usar a mysql como motor de bases de datos, para ello realizaremos los siguientes cambios en el archivo de docker-compose.yml, donde adicionamos el servicio de mysql.

#ProjectPhalconPHP/docker-compose.yml
mysql:
    image: mysql:5.7.22
    container_name: ProjectPhalconPHP_mysql
    environment:
      MYSQL_ROOT_PASSWORD: pass
      MYSQL_DATABASE: docker
      MYSQL_USER: user
      MYSQL_PASSWORD: secret
    volumes:
      - ./mysql/backup:/backup
      - ./mysql/db:/var/lib/mysql

La imagen que vamos a trabajar es la 5.7, pero en el repositorio de docker de MYSQL podemos encontrar las versiones disponibles de MYSQL, ademas de las variables de entorno, que como han observado estamos usando las de usuario, contraseñas y la base de datos que vamos a trabajar.

Adicionalmente creamos el directorio mysql en ProjectPhalconPHP, allí creamos dos carpetas más una de backup y la otra de db, ya explicare para que son.

Prueba de MYSQL con PHP

Para realizar la prueba, vamos a realizar la ejecución de docker compose para cargar el contenedor de mysql, y luego verificamos que id nos dejo para mysql y poder ingresar al contenedor. Para ello realicemos los siguientes pasos:

#c:/code/ProjectPhalconPHP
docker-compose up --build

Esto nos creará el contenedor de mysql, ahora:

#c:/code/ProjectPhalconPHP
docker ps

Nos retornara los contenedores que están activos, buscamos el de mysql y accedemos de la siguiente forma.

#c:/code/ProjectPhalconPHP
docker exec -it 8707 bash
Phalconphp docker test mysql
Phalconphp docker test mysql

En el contenedor accedemos a la base e datos con el usuario root, contraseña pass y la base de datos docker, como lo definimos en el docker-compose.

#Dentro del contenedor de mysql
mysql -uroot -p docker

Vamos a crear una simple tabla de prueba.

CREATE TABLE test (
    id INT NOT NULL AUTO_INCREMENT,
    descripcion VARCHAR(100) NOT NULL,
    PRIMARY KEY ( id )
);

E ingresamos un registro.

INSERT INTO test('descripcion') VALUE('hola desde docker');

Ahora vamos a crear en la carpeta code un archivo llamado testMysql.php, el cual usaremos para hacer la prueba de conexión a mysql con php, allí colocamos el siguiente código:

//ProjectPhalconPHP/code/testMysql.php
<?php
$usuario = "root";
$contraseña = "pass";

try {
    $mbd = new PDO('mysql:host=ProjectPhalconPHP_mysql;dbname=docker', $usuario, $contraseña);
    echo "
"; foreach($mbd->query('SELECT * from test') as $fila) { print_r($fila); } echo "

"; $mbd = null; } catch (PDOException $e) { print_r($e->getMessage()); die(); } ?>

Phalconphp docker test mysql web
Phalconphp docker test mysql web

Prueba de proyecto con phalconphp

Para finalizar vamos a crear un proyecto de phalconphp usando phalcon dev tool, en donde tomaremos la tabla creada anteriormente para construir un CRUD [4] usando esta poderosa herramienta, para ello nos ubicamos en c:\code\ProjectPhalconPHP>, donde ejecutamos el siguiente comando:

#c:\code\ProjectPhalconPHP>
docker-compose run --rm php phalcon project TestPhalcon

Con el comando run vamos a correr nuestros contenedores de docker el cual va a crear el contenedor de nuestro servicio php, ejecutara la instrucción de phalon para crear el proyecto, veamos a detalle las instrucciones que esta usando.

  • run permite ejecutar los contenedores de los servicios creados en docker-compose.
  • --rm permite eliminar el contenedor despues de ejecutarse.
  • phalcon comando de phalcon dev tools que permite usar sus componentes.
  • project TestPhalcon instrucción para crear un proyecto nuevo.

Luego ejecutamos nuestro proyecto para verificar de nuevo en el navegados si todo esta correcto.

#c:\code\ProjectPhalconPHP>
docker-compose up --build

Esto nos creara los contenedores y con acceder a http://localhost/TestPhalcon/ donde nos deberá mostrar la siguiente pantalla.

Phalconphp docker test web
Phalconphp docker test web

Prueba de conexión de mysql con phalcon

Para poder usar phalconphp con mysql nos dirigimos al archivo de configuración del proyecto que esta en la ruta app\config\config.php, allí colocamos la siguiente configuración.

//TestPhalcon\app\config\config.php
return new \Phalcon\Config([
    'database' => [
        'adapter'     => 'Mysql',
        'host'        => 'ProjectPhalconPHP_mysql',
        'username'    => 'root',
        'password'    => 'pass',
        'dbname'      => 'docker',
        'charset'     => 'utf8',
    ],
    'application' => [ ....
]);

Nota: en el host como es un contenedor independiente del de php, debemos colocar el nombre del host que colocamos al servicio de php.

Para realizar la prueba de conexión usaremos de nuevo a phalcon dev tools para crear el modelo de test la tabla que creamos anteriormente para ello ejecutamos el siguiente comando

docker-compose run --rm --workdir="/var/www/html/TestPhalcon" php phalcon model test

En este comando aplica lo que explicamos hace poco, lo único es el workdir el cual le indicamos la ruta del proyecto ya el comando de crear el modelo necesita del contento del directorio.

Phalconphp docker test mysql web
Phalconphp docker test mysql web

Si queremos crear un crud completo con la instrucción scaffold la cual creara las vistas con su controlador.

docker-compose run --rm --workdir="/var/www/html/TestPhalcon" php phalcon scaffold --table-name test
Phalconphp docker test mysql web
Phalconphp docker test mysql web

Con esto ya podemos crear nuestros controladores, modelos y vistas para iniciar un proyecto con phalconphp, en futuros post realizare la explicación de como crear un proyecto sencillo con lo que acabamos de aprender en este contenido.

Referencias

[1] php-fpm, Tomado de stackscale.es, consultado agosto 2018

[2] Funciones de MYSQL PDO, Tomado de php.net documentación, consultado agosto 2018

[3] , Tomado de documentación phalconphp 3.1.1, consultado agosto 2018

[4] Phalcon dev tool comands, Tomado de documentación phalcon, consultado agosto 2018


Comentario

Debe aceptar antes de enviar