A principios de año escribí sobre la contenedorización de aplicaciones escritas en varias tecnologías de desarrollo que se comunican con Couchbase Server. Por ejemplo, había escrito sobre el despliegue de una aplicación Aplicación Golang con Docker, a Aplicación Java con Dockery un Aplicación Node.js con Docker. Esta vez vamos a echar un vistazo a cómo desplegar un contenedor PHP que se comunica con un contenedor Couchbase Server.
Vamos a crear un nodo Couchbase aprovisionado automáticamente y una aplicación PHP simplista que escriba y lea datos del nodo NoSQL de Couchbase.
Definamos primero la estructura del proyecto que representará a ambos contenedores:
1 2 3 4 5 6 7 8 9 10 11 |
raíz -- couchbase -- -- configure.sh -- -- Dockerfile -- php -- -- aplicación -- -- -- index.php -- -- configuración -- -- -- php.ini -- -- Dockerfile -- docker-compose.yml |
Cada contenedor tendrá su propio Dockerfile que contendrá la información del plano para nuestra configuración. En docker-compose.yml creará y desplegará los contenedores utilizando la información definida sobre puertos y variables de entorno.
Contenedor de la aplicación PHP
Dado que este es un tutorial de PHP, comenzaremos por construir nuestra aplicación PHP simple y contenerizarla. Debido a que queremos automatizar el despliegue, desarrollaremos nuestra aplicación php.ini y copiarlo durante el proceso de compilación.
Antes de llegar a esa parte, vamos a añadir algo de código a la sección index.php file:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?php header("Content-Type: application/json"); $cluster = new CouchbaseCluster("couchbase://" . getenv("COUCHBASE_HOST")); $bucket = $cluster->openBucket(getenv("COUCHBASE_BUCKET_NAME"), getenv("COUCHBASE_BUCKET_PASSWORD")); intentar { $result = $bucket->get("nraboy"); } catch (CouchbaseException $e) { $bucket->insert("nraboy", array( "name" => "Nic Raboy", "social_media" => array( "twitter" => "https://www.twitter.com/nraboy", "sitio web" => "https://www.thepolyglotdeveloper.com" ) )); $result = $bucket->get("nraboy"); } echo json_encode($result->value); ?> |
En el código anterior estamos diciendo que cualquier dato impreso será en formato JSON. Estamos estableciendo una conexión con un cluster de Couchbase y abriendo un Bucket particular en ese cluster. El problema es que estamos usando variables de entorno para definir el cluster y el Bucket. Estas se establecerán en el proceso de despliegue.
Con la aplicación conectada, se intentará obtener un documento de Couchbase por clave. Si ese documento no existe, será creado y luego obtenido. El documento obtenido se imprimirá como resultado.
Como he mencionado antes, se trata de una aplicación sencilla, nada del otro mundo. Ahora podemos centrarnos en el aspecto Docker de esta aplicación.
Abra el Dockerfile e incluyen lo siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
DESDE php:5.6.30-apache EJECUTAR apt-get update EJECUTAR apt-get install -y wget lsb-release EJECUTAR wget http://packages.couchbase.com/releases/couchbase-release/couchbase-release-1.0-2-amd64.deb EJECUTAR dpkg -i couchbase-release-1.0-2-amd64.deb RUN rm couchbase-release-1.0-2-amd64.deb EJECUTAR apt-get update RUN apt-get install -y libcouchbase-dev build-essential php5-dev zlib1g-dev RUN pecl install pcs-1.3.3 RUN pecl install couchbase WORKDIR /var/www/html COPIAR ./configuración/php.ini /usr/local/etc/php/ COPIAR ./aplicación/ /var/www/html/ RUN chown www-data:www-data . -R |
Lo anterior dice que vamos a usar una imagen de Apache. Si alguna vez has usado Couchbase con PHP, lo que viene a continuación te resultará muy familiar. Toda la recopilación de dependencias fue tomada directamente del archivo Documentación PHP de Couchbase. En RUN
significa que las dependencias se recopilarán en tiempo de compilación, no en tiempo de ejecución.
Con las dependencias disponibles, el php.ini se copia en la imagen, así como el archivo index.php archivo. Esto nos lleva al php.ini archivo.
En lugar de pegar un largo y desagradable trozo de configuración, lo mejor es que te descargues el archivo php.ini del archivo oficial Repositorio PHP GitHub. El único cambio que introducimos se refiere a las extensiones. Según el Documentación PHP de Couchbasetenemos que añadir lo siguiente:
1 |
extension=couchbase.so |
Busca la sección de extensiones y añádela allí.
En este punto la imagen PHP puede ser construida y podemos desplegarla como un contenedor. Sin embargo, vamos a planificar con antelación y crear un archivo Compose.
Abra el docker-compose.yml e incluya lo siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
versión: "2 servicios: php: compilación: ./php puertos: - 8080:80 medio ambiente: - COUCHBASE_HOST=couchbase - COUCHBASE_BUCKET_NAME=por defecto - COUCHBASE_BUCKET_PASSWORD= CONTRASEÑA reinicio: siempre |
Lo anterior define un servicio llamado php
con mapeos de puertos y variables de entorno. Estas variables coinciden con las que tenemos en la aplicación PHP. La imagen se construirá a partir del Dockerfile que se encuentra en el proyecto PHP.
Si ajusta el COUCHBASE_HOST
a algo remoto, estamos listos, pero para este ejemplo vamos a utilizar otro contenedor.
Contenedorización de Couchbase Server
El objetivo de contenerizar Couchbase es que vamos a automatizarlo. Ya existe una imagen Docker para Couchbase, pero no está pre-aprovisionada, lo que puede llevar tiempo durante el proceso de despliegue.
Abra el Dockerfile el proyecto Couchbase e incluya lo siguiente:
1 2 3 4 5 |
DESDE couchbase COPIAR configure.sh /opt/couchbase CMD ["/opt/couchbase/configure.sh"] |
Lo anterior dice que vamos a utilizar la imagen oficial de Couchbase, pero vamos a copiar un script en ella y luego ejecutarlo en tiempo de ejecución. Este script aprovisionará la instancia automáticamente.
Abra el configure.sh e incluya los siguientes comandos:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
set -m /entrypoint.sh couchbase-server & dormir 15 curl -v -X POST http://127.0.0.1:8091/pools/default -d memoryQuota=512 -d indexMemoryQuota=512 curl -v http://127.0.0.1:8091/node/controller/setupServices -d services=kv%2cn1ql%2Cindex curl -v http://127.0.0.1:8091/settings/web -d port=8091 -d username=$COUCHBASE_ADMINISTRATOR_USERNAME -d password=$COUCHBASE_ADMINISTRATOR_PASSWORD curl -i -u $COUCHBASE_ADMINISTRATOR_USERNAME:$COUCHBASE_ADMINISTRATOR_PASSWORD -X POST http://127.0.0.1:8091/settings/indexes -d 'storageMode=memory_optimized' curl -v -u $COUCHBASE_ADMINISTRATOR_USERNAME:$COUCHBASE_ADMINISTRATOR_PASSWORD -X POST http://127.0.0.1:8091/pools/default/buckets -d name=$COUCHBASE_BUCKET -d bucketType=couchbase -d ramQuotaMB=128 -d authType=sasl -d saslPassword=$COUCHBASE_BUCKET_PASSWORD dormir 15 curl -v http://127.0.0.1:8093/query/service -d "statement=CREATE PRIMARY INDEX ON `$COUCHBASE_BUCKET`" fg 1 |
Couchbase Server tiene su propia API RESTful que estamos tratando de consumir con un montón de comandos cURL. Estamos definiendo cuotas de memoria, qué servicios existen en el nodo e información de autenticación.
Observe que muchos de los comandos incluyen variables de entorno como $COUCHBASE_ADMINISTRATOR_USERNAME
. Esto se debe a que vamos a pasarlos a través de la función docker-compose.yml igual que hicimos con la aplicación PHP.
Abra el docker-compose.yml y que tenga el siguiente aspecto:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
versión: "2 servicios: couchbase: compilación: ./couchbase puertos: - 8091:8091 - 8092:8092 - 8093:8093 medio ambiente: - COUCHBASE_ADMINISTRATOR_USERNAME=Administrador - COUCHBASE_ADMINISTRATOR_PASSWORD=contraseña - COUCHBASE_BUCKET=por defecto - COUCHBASE_BUCKET_PASSWORD= CONTRASEÑA php: compilación: ./php puertos: - 8080:80 medio ambiente: - COUCHBASE_HOST=couchbase - COUCHBASE_BUCKET_NAME=por defecto - COUCHBASE_BUCKET_PASSWORD= CONTRASEÑA reinicio: siempre |
Hemos incluido otro servicio llamado couchbase
con un montón de asignaciones de puertos y variables de entorno. Hay algo importante a tener en cuenta aquí. Recuerde que el COUCHBASE_HOST
en la sección PHP? Tiene un host que debe coincidir con el nombre de servicio de nuestra base de datos que es couchbase
.
Despliegue de contenedores con Docker
Con la base en su lugar, es hora de desplegar los dos contenedores para que tengamos un conjunto funcional de microservicios.
Desde la CLI de Docker, ejecute lo siguiente:
1 2 |
docker-compose run -d --service-ports --name couchbase couchbase docker-compose run -d --service-ports --name php php |
Los comandos anteriores construirán y desplegarán cada una de las imágenes con los puertos definidos en el archivo Compose. Desde el navegador web, http://localhost:8091 debería llevarte al dashboard de Couchbase Server, y http://localhost:8080 debería llevarte a tu aplicación PHP.
Si tiene éxito, debería ver la información guardada en la base de datos y mostrada en la pantalla.
Conclusión
Acabas de ver cómo contenerizar y desplegar una aplicación PHP que se comunica con un contenedor NoSQL Couchbase. Mientras que nuestra elección de aplicación era simple, se puede extender fácilmente a algo más complicado usando cualquiera de los frameworks PHP disponibles.
Esta misma guía puede verse con Node.js, Golangy Java. Si quieres aprender más sobre la contenedorización de Couchbase Server, he escrito una versión más completa aquí.
Para obtener más información sobre el SDK PHP de Couchbase, consulte la página Portal para desarrolladores de Couchbase.
Es demasiado viejo, ¿Podemos tener sdk 3.0?