Passa ai contenuti principali

Creare un ambiente di sviluppo PHP SYMFONY MYSQL DOCKER

Preferisco Docker a Vagrant, più leggero. Ognuno naturalmente ha le sue preferenze.
Docker lo trovo più facile e veloce da configurare.
Non conosci Docker, vai sul sito e scoprirai un tool fantastico per "virtualizzare" le macchine, anche se non è il termine corretto.
Docker crea un contenitore all'interno del tu S.O. senza però virtualizzare l'infrastruttura hardware.
A me piace sviluppare con Symfony: W Symfony2!

[update: ho trovato questa serie di post nuovi per lo sviluppo con symfony su docker
https://blog.vandenbrand.org/2016/02/03/developing-symfony-applications-with-docker-series-part-i-getting-started/
]

Per un nuovo progetto mi sono deciso di creare un sistema per la condivisione dello stack (si dice così? scusate non sono un ingegnere) di sviluppo

Lista della spesa

Partiamo con la lista della spesa:

  • database: ho scelto MySql. Per ora è sufficiente, finchè non ho finito la migrazione del vecchio sistema
  • APACHE e PHP
Ora vediamo come creare un container per MySql

Docker & Mysql

Partiamo dallo scaricare il container: docker pull mysql
Finito. Semplice e veloce

Un paio di considerazioni

I dati del DB, ossia databases (come si chiama in italiano?) e tabelle, i files fisici, li voglio sulla mia macchina
Voglio configurare una password per accedere
L'utente è sufficiente quello standards
Voglio un indirizzo ad hoc

Iniziamo 

Sull'hub di Mysql ci sono tutte queste indicazioni e se aggiungiamo anche qualche comando aggiuntivo dalla documentazione ufficiale, smarchiamo la lista della spesa
I dati del DB, ossia databases (come si chiama in italiano?) e tabelle, i files fisici, li voglio sulla mia macchina

In Docker si chiamano volumi e si settano con l'opzione -v
Sull'hub dice:
-v /my/own/datadir:/var/lib/mysql

Io ho una cartella temp, uso Ubuntu, in /opt ne consegue
-v /opt/temp/:/var/lib/mysql

Tutti i files di Mysql saranno salvati li
Per la password invece
-e MYSQL_ROOT_PASSWORD=my-secret-pw
Quindi uso l'opzione -è
-e  MYSQL_ROOT_PASSWORD=bwlab
Eh, naturalmente bwlab non E' la mia password

Per l'indirizzo ad hoc uso l'opzione -p
 -p 127.0.0.1:80:5000
significa che la porta 80 di localhost, ossia la mia macchina, punta alla porta 5000 dell'immagine
Mysql usa la porta di default 3306 quindi:
-p 127.0.0.1:3306:3306
Attenzione a non avere altre istanze di Mysql attive perchè andrebbe in conflitto con la porta 3306

Build del comando

docker run -p 127.0.0.1:3306:3306 --name <nome di fantasia del container mysql> -v /opt/temp/:/var/lib/mysql - e MYSQL_ROOT_PASSWORD=bwlab -d mysql:latest

L'opzione -d mysql:latest dice a docker di utilizzare l'ultima versione
Nell'hub ci sono le versioni che sono utilizzabili
E' importate che l'opzione -p sia subito dopo run

Apache + PHP

per il web server devi rimboccarti le maniche e studiarti il Dockerfile
è necessario creare un web server ad hoc 
lo creerò su Ubuntu 15.04
l'immagine avrà il necessario per lavorare
ecco il Docker file per creare un web server php

FROM ubuntu:15.04

RUN apt-get update

RUN apt-get install nano

RUN apt-get install -y \
    ca-certificates curl libpcre3 librecode0 libsqlite3-0 libxml2 \
    curl wget \
    --no-install-recommends

RUN apt-get install -y \
    apache2 \
    --no-install-recommends

RUN apt-get install -y \
    php5 php5-dev php5-mcrypt php5-json php5-mysql php5-mongo php5-xdebug \
    php5-curl php5-gd php5-intl php5-imap php5-xsl \
    --no-install-recommends

EXPOSE 80

la macchina che creo effettua solo l'installazione dell'editor a terminale mio preferito, nano, poi il web server apache e infine le estensioni necessarie per php e xdebug

creata l'immagine, docker build -t <nome immagine>:<tag> .   ,è necessario fare un paio di modifiche relative al php.ini
  1. impostare la date.timezone
  2. impostare i parametri di configurazione di xdebug
