No início do ano, escrevi sobre a conteinerização de aplicativos escritos em várias tecnologias de desenvolvimento que se comunicam com o Couchbase Server. Por exemplo, escrevi sobre a implantação de um aplicativo Aplicativo Golang com o Docker, a Aplicativo Java com o Dockere um Aplicativo Node.js com o Docker. Desta vez, vamos dar uma olhada em como implantar um contêiner PHP que se comunica com um contêiner do Couchbase Server.
Vamos criar um nó do Couchbase provisionado automaticamente e um aplicativo PHP simples que grava e lê dados do nó NoSQL do Couchbase.
Primeiro, vamos definir a estrutura do projeto que representará os dois contêineres:
1 2 3 4 5 6 7 8 9 10 11 |
raiz -- couchbase -- -- configure.sh -- Dockerfile -- php -- -- aplicativo -- -- -- index.php -- -- configuração -- -- -- php.ini -- Dockerfile -- docker-compose.yml |
Cada contêiner terá seu próprio Dockerfile que conterá informações de blueprint para nossa configuração. As docker-compose.yml criará e implantará os contêineres usando a porta definida e as informações da variável de ambiente.
Containerização do aplicativo PHP
Como este é um tutorial de PHP, começaremos criando nosso aplicativo PHP simples e colocando-o em contêineres. Como queremos automatizar a implantação, desenvolveremos nosso aplicativo php.ini localmente e copiando-o durante o processo de compilação.
Antes de chegarmos a essa parte, vamos adicionar algum código ao 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 = novo CouchbaseCluster("couchbase://" . getenv("COUCHBASE_HOST")); $bucket = $cluster->openBucket(getenv("COUCHBASE_BUCKET_NAME"), getenv("COUCHBASE_BUCKET_PASSWORD")); tente { $result = $bucket->get("nraboy"); } catch (CouchbaseException $e) { $bucket->insert("nraboy", array( "name" => "Nic Raboy", "social_media" => array( "twitter" => "https://www.twitter.com/nraboy", "website" => "https://www.thepolyglotdeveloper.com" ) )); $result = $bucket->get("nraboy"); } echo json_encode($result->value); ?> |
No código acima, estamos dizendo que todos os dados impressos estarão no formato JSON. Estamos estabelecendo uma conexão com um cluster do Couchbase e abrindo um determinado Bucket nesse cluster. O problema aqui é que estamos usando variáveis de ambiente para definir o cluster e o Bucket. Elas serão definidas no processo de implantação.
Com o aplicativo conectado, ele tentará obter um documento do Couchbase por chave. Se esse documento não existir, ele será criado e, em seguida, obtido. O documento obtido será impresso como resultado.
Como mencionei anteriormente, este é um aplicativo simples, nada sofisticado. Agora podemos nos concentrar no aspecto do Docker desse aplicativo.
Abra o Dockerfile e incluem o seguinte:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
DE php:5.6.30-apache Execute o apt-get update Executar apt-get install -y wget lsb-release EXECUTAR wget http://packages.couchbase.com/releases/couchbase-release/couchbase-release-1.0-2-amd64.deb Executar dpkg -i couchbase-release-1.0-2-amd64.deb RUN rm couchbase-release-1.0-2-amd64.deb Execute o apt-get update EXECUTAR apt-get install -y libcouchbase-dev build-essential php5-dev zlib1g-dev Executar pecl install pcs-1.3.3 EXECUTAR o pecl install couchbase WORKDIR /var/www/html COPY ./configuration/php.ini /usr/local/etc/php/ COPY ./application/ /var/www/html/ RUN chown www-data:www-data . -R |
O texto acima diz que usaremos uma imagem do Apache. Se você já usou o Couchbase com PHP, o que vem a seguir lhe parecerá muito familiar. Todo o conjunto de dependências foi retirado diretamente do arquivo Documentação PHP do Couchbase. O CORRER
significa que as dependências serão coletadas no momento da compilação, não no momento da execução.
Com as dependências disponíveis, o php.ini é copiado para a imagem, assim como o arquivo index.php arquivo. Isso nos leva ao arquivo php.ini arquivo.
Em vez de colar uma parte longa e desagradável da configuração, é melhor fazer o download do arquivo php.ini do arquivo oficial Repositório PHP no GitHub. A única alteração que estamos fazendo é em relação às extensões. De acordo com o Documentação PHP do Couchbaseprecisamos adicionar o seguinte:
1 |
extension=couchbase.so |
Localize a seção de extensões e adicione-a lá.
Neste ponto, a imagem PHP pode ser criada e podemos implantá-la como um contêiner. No entanto, vamos planejar com antecedência e criar um arquivo Compose.
Abra o docker-compose.yml e inclua o seguinte:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
versão: '2' serviços: php: Compilação: ./php portos: - 8080:80 ambiente: - COUCHBASE_HOST=couchbase - COUCHBASE_BUCKET_NAME=padrão - COUCHBASE_BUCKET_PASSWORD= reiniciar: sempre |
O texto acima define um serviço chamado php
com mapeamentos de portas e variáveis de ambiente. Essas variáveis correspondem ao que temos no aplicativo PHP. A imagem será criada a partir do arquivo Dockerfile encontrado no projeto PHP.
Se você definir o COUCHBASE_HOST
para algo remoto, estamos prontos para começar, mas, neste exemplo, usaremos outro contêiner.
Colocação do Couchbase Server em contêineres
O objetivo de colocar o Couchbase em contêineres é automatizá-lo. Já existe uma imagem do Docker para o Couchbase, mas ela não é pré-provisionada, o que pode levar tempo durante o processo de implementação.
Abra o Dockerfile do projeto Couchbase e inclua o seguinte:
1 2 3 4 5 |
DE couchbase COPIAR configure.sh /opt/couchbase CMD ["/opt/couchbase/configure.sh"] |
O texto acima diz que usaremos a imagem oficial do Couchbase, mas copiaremos um script para ela e o executaremos em tempo de execução. Esse script provisionará a instância automaticamente.
Abra o configure.sh e inclua os seguintes 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 |
O Couchbase Server tem sua própria API RESTful que estamos tentando consumir com vários comandos cURL. Estamos definindo cotas de memória, quais serviços existem no nó e informações de autenticação.
Observe que muitos dos comandos incluem variáveis ambientais como $COUCHBASE_ADMINISTRATOR_USERNAME
. Isso ocorre porque vamos passá-los por meio do docker-compose.yml da mesma forma que fizemos com o aplicativo PHP.
Abra o docker-compose.yml e faça com que ele se pareça com o seguinte:
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 |
versão: '2' serviços: couchbase: compilação: ./couchbase portos: - 8091:8091 - 8092:8092 - 8093:8093 ambiente: - COUCHBASE_ADMINISTRATOR_USERNAME=Administrador - COUCHBASE_ADMINISTRATOR_PASSWORD=senha - COUCHBASE_BUCKET=padrão - COUCHBASE_BUCKET_PASSWORD= php: Compilação: ./php portos: - 8080:80 ambiente: - COUCHBASE_HOST=couchbase - COUCHBASE_BUCKET_NAME=padrão - COUCHBASE_BUCKET_PASSWORD= reiniciar: sempre |
Incluímos outro serviço chamado couchbase
com um monte de mapeamentos de portas e variáveis de ambiente. No entanto, há algo importante a ser observado aqui. Lembre-se de que o COUCHBASE_HOST
na seção PHP? Ele tem um host que deve corresponder ao nome do serviço do nosso banco de dados, que é couchbase
.
Implantar os contêineres com o Docker
Com a base estabelecida, é hora de implantar os dois contêineres para que tenhamos um conjunto funcional de microsserviços.
Na CLI do Docker, execute o seguinte:
1 2 |
docker-compose run -d --service-ports --name couchbase couchbase docker-compose run -d --service-ports --name php php |
Os comandos acima criarão e implementarão cada uma das imagens com as portas definidas no arquivo Compose. No navegador da Web, http://localhost:8091 deve levá-lo ao painel do Couchbase Server, e http://localhost:8080 deve levá-lo ao seu aplicativo PHP.
Se for bem-sucedido, você verá as informações salvas no banco de dados e exibidas na tela.
Conclusão
Você acabou de ver como conteinerizar e implantar um aplicativo PHP que se comunica com um contêiner NoSQL do Couchbase. Embora nossa escolha de aplicativo tenha sido simples, ele pode ser facilmente ampliado para algo mais complicado usando qualquer uma das estruturas PHP disponíveis.
Esse mesmo guia pode ser visto com Node.js, Golange Java. Se quiser saber mais sobre a conteinerização do Couchbase Server, escrevi uma versão mais completa aqui.
Para obter mais informações sobre o SDK PHP do Couchbase, consulte a seção Portal do desenvolvedor do Couchbase.
Ele é muito antigo. Podemos ter o sdk 3.0?