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
In Docker si chiamano volumi e si settano con l'opzione -v
Sull'hub dice:
Io ho una cartella temp, uso Ubuntu, in /opt ne consegue
Tutti i files di Mysql saranno salvati li
Per la password invece
Per l'indirizzo ad hoc uso l'opzione -p
Mysql usa la porta di default 3306 quindi:
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
docker exec training/webapp env
comunque in base alla documentazione docker aggiorna il file /etc/hosts con il gli indirizzi ip dei container linkati:
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-pwQuindi uso l'opzione -è
-e MYSQL_ROOT_PASSWORD=bwlabEh, naturalmente bwlab non E' la mia password
Per l'indirizzo ad hoc uso l'opzione -p
-p 127.0.0.1:80:5000significa 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:3306Attenzione 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
- impostare la date.timezone
- 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:
- recuperi l'id container
- 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
ora di nuovo a testare il link al db: mysql -h localhost -u root - p ....
Non funziona. Perchè? La documentazione ufficiale parla chiaro:
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:
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
Quindi l'ip creato da docker durante il link è 172.17.0.2 ergo mysql -h 172.17.0.2 -u root - pxxxx --> FUNZIONAAAAA!<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:3306PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binPWD=/<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:3306SHLVL=1HOME=/root<nome mysql container>_PORT_3306_TCP_PORT=3306<nome mysql container>_PORT_3306_TCP_PROTO=tcp_=/usr/bin/env
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:
oppure recuperate con
- the
-e
,--env
and--env-file
options on thedocker run
command when the source container is started
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
Posta un commento