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