per impostarli avviamo l'immagine momentaneamente
docker run -t -i -p 8080:80  <nome immagine>:<tag> /bin/bash
in questo modo avremo la shell e quindi via a modificare: nano /etc/....
prima di uscire con exit da un altro terminale fai il commit delle modifiche:
  1. recuperi l'id container
  2. poi  docker commit <id container> <nome immagine>:<tag> e qui potresti dare una release superiore
a questo punto l'immagine e pronta e basta collegarla alla root di progetto
docker run -p 8080:80 --name <nome container>  -v <root di progetto symfony>:/var/www/html -d <nome immagine>:<tag>

Mysql e Server

ora che sono dentro il container del server web installo mysql-client senza fare commit aggiuntive, non mi interessa avere il client installato perchè il web serer deve essere leggero

provo a connettermi al db
mysql -h localhost -u root - p ....
non funziona!
certo, il container del db è esterno a quello del server web. avrei potuto installarli assieme ma preferisco avere delle istanze diverse per fare prove con release diverse
comunque docker permette di collegare due container tramite l'opzione link
quindi rieseguo l'avvio del container precedente con l'opzione link e il nome del container mysql precedentemente creato
docker run -p 8080:80 --name <nome container>  --link <nome di fantasia del container mysql> -v <root di progetto symfony>:/var/www/html -d <nome immagine>:<tag>


ora di nuovo a testare il link al db: mysql -h localhost -u root - p ....

Non funziona. Perchè? La documentazione ufficiale parla chiaro:
Docker creates several environment variables when you link containers. [grazie Andrea Tosatto]
Ok, allora basta digitare env nel container del server web
<nome mysql container>_PORT_3306_TCP_ADDR=172.17.0.2
<nome mysql container>_ENV_MYSQL_VERSION=5.6.26
<nome mysql container>_PORT_3306_TCP=tcp://172.17.0.2:3306
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/
<nome mysql container>_ENV_MYSQL_MAJOR=5.6
<nome mysql container>_ENV_MYSQL_ROOT_PASSWORD=xxxx
<nome mysql container>_PORT=tcp://172.17.0.2:3306
SHLVL=1
HOME=/root
<nome mysql container>_PORT_3306_TCP_PORT=3306
<nome mysql container>_PORT_3306_TCP_PROTO=tcp
_=/usr/bin/env

Quindi l'ip creato da docker durante il link è 172.17.0.2 ergo mysql -h 172.17.0.2 -u root - pxxxx --> FUNZIONAAAAA!


quindi la mia applicazione web per il db dovrà puntare a 172.17.0.2
le variabili env possono essere recuperate in fase di run del container, come da documentazione
 docker run --rm --name web2 --link db:db training/webapp env
    . . .
    DB_NAME=/web2/db
    DB_PORT=tcp://172.17.0.5:5432
    DB_PORT_5432_TCP=tcp://172.17.0.5:5432
    DB_PORT_5432_TCP_PROTO=tcp
    DB_PORT_5432_TCP_PORT=5432
    DB_PORT_5432_TCP_ADDR=172.17.0.5


ma possono anche essere impostate come opzione in fase di run:
  • the -e--env and --env-file options on the docker runcommand when the source container is started
oppure recuperate con
 docker exec training/webapp env

comunque in base alla documentazione docker aggiorna il file /etc/hosts con il gli indirizzi ip dei container linkati:
   <indirizzo ip>     <nome container>

quindi il modo più semplice per usare il db è quello di usare il nome del container mysql <nome di fantasia del container mysql>

Dulcis In Fundo...

Un po' arzigogolata la spiegazione ma capito il meccanismo è molto veloce da gestire.

Commenti

Post popolari in questo blog

install language on osTicket

this simple guide aims you to install and configure your language on osTicket i written this guide based on forum post http://osticket.com/forum/discussion/76252/installing-language-pack

Ubuntu: La propria installazione di python è danneggiata. Correggere il collegamento simbolico «/usr/bin/python».

Questa è un problema, soprattutto se si vuole aggiornare la distribuzione.+ Dì la verità: hai pacioccato con le versioni di python vero? Volevi usare la 3.5 e non 2.7 e così hai aggiunto alternatives o manipolato il symlink. No? io si. Così in fase di aggiornamento mi sono bloccato. Allora per risolverlo ecco la soluzione: elimina tuttle le eventuali alternative : sudo update-alternatives –remove-all python crea il symlink alla 2.7 sudo ln -s /usr/bin/python3.5 /usr/bin/python aggiorna i permessi: sudo chmod 7777 /usr/bin/python Ora funziona tutto. La soluzione l’ho scovata qui: https://askubuntu.com/questions/448926/do-release-upgrade-python-install-is-corrupted