Pour ce tutoriel, on devra disposer d'une application Symfony 3.4 hébergée sur un dépôt git. Cette dernière aura pour environnement système et applicatif :
- - Linux Debian 9
- - PostgreSQL 9
- - PHP 7.4
- - Apache 2.4
Le poste de développement est sur macOS 10.15 .
Installer Docker Desktop : https://www.docker.com/products/docker-desktop
1 - Création de l'image de base Linux Debian 9
Sur notre poste de travail, on va créer le fichier Dockerfile dans un dossier :
mkdir deb9-lapp74
cd deb9-lapp74
nano Dockerfile
Dans le fichier Dockerfile, on ajoute la directive suivante pour obtenir un conteneur avec une base de Linux Debian 9.
FROM debian:9
On va créer un conteneur à partir d'une image à partir de l'image générée par le Dockerfile :
docker build -t deb9/lapp74 .
On va pouvoir maintenant démarrer notre conteneur :
docker run -ti deb9/lapp74 /bin/bash
Installation de nano et openssh :
apt-get update && apt-get upgrade
apt-get install nano ssh
Configuration du fuseau horaire :
dpkg-reconfigure tzdata
Autorisation de connexion du root par ssh :
nano /etc/ssh/sshd_config
PermitRootLogin yes
Démarrer sshd :
service ssh restart
Note : ssh ne démarre pas automatiquement par défaut.
2 - Installation d'Ansible et git
Installation d'Ansible et git:
apt-get install ansible sshpass git
Attribution d’un mot de passe à l'utilisateur root :
passwd root
Génération d’une paire de clés rsa pour l'utilisateur root :
ssh-keygen -t rsa
cat /root/.ssh/id_rsa.pub
Si vous disposer d'un dépôt Gitlab : récupérer la clé ssh publique pour autoriser à télécharger le projet gitlab.
On part du principe que le dossier de configuration Ansible se trouve à la racine de l'application Symfony dans un dossier "ansible/prod" :
Le playbook d'installation Ansible va installer la pile logicielle nécessaire au fonctionnement de Symfony 3.4 :
- Apache 2.4
- PHP 7.4
- PostgreSQL 9
- Git
- Utilitaires : curl, zip, acl, htop, zip
Il va aussi configurer le php.ini et créer le vhost pour notre application.
Contenu du dossier Ansible :
- ansible.cfg
- hosts
- playbook-lapp74.yml
- virtualhost.conf
Contenu du fichier ansible.cfg :
[defaults]
hostfile = ./hosts
host_key_checking = False
Contenu du fichier hosts
[127.0.0.1]
127.0.0.1 ansible_ssh_host=127.0.0.1 ansible_ssh_user=root ansible_ssh_pass=CONTAINER_USER_ROOT_PWD host_key_checking=false
Contenu du fichier playbook-lapp74.yml :
---
- hosts: all
sudo: true
vars:
domain: application-sf.local
admin: contact@application-sf.local
directory: application-sf/web
handlers:
- name: restart apache2
service: name=apache2 state=restarted
- name: restart postgresql
service: name=postgresql state=restarted
- name: restart rsync
service: name=rsync state=restarted
tasks:
- name: Mise à jour de l'apt cache
apt: update_cache=yes
- name: installer aptitude
apt: name=aptitude state=present
- name: Mise à jour système
apt: upgrade=full
- name: installer acl
apt: name=acl state=present
- name: installer curl
apt: name=curl state=present
- name: installer htop
apt: name=htop state=present
- name: installer zip
apt: name=zip state=present
- name: installer unzip
apt: name=unzip state=present
- name: installer git
apt: name=git state=present
- name: installer apache2
apt: name=apache2 state=present
- name: installer apache2-doc
apt: name=apache2-doc state=present
- name: installer apache2-utils
apt: name=apache2-utils state=present
- name: installer libexpat1
apt: name=libexpat1 state=present
- name: installer libxrender1
apt: name=libxrender1 state=present
- name: installer libfontconfig
apt: name=libfontconfig state=present
- name: installer ssl-cert
apt: name=ssl-cert state=present
- name: a2disconf apache2-doc
command: a2disconf apache2-doc
notify:
- restart apache2
- name: create vhost
template: src=virtualhost.conf dest=/etc/apache2/sites-available/{{ domain }}.conf
- name: a2ensite
command: a2ensite {{ domain }}.conf
args:
creates: /etc/apache2/site-enabled/{{ domain }}.conf
notify:
- restart apache2
- name: activation mod-rewrite
apache2_module: name=rewrite state=present
notify:
- restart apache2
- name: activation mod-headers
apache2_module: name=headers state=present
notify:
- restart apache2
- name: activation mod-headers
apache2_module: name=headers state=present
notify:
- restart apache2
- name: installer ca-certificates
apt: name=ca-certificates state=present
- name: installer lsb-release
apt: name=lsb-release state=present
- name: installer apt-transport-https
apt: name=apt-transport-https state=present
- name: Add an Apt signing key, uses whichever key is at the URL
apt_key:
url: https://packages.sury.org/php/apt.gpg
state: present
validate_certs: no
- apt_repository:
repo: deb https://packages.sury.org/php/ stretch main
state: present
- name: Mise à jour de l'apt cache
apt: update_cache=yes
# PHP 7.4
- name: installer php7.4
apt: name=php7.4 state=present
- name: installer php7.4-common
apt: name=php7.4-common state=present
- name: php7.4-cli
apt: name=php7.4-cli state=present
- name: php7.4-dom
apt: name=php7.4-dom state=present
- name: php7.4-xmlrpc
apt: name=php7.4-xmlrpc state=present
- name: php7.4-mbstring
apt: name=php7.4-mbstring state=present
- name: php7.4-intl
apt: name=php7.4-intl state=present
- name: php7.4-pgsql
apt: name=php7.4-pgsql state=present
- name: installer php7.4-curl
apt: name=php7.4-curl state=present
- name: installer php7.4-zip
apt: name=php7.4-zip state=present
- name: Modify date.time zone php.ini apache
replace:
dest=/etc/php/7.4/apache2/php.ini
regexp=';date.timezone ='
replace='date.time = Europe/Paris'
backup=yes
- name: Modify date.time zone php.ini cli
replace:
dest=/etc/php/7.4/cli/php.ini
regexp=';date.timezone ='
replace='date.time = Europe/Paris'
backup=yes
- name: Modify memory limit php.ini apache
replace:
dest=/etc/php/7.4/apache2/php.ini
regexp='memory_limit = 128M'
replace='memory_limit = 256M'
backup=yes
- name: Modify max execution time php.ini apache
replace:
dest=/etc/php/7.4/apache2/php.ini
regexp='max_execution_time = 30'
replace='max_execution_time = 360'
backup=yes
- name: Modify max upload file php.ini apache
replace:
dest=/etc/php/7.4/apache2/php.ini
regexp='upload_max_filesize = 2M'
replace='upload_max_filesize = 20M'
backup=yes
- name: Modify max execution time php.ini cli
replace:
dest=/etc/php/7.4/cli/php.ini
regexp='max_execution_time = 30'
replace='max_execution_time = 360'
backup=yes
- name: Modify max upload file php.ini cli
replace:
dest=/etc/php/7.4/cli/php.ini
regexp='upload_max_filesize = 2M'
replace='upload_max_filesize = 20M'
backup=yes
# PostgreSQL 9.x
- name: installer postgresql
apt: name=postgresql state=present
- name: installer postgresql-contrib-9*
apt: name=postgresql-contrib-9* state=present
- name: installer postgresql utils
apt:
name: "{{item}}"
state: present
with_items:
- postgresql-plperl
- postgresql-plpython
- postgresql-pltcl
- python-psycopg2
- name: Start PostgreSQL and enable at boot
service:
name=postgresql
enabled=yes
state=started
Contenu du fichier virtualhost.conf :
<VirtualHost *:80>
ServerName {{ domain }}
ServerAdmin {{ admin }}
DocumentRoot /var/www/{{ directory }}
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
<Directory /var/www/{{ directory }}/>
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
</VirtualHost>
3 - Déploiement des sources de l'application avec git
Cloner le projet dans le dossier de l'utilisateur root :
cd /root
git clone ssh://git@gitlab.domain.tld:/user/application-sf
4 - Installations des paquets applicatifs avec Ansible
Ajouter le mot de passe root dans le paramètre "ansible_ssh_pass" :
cd application-sf/ansible/prod/
nano hosts
Exécution le playbook Ansible :
ansible-playbook playbook-lapp74.yml
Déplacer le projet dans le dossier public d’Apache :
cd /root
mv application-sf /var/www
5 - Installation de l'application Symfony
Par défaut, le application Apache et PostgreSQL ne vont pas démarrer automatiquement.
Démarrer Apache et PostgreSQL :
service apache2 start
service postgresql start
Création de la base de donnée :
su postgres
createuser -d -P application-sf
createdb -O application-sf application-sf
Quitter le shell postgres :
ctrl + d
Installation de l’application Symfony :
cd /var/www/application-sf
curl -s https://getcomposer.org/installer | php
php composer.phar install
./clean.sh
6 - Sauvegarde et exécution du conteneur
Quitter le conteneur et le sauvegarder :
ctrl + d
Récupérer l'id du conteneur :
docker ps -a
Sauvegarde du conteneur :
docker commit ID_CONTAINER debian9/lapp74-application-sf
Le conteneur va être historisé lors de sa sauvegarde.
Exécution du conteneur :
Exécuter le conteneur avec le dossier public d'Apache partagé :
IMPORTANT : Si l'application est déployé dans le dossier partagé, ce dernier est vidé lors du démarrage du conteneur avec le point de montage.
docker run -ti -v ~/path/to/deb9-lapp74/www-data:/var/www -p 80:80 debian9/lapp74-application-sf /bin/bash
Le conteneur est exécuté avec un shell bash, une exposition du port 80 redirigé vers le port 80 de la machine hôte et un partage du dossier Apache avec cette dernière.
Exécuter le conteneur sans partage :
docker run -ti -p 80:80 debian9/lapp74-application-sf /bin/bash
Démarrer apache et postgresql :
service apache2 start
service postgresql start
Pour accéder à l'application depuis la machine hôte, créer une entrée dans le fichier hosts qui associe la FQDN de l'application au localhost de la machine hôte.
sudo nano /etc/hosts
127.0.0.1 application-sf.local
Connexion à l'application Symfony :
http://application-sf.local
7 - Publication d'une image du conteneur sur Docker Hub
Créer un compte sur Docker Hub [https://hub.docker.com], afin de pouvoir héberger l'image.
Une fois le compte crée, se connecter depuis le shell :
docker login
Tagger l'image :
docker tag debian9/lapp74-application-sf docker-user/debian9-lapp74-application-sf:v1
Upload de l'image sur le dépôt Docker Hub :
docker push docker-user/debian9-lapp74-application-sf:v1
8 - Déploiement du conteneur depuis l'image Docker Hub
Pull de l'image depuis le dépôt :
docker login
docker pull docker-user/debian9-lapp74-application-sf:v1
Suppression de l'image locale :
docker rmi docker-user/debian9-lapp74-application-sf:v1