En el post anterior vimos cómo crear un entorno de desarrollo para Drupal8 usando Docker.
Pero, ¿y si quiero usar otro framework de PHP, por ejemplo Yii2, en mi OSX? Es muy sencillo.
Instalación del DOCKER stack (docker4php)
docker4php miguelm$ cd Sites/testyii2 docker4php miguelm$ git clone https://github.com/wodby/docker4php docker4php miguelm$ cd docker4php
Editar .env
y dejarlo como sigue:
### Documentation available at https://docs.wodby.com/stacks/php/local ### Changelog can be found at https://github.com/wodby/docker4php/releases ### Images tags format explained at https://github.com/wodby/docker4php#images-tags ### PROJECT SETTINGS PROJECT_NAME=unizaryii PROJECT_BASE_URL=unizaryii.docker.localhost DB_NAME=php DB_USER=php DB_PASSWORD=php DB_ROOT_PASSWORD=password DB_HOST=mariadb DB_DRIVER=mysql ### --- PHP ---- #PHP_TAG=7.2-dev-4.8.2 #PHP_TAG=7.1-dev-4.8.2 #PHP_TAG=5.6-dev-4.8.2 PHP_TAG=7.2-dev-macos-4.8.2 #PHP_TAG=7.1-dev-macos-4.8.2 #PHP_TAG=5.6-dev-macos-4.8.2 ### --- NGINX ---- NGINX_TAG=1.15-5.0.17 #NGINX_TAG=1.14-5.0.17 ### --- NODE --- NODE_TAG=10-0.9.0 #NODE_TAG=8-0.9.0 #NODE_TAG=6-0.9.0 ### --- MARIADB ---- MARIADB_TAG=10.1-3.3.11 #MARIADB_TAG=10.2-3.3.11 #MARIADB_TAG=10.3-3.3.11 ### --- POSTGRESQL ---- POSTGRES_TAG=11-1.5.0 #POSTGRES_TAG=10-1.5.0 #POSTGRES_TAG=9.6-1.5.0 #POSTGRES_TAG=9.5-1.5.0 #POSTGRES_TAG=9.4-1.5.0 #POSTGRES_TAG=9.3-1.5.0 ### --- REDIS --- REDIS_TAG=4-3.0.2 #REDIS_TAG=5-3.0.2 ### --- ELASTICSEARCH --- ELASTICSEARCH_TAG=6.3-3.0.2 #ELASTICSEARCH_TAG=6.2-3.0.2 #ELASTICSEARCH_TAG=6.1-3.0.2 #ELASTICSEARCH_TAG=6.0-3.0.2 #ELASTICSEARCH_TAG=5.6-3.0.2 #ELASTICSEARCH_TAG=5.5-3.0.2 #ELASTICSEARCH_TAG=5.4-3.0.2 ### --- KIBANA --- KIBANA_TAG=6.3-3.0.2 #KIBANA_TAG=6.2-3.0.2 #KIBANA_TAG=6.1-3.0.2 #KIBANA_TAG=6.0-3.0.2 #KIBANA_TAG=5.6-3.0.2 #KIBANA_TAG=5.5-3.0.2 #KIBANA_TAG=5.4-3.0.2 ### --- SOLR --- SOLR_TAG=7.4-3.0.6 #SOLR_TAG=7.3-3.0.6 #SOLR_TAG=7.2-3.0.6 #SOLR_TAG=7.1-3.0.6 #SOLR_TAG=6.6-3.0.6 #SOLR_TAG=5.5-3.0.6 ### OTHERS ADMINER_TAG=4.6-3.2.0 APACHE_TAG=2.4-4.0.2 ATHENAPDF_TAG=2.10.0 MEMCACHED_TAG=1-2.2.1 RSYSLOG_TAG=latest VARNISH_TAG=4.1-3.0.10 WEBGRIND_TAG=1.5-1.6.2 OPENSMTPD_TAG=6.0-1.4.0 XHPROF_TAG=1.0.2
Compilamos y levantamos…
docker4php miguelm$ docker-compose up -d
En el fichero docker-compose.yml
la variable NGINX_SERVER_ROOT
tiene el valor /var/www/html/public
Así que creamos el directorio public
y un fichero index.php
para probar si todo ha ido bien…
docker4php miguelm$ mkdir public docker4php miguelm$ echo "" > public/index.php
Lo siguiente será editar (como root) el fichero /etc/hosts
de la máquina anfitrión y añadir algunas entradas que nos serán útiles:
127.0.0.1 unizaryii.docker.localhost 127.0.0.1 pma.unizaryii.docker.localhost
Y ya podemos ir a nuestro navegador en la máquina anfitrión: http://unizaryii.docker.localhost:8000/ y comprobar que todo funciona.
Instalación de Yii2 y creación de proyecto
Ahora que ya hemos comprobado que el setup funciona, vamos a instalar Yii2.
docker4php miguelm$ git clone https://github.com/yiisoft/yii2 _host-volumes/yii2 docker4php miguelm$ mv _host-volumes/yii2 . docker4php miguelm$ rm -Rf _host-volumes
Y vamos a crear nuestro primer proyecto Yii2:
# eliminamos el directorio "public" completo docker4php miguelm$ rm -Rf public # creamos un nuevo proyecto en la carpeta "demo" docker4php miguelm$ composer create-project yiisoft/yii2-app-basic demo
Lo siguiente será editar el fichero docker-compose.yml
para indicar el nuevo valor de NGINX_SERVER_ROOT
, que deberá ser:
NGINX_SERVER_ROOT: /var/www/html/demo/web
Paramos y arrancamos los dockers con la nueva configuración:
docker4php miguelm$ docker-compose stop docker4php miguelm$ docker-compose up -d
Ya tenemos nuestro proyecto Yii2 listo…
¿Y si en lugar de NGINX quiero utilizar Apache como servidor web?
Muy sencillo. Editamos el archivo docker-compose.yml
y comentamos la sección de NGINX
y descomentamos la sección de Apache. El fichero docker-compose.yml
quedaría así:
version: "3" services: mariadb: image: wodby/mariadb:$MARIADB_TAG container_name: "${PROJECT_NAME}_mariadb" stop_grace_period: 30s environment: MYSQL_ROOT_PASSWORD: $DB_ROOT_PASSWORD MYSQL_DATABASE: $DB_NAME MYSQL_USER: $DB_USER MYSQL_PASSWORD: $DB_PASSWORD # volumes: # - ./mariadb-init:/docker-entrypoint-initdb.d # Place init .sql file(s) here. # - /path/to/mariadb/data/on/host:/var/lib/mysql # I want to manage volumes manually. # postgres: # image: wodby/postgres:$POSTGRES_TAG # container_name: "${PROJECT_NAME}_postgres" # stop_grace_period: 30s # environment: # POSTGRES_PASSWORD: $DB_PASSWORD # POSTGRES_DB: $DB_NAME # POSTGRES_USER: $DB_USER # volumes: # - ./postgres-init:/docker-entrypoint-initdb.d # Place init file(s) here. # - /path/to/postgres/data/on/host:/var/lib/postgresql/data # I want to manage volumes manually. php: image: wodby/php:$PHP_TAG container_name: "${PROJECT_NAME}_php" environment: PHP_SENDMAIL_PATH: /usr/sbin/sendmail -t -i -S mailhog:1025 DB_HOST: $DB_HOST DB_USER: $DB_USER DB_PASSWORD: $DB_PASSWORD DB_NAME: $DB_NAME ## Read instructions at https://wodby.com/stacks/php/docs/local/xdebug/ # PHP_XDEBUG: 1 # PHP_XDEBUG_DEFAULT_ENABLE: 1 # PHP_XDEBUG_REMOTE_CONNECT_BACK: 0 # PHP_IDE_CONFIG: serverName=my-ide # PHP_XDEBUG_REMOTE_HOST: 172.17.0.1 # Linux # PHP_XDEBUG_REMOTE_HOST: 10.254.254.254 # macOS # PHP_XDEBUG_REMOTE_HOST: 10.0.75.1 # Windows volumes: - ./:/var/www/html ## For macOS users (https://wodby.com/stacks/php/docs/local/docker-for-mac/) # - ./:/var/www/html:cached # User-guided caching # - docker-sync:/var/www/html # Docker-sync ## For XHProf and Xdebug profiler traces # - files:/mnt/files # nginx: # image: wodby/nginx:$NGINX_TAG # container_name: "${PROJECT_NAME}_nginx" # depends_on: # - php # environment: # NGINX_STATIC_OPEN_FILE_CACHE: "off" # NGINX_ERROR_LOG_LEVEL: debug # NGINX_BACKEND_HOST: php # NGINX_VHOST_PRESET: php # NGINX_SERVER_ROOT: /var/www/html/demo/web # volumes: # - ./:/var/www/html # Options for macOS users (https://wodby.com/stacks/php/docs/local/docker-for-mac/) # - ./:/var/www/html:cached # User-guided caching # - docker-sync:/var/www/html # Docker-sync # labels: # - 'traefik.backend=${PROJECT_NAME}_nginx' # - 'traefik.port=80' # - 'traefik.frontend.rule=Host:${PROJECT_BASE_URL}' apache: image: wodby/apache:$APACHE_TAG container_name: "${PROJECT_NAME}_apache" depends_on: - php environment: APACHE_LOG_LEVEL: debug APACHE_BACKEND_HOST: php APACHE_VHOST_PRESET: php APACHE_DOCUMENT_ROOT: /var/www/html/demo/web volumes: - ./:/var/www/html ## For macOS users (https://wodby.com/stacks/php/docs/local/docker-for-mac/) ## - ./:/var/www/html:cached # User-guided caching ## - docker-sync:/var/www/html # Docker-sync labels: - 'traefik.backend=${PROJECT_NAME}_apache' - 'traefik.port=80' - 'traefik.frontend.rule=Host:${PROJECT_BASE_URL}' mailhog: image: mailhog/mailhog container_name: "${PROJECT_NAME}_mailhog" labels: - 'traefik.backend=${PROJECT_NAME}_mailhog' - 'traefik.port=8025' - 'traefik.frontend.rule=Host:mailhog.${PROJECT_BASE_URL}' # varnish: # image: wodby/varnish:$VARNISH_TAG # container_name: "${PROJECT_NAME}_varnish" # depends_on: # - nginx # environment: # VARNISH_SECRET: secret # VARNISH_BACKEND_HOST: nginx # VARNISH_BACKEND_PORT: 80 # VARNISH_PURGE_EXTERNAL_REQUEST_HEADER: X-Real-IP # labels: # - 'traefik.backend=${PROJECT_NAME}_varnish' # - 'traefik.port=6081' # - 'traefik.frontend.rule=Host:varnish.${PROJECT_BASE_URL}' # redis: # container_name: "${PROJECT_NAME}_redis" # image: wodby/redis:$REDIS_TAG # adminer: # container_name: "${PROJECT_NAME}_adminer" # image: wodby/adminer:$ADMINER_TAG # environment: ## For PostgreSQL: ## ADMINER_DEFAULT_DB_DRIVER: pgsql # ADMINER_DEFAULT_DB_HOST: $DB_HOST # ADMINER_DEFAULT_DB_NAME: $DB_NAME # labels: # - 'traefik.backend=${PROJECT_NAME}_adminer' # - 'traefik.port=9000' # - 'traefik.frontend.rule=Host:adminer.${PROJECT_BASE_URL}' # pma: # image: phpmyadmin/phpmyadmin # container_name: "${PROJECT_NAME}_pma" # environment: # PMA_HOST: $DB_HOST # PMA_USER: $DB_USER # PMA_PASSWORD: $DB_PASSWORD # PHP_UPLOAD_MAX_FILESIZE: 1G # PHP_MAX_INPUT_VARS: 1G # labels: # - 'traefik.backend=${PROJECT_NAME}_pma' # - 'traefik.port=80' # - 'traefik.frontend.rule=Host:pma.${PROJECT_BASE_URL}' # solr: # image: wodby/solr:$SOLR_TAG # container_name: "${PROJECT_NAME}_solr" # environment: # SOLR_HEAP: 1024m # labels: # - 'traefik.backend=${PROJECT_NAME}_solr' # - 'traefik.port=8983' # - 'traefik.frontend.rule=Host:solr.${PROJECT_BASE_URL}' # elasticsearch: # image: wodby/elasticsearch:$ELASTICSEARCH_TAG # environment: # ES_JAVA_OPTS: "-Xms500m -Xmx500m" # ulimits: # memlock: # soft: -1 # hard: -1 # kibana: # image: wodby/kibana:$KIBANA_TAG # depends_on: # - elasticsearch # labels: # - 'traefik.backend=${PROJECT_NAME}_kibana' # - 'traefik.port=5601' # - 'traefik.frontend.rule=Host:kibana.php.docker.localhost' # memcached: # container_name: "${PROJECT_NAME}_memcached" # image: wodby/memcached:$MEMCACHED_TAG # rsyslog: # container_name: "${PROJECT_NAME}_rsyslog" # image: wodby/rsyslog:$RSYSLOG_TAG # athenapdf: # image: arachnysdocker/athenapdf-service:$ATHENAPDF_TAG # container_name: "${PROJECT_NAME}_athenapdf" # environment: # WEAVER_AUTH_KEY: weaver-auth-key # WEAVER_ATHENA_CMD: "athenapdf -S" # WEAVER_MAX_WORKERS: 10 # WEAVER_MAX_CONVERSION_QUEUE: 50 # WEAVER_WORKER_TIMEOUT: 90 # WEAVER_CONVERSION_FALLBACK: "false" # node: # image: wodby/node:$NODE_TAG # container_name: "${PROJECT_NAME}_node" # working_dir: /app # labels: # - 'traefik.backend=${PROJECT_NAME}_node' # - 'traefik.port=3000' # - 'traefik.frontend.rule=Host:front.${PROJECT_BASE_URL}' # expose: # - "3000" # volumes: # - ./path/to/your/single-page-app:/app # command: sh -c 'npm install && npm run start' # blackfire: # image: blackfire/blackfire # environment: # BLACKFIRE_SERVER_ID: XXXXX # BLACKFIRE_SERVER_TOKEN: YYYYY # webgrind: # image: wodby/webgrind:$WEBGRIND_TAG # environment: # WEBGRIND_PROFILER_DIR: /mnt/files/xdebug/profiler # labels: # - 'traefik.backend=${PROJECT_NAME}_webgrind' # - 'traefik.port=8080' # - 'traefik.frontend.rule=Host:webgrind.php.docker.localhost' # volumes: # - files:/mnt/files # opensmtpd: # container_name: "${PROJECT_NAME}_opensmtpd" # image: wodby/opensmtpd:$OPENSMTPD_TAG # xhprof: # image: wodby/xhprof:$XHPROF_TAG # restart: always # volumes: # - files:/mnt/files # labels: # - 'traefik.backend=${PROJECT_NAME}_xhprof' # - 'traefik.port=8080' # - 'traefik.frontend.rule=Host:xhprof.${PROJECT_BASE_URL}' portainer: image: portainer/portainer container_name: "${PROJECT_NAME}_portainer" command: --no-auth -H unix:///var/run/docker.sock volumes: - /var/run/docker.sock:/var/run/docker.sock labels: - 'traefik.backend=${PROJECT_NAME}_portainer' - 'traefik.port=9000' - 'traefik.frontend.rule=Host:portainer.${PROJECT_BASE_URL}' traefik: image: traefik container_name: "${PROJECT_NAME}_traefik" command: -c /dev/null --web --docker --logLevel=INFO ports: - '8000:80' # - '8080:8080' # Dashboard volumes: - /var/run/docker.sock:/var/run/docker.sock #volumes: ## Docker-sync for macOS users # docker-sync: # external: true ## For Xdebug profiler # files:
Después simplemente:
docker4php miguelm$ docker-compose up -d --remove-orphans