Installation application Symfony 2 et environnement LAMP via VirtualBox, Vagrant et Docker sur Mac OSX 10.9 Mavericks

Mise en place d'un environnement de développement Symonfy 2 LAMP sur Mac OS X 10.9 avec Vagrant, VirtualBox et Docker. Cet environnement pourra ensuite être exporté vers une autre infrastructure (voir le tutorial suivant).

Publié le 12/02/2015

Pour commencer nous allons installer VirtualBox et Vagrant en allant les downloader sur les sites suivants :

Virtual Box Vagrant

1 - Installation la VM Core OS avec Vagrant

A un endroit de notre disque on va créer un dossier ou l'on va stocker le fichier de configuration de la VM que l'on va monter. Et on va créer le fichier de configuration comme suit :


cd mkdir /Users/gerard/Documents/CoreOSDocker
nano /Users/gerard/Documents/CoreOSDocker/Vagrantfile


# -*- mode: ruby -*-
# # vi: set ft=ruby :

require 'fileutils'

Vagrant.require_version ">= 1.6.0"

CLOUD_CONFIG_PATH = File.join(File.dirname(__FILE__), "user-data")
CONFIG = File.join(File.dirname(__FILE__), "config.rb")

# Defaults for config options defined in CONFIG
$num_instances = 1
$update_channel = "alpha"
$enable_serial_logging = false
$vb_gui = false
$vb_memory = 1024
$vb_cpus = 1

# Attempt to apply the deprecated environment variable NUM_INSTANCES to
# $num_instances while allowing config.rb to override it
if ENV["NUM_INSTANCES"].to_i > 0 && ENV["NUM_INSTANCES"]
  $num_instances = ENV["NUM_INSTANCES"].to_i
end

if File.exist?(CONFIG)
  require CONFIG
end

Vagrant.configure("2") do |config|
  config.vm.box = "coreos-%s" % $update_channel
  config.vm.box_version = ">= 308.0.1"
  config.vm.box_url = "http://%s.release.core-os.net/amd64-usr/current/coreos_production_vagrant.json" % $update_channel

  config.vm.provider :vmware_fusion do |vb, override|
    override.vm.box_url = "http://%s.release.core-os.net/amd64-usr/current/coreos_production_vagrant_vmware_fusion.json" % $update_channel
  end

  config.vm.provider :virtualbox do |v|
    # On VirtualBox, we don't have guest additions or a functional vboxsf
    # in CoreOS, so tell Vagrant that so it can be smarter.
    v.check_guest_additions = false
    v.functional_vboxsf     = false
  end

  # plugin conflict
  if Vagrant.has_plugin?("vagrant-vbguest") then
    config.vbguest.auto_update = false
  end

  (1..$num_instances).each do |i|
    config.vm.define vm_name = "core-%02d" % i do |config|
      config.vm.hostname = vm_name

      if $enable_serial_logging
        logdir = File.join(File.dirname(__FILE__), "log")
        FileUtils.mkdir_p(logdir)

        serialFile = File.join(logdir, "%s-serial.txt" % vm_name)
        FileUtils.touch(serialFile)

        config.vm.provider :vmware_fusion do |v, override|
          v.vmx["serial0.present"] = "TRUE"
          v.vmx["serial0.fileType"] = "file"
          v.vmx["serial0.fileName"] = serialFile
          v.vmx["serial0.tryNoRxLoss"] = "FALSE"
        end

        config.vm.provider :virtualbox do |vb, override|
          vb.customize ["modifyvm", :id, "--uart1", "0x3F8", "4"]
          vb.customize ["modifyvm", :id, "--uartmode1", serialFile]
        end
      end

      if $expose_docker_tcp
        config.vm.network "forwarded_port", guest: 2375, host: ($expose_docker_tcp + i - 1), auto_correct: true
      end

      config.vm.provider :vmware_fusion do |vb|
        vb.gui = $vb_gui
      end

      config.vm.provider :virtualbox do |vb|
        vb.gui = $vb_gui
        vb.memory = $vb_memory
        vb.cpus = $vb_cpus
      end

      ip = "172.17.8.101"
      config.vm.network :private_network, ip: ip
      config.vm.network :forwarded_port, guest: 80, host: 8080

      # Uncomment below to enable NFS for sharing the host machine into the coreos-vagrant VM.
      #config.vm.synced_folder ".", "/home/core/share", id: "core", :nfs => true, :mount_options => ['nolock,vers=3,udp']

      if File.exist?(CLOUD_CONFIG_PATH)
        config.vm.provision :file, :source => "#{CLOUD_CONFIG_PATH}", :destination => "/tmp/vagrantfile-user-data"
        config.vm.provision :shell, :inline => "mv /tmp/vagrantfile-user-data /var/lib/coreos-vagrant/", :privileged => true
      end

    end
  end
end


Installation et démarrage de la VM :

On doit se trouver dans le dossier CoreOSDocker.


cd /Users/gerard/Documents/CoreOSDocker
vagrant up

2 - Installation de Docker et mise en place d'un conteneur LAMP

Une fois la VM installé nous allons nous loguer dessus.

vagrant ssl

Notre VM Core OS contient déjà Docker.

On download la Debian à partir de laquelle notre conteneur va être constitué :

docker pull debian

On va créer un conteneur test sur une base cette Debian :

