Ambiente de desarrollo final (php cakephp) en docker

Enviado por Francisco Carrizales el Mar, 29/01/2019 - 15:16

Siendo que me ausente por mucho tiempo, ya no recuerdo ni en que me quede. De tal manera publico cual es mi configuración final para desarrollar php utilizando cakephp 3.x que utilizo día a día en mi trabajo.

Que necesito para trabajar:

  • Apache con php
  • Un servidor local de mysql
  • Acceso a dicho servidor de mysql utilizando phpmyadmin
  • Un worker para procesamiento en background
  • Un redis para el cache

 

Con esto en mente comparto la estructura de directorios:

estructura-directorios-docker-php-cakephp

Donde lo importante es lo siguiente:

  • apache que es un directorio donde se encuentra la configuración de apache y un script para el worker
  • Dockerfile para construir nuestro servidor de apache
  • docker-compose.yml para crear el resto de servicios.

 

Apache

docker-configuracion-apache-creacion-worker

000-default.conf:

<VirtualHost *:80>
	# The ServerName directive sets the request scheme, hostname and port that
	# the server uses to identify itself. This is used when creating
	# redirection URLs. In the context of virtual hosts, the ServerName
	# specifies what hostname must appear in the request's Host: header to
	# match this virtual host. For the default virtual host (this file) this
	# value is not decisive as it is used as a last resort host regardless.
	# However, you must set it for any further virtual host explicitly.
	#ServerName www.example.com

	ServerAdmin webmaster@localhost
	DocumentRoot /var/www/html/webroot

	# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
	# error, crit, alert, emerg.
	# It is also possible to configure the loglevel for particular
	# modules, e.g.
	#LogLevel info ssl:warn

	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined

	# For most configuration files from conf-available/, which are
	# enabled or disabled at a global level, it is possible to
	# include a line for only one particular virtual host. For example the
	# following line enables the CGI configuration for this host only
	# after it has been globally disabled with "a2disconf".
	#Include conf-available/serve-cgi-bin.conf
</VirtualHost>

worker.sh

php /var/www/html/bin/cake.php Queue.queue runworker

Dockerfile

FROM php:7.0-apache
RUN apt-get update && apt-get install libxml2-dev git libicu-dev  g++ zlib1g-dev libmcrypt-dev -y 
RUN docker-php-source extract
RUN docker-php-ext-install soap zip mcrypt mbstring intl simplexml pdo pdo_mysql
RUN apt-get install libfreetype6-dev libjpeg62-turbo-dev  -y
RUN docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ 
RUN docker-php-ext-install gd
RUN docker-php-ext-install calendar
RUN apt-get install libxslt-dev -y
RUN docker-php-ext-install xsl
RUN a2enmod rewrite
COPY ./apache/000-default.conf /etc/apache2/sites-available

RUN service apache2 restart 
RUN usermod -u 1000 www-data
RUN chown -R www-data:www-data /var/www/

RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
RUN php composer-setup.php --filename=composer --install-dir=/usr/local/bin
RUN php -r "unlink('composer-setup.php');"

docker-compose.yml

version: '2'
services:
  redis:
    image: redis
    ports:
     - "6379"
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    depends_on:
      - mysql
    environment:
      PMA_VERBOSES: local,Dev
      PMA_HOSTS: mysql,asdff.rds.amazonaws.com
    ports:
     - "8081:80"
  mysql:
    image: mysql:5.7
    volumes:
      - db_data_mysql:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: db_p
      MYSQL_USER: user_p
      MYSQL_PASSWORD: pass_p
  worker:
    depends_on:
      - mysql
      - redis
    build: .
    restart: always
    command:
      - apache2-custom.sh
    volumes:
      - "./apache/worker.sh:/usr/local/bin/apache2-custom.sh"
      - .:/var/www/html/
    environment:
      DEBUG: "false"
      REDIS_HOST: redis
      DATABASE_URL: mysql://user_p:pass_p@mysql/db_p?encoding=utf8&timezone=UTC&cacheMetadata=true

  apache:
    depends_on:
      - mysql
      - redis
    build: .
    ports:
     - "8080:80"
    environment:
      DEBUG: "true"
      REDIS_HOST: redis
      DATABASE_URL: mysql://user_p:pass_p@mysql/db_p?encoding=utf8&timezone=UTC&cacheMetadata=true
    volumes:
     - .:/var/www/html/

volumes:
  db_data_mysql:

Donde se puede destacar los siguiente:

PhpMyAdmin

  • Esta utilizando dos variables PMA_VERBOSES y  PMA_HOSTS
  • La primera es para indicar el nombre del host a utlizar
  • La segunda es para indicar la ip. dominio del servidor al que se desea conectar dando como resultado lo siguiente, donde nos habilita un select para indicar que host a utilizar

docker-phpmyadmin-multihost

Worker

  • Esta utilizando el mismo Dockerfile para su contrucción.
  • Tiene un restart:always,  esto se debe a que el script que esta ejecutando solo dura 30 segundos, si no encuentra una tarea a realizar termina. Con esta línea se vuelve a activar.
  • Esta utilizando command que es para indicarle que ejecute un sh en lugar del punto de entrada que esta programado.
  • Esta utlizando otro volumen,  "./apache/worker.sh:/usr/local/bin/apache2-custom.sh"  que indica que coloque el archivo del worker.sh en ese directorio y con ese nombre, que es el ejecutable que se llama con command

 

docker-restart-always

Finalmente construimos el servicio y ejecutamos:

> docker-compose build

> docker-compose up

Y listo este es básicamente el resultado final de mi entorno de desarrollo:

 

 

Etiquetas

Añadir nuevo comentario

HTML Restringido

  • Etiquetas HTML permitidas: <a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • Saltos automáticos de líneas y de párrafos.
  • Las direcciones de correos electrónicos y páginas web se convierten en enlaces automáticamente.