docker run --name="test" -t -i debian /bin/bash

On installe les éléments de base :


echo "$(cat /etc/apt/sources.list) universe multiverse" > /etc/apt/sources.list
apt-get update
apt-get install sudo nano curl wget ssh ntp nmap lynx

On quitte le conteneur et on commit nos modifications :

ctrl+d docker commit test custom/base

Création d'un conteneur LAMP à partir du conteneur base :

docker run --name="lamp" -t -i custom/base /bin/bash

Installation de LAMP :


apt-get install apache2 apache2-doc apache2-mpm-prefork apache2-utils libexpat1 ssl-cert libapache2-mod-php5 php5 php5-common php5-curl php5-dev php5-gd php5-idn php-pear php5-imagick php5-imap php5-json php5-mcrypt php5-memcache php5-mhash php5-mysql php5-ps php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl php-apc mysql-server git
a2enmod rewrite

Commit du conteneur LAMP en custom/lamp :

ctrl+d docker commit lamp custom/lamp

3 - Création du conteneur avec l'application Symfony 2 jobmanager/lamp

Création d'un conteneur LAMP à partir du conteneur custom/lamp :

docker run --name="jobmanager" -t -i custom/lamp /bin/bash

Installation de l'application Symfony 2 jobmanager :

Edition de la config Apache :


nano /etc/php5/apache2/php.ini
nano /etc/php5/cli/php.ini

Changer les valeurs suivantes :


short_open_tag = Off
date.timezone = Europe/Paris

Edition la config MySQL :

nano /etc/mysql/my.cnf

Ajouter dans la section fine tuning :


collation-server = utf8_general_ci
character-set-server = utf8



creation fichier host :

nano /etc/apache2/sites-available/jobmanager


	<VirtualHost *:80>
        ServerName job.docker.dev
        ServerAlias job.docker.dev
        ServerAdmin pa@foulquier.info

        DocumentRoot /var/www/jobmanager/web
        <Directory />
                Options FollowSymLinks
                AllowOverride All
        </Directory>
        <Directory /var/www/jobmanager/web/>
                DirectoryIndex app.php
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined


Clone app dans dossier www


cd /var/www/
git clone git@github.com:gerardchic/jobmanager.git

Installation composer et dépendances :


cd jobmanager
curl -s https://getcomposer.org/installer | php
php composer.phar install

Activation du vhost Apache :

a2ensite jobmanager

Réglage des permissions de l'application jobmanager :


cd ..
chmod -R 755 jobmanager
chmod -R 777 jobmanager/app/cache
chmod -R 777 jobmanager/app/logs

Création de la base de données :

service mysql start
mysql -u root -p
create database jobmanager;
exit

On créer un utilisateur :


useradd gerard
passwd gerard
mkdir /home/gerard
chown gerard /home/gerard
service ssh start

Copier la bdd depuis le repertoire partagé, c'est le même dossier qui contient votre fichier Vagrantfile. Placez y dedans un dump sql des données de votre application.

Copier ensuite dans le conteneur Docker depuis la VM Core OS, dans un nouveau shell OSX se connecter à la VM Core OS :

cd .../CoreOSDocker/ vagrant ssh

Récupérer l'id du conteneur pour pouvoir récupérer l'IP :

docker ps -a

On remplacera ${CID} par l'id de notre conteneur.

Récupérer l'ip de notre conteneur LAMP depuis la VM Core OS :

docker inspect --format '{{ .NetworkSettings.IPAddress }}' ${CID}

Copie de la base de donnée depuis la VM vers le conteneur :

scp share/jobmanager.sql gerard@10.1.0.4:/home/gerard/

Import de la bdd :

Depuis la console du conteneur :

mysql -u root -p jobmanager < /home/gerard/jobmanager.sql

On quitte le conteneur et on le commit :


ctrl+d
docker commit jobmanager jobmanager/lamp

4 - Execution du conteneur et forwarding de ports

docker run -t -i -p 80:80 -p 3306:3306 -p 21:21 -v /home/core/vagrant/project:/var/www/project jobmanager/lamp /bin/bash

Démarrage d'Apache et MySQL :

service mysql start service apache2 start

Le serveur Apache sera disponible à l'adresse http://172.17.8.101

On va créer une entrée dans le fichier host de Mac OS X :

sudo nano /etc/hosts

Ajouter le nom de votre app l'IP du conteneur jobmanager/lamp dans le fichier hosts :

172.17.8.101 job.docker.dev

Il manque l'installation de Postfix pour que l'application puisse envoyer des mails, se reporter au tutorial de configuration sur Postfix.

5 - Configuration de la synchronisation entre la VM et notre système dans PhpStorm

On va installer vsftp sur notre conteneur jobmanager/lamp, se reporter au tutorial d'installation de vsftp.

On va sélectionner Deployments > Configuration dans le menu Tools de PhpStorm et on va créer un profil de connection ftp avec les infos de config de notre serveur ftp que l'on vient de créer dans le conteneur. Puis on selection cette connection par défaut.

On va pouvoir activer la synchronisation en sélectionnant Deployments > Automatic upload.

A chaque fois qu'on fait pomme S, on synchronise les fichiers modifiés en local sur notre container job.docker.dev.

Source :

http://tonyhb.com/unsuck-your-vagrant-developing-in-one-vm-with-vagrant-and-docker https://docs.vagrantup.com