{"id":966,"date":"2019-06-24T22:27:58","date_gmt":"2019-06-24T20:27:58","guid":{"rendered":"http:\/\/blogperso.union31.fr\/?p=966"},"modified":"2021-04-10T08:56:41","modified_gmt":"2021-04-10T06:56:41","slug":"docker-mon-espace-de-dev","status":"publish","type":"post","link":"https:\/\/blogperso.union31.fr\/?p=966","title":{"rendered":"Docker : Mon espace de dev"},"content":{"rendered":"\n<p>L&rsquo;espace de d\u00e9veloppement doit me permettre de faire :<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>de travailler \u00e0 partir d&rsquo;un environnement Linux  avec lequel on disposera  :<ul><li>sous un serveur apache<ul><li>avec du PHP (en plusieurs version)<\/li><\/ul><\/li><li>du mysql<\/li><li>d&rsquo;un serveur de mail pour le d\u00e9veloppement<\/li><\/ul><\/li><\/ul>\n\n\n\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_82_2 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Sommaire<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/blogperso.union31.fr\/?p=966\/#I_Mysql\" >I Mysql<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/blogperso.union31.fr\/?p=966\/#I1_Introduction\" >I.1 Introduction<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/blogperso.union31.fr\/?p=966\/#I2_Dockerfile\" >I.2 Dockerfile<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/blogperso.union31.fr\/?p=966\/#I2_docker-compose\" >I.2 docker-compose<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/blogperso.union31.fr\/?p=966\/#II_Php-Apache\" >II Php-Apache<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/blogperso.union31.fr\/?p=966\/#II1_Introduction\" >II.1 Introduction<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/blogperso.union31.fr\/?p=966\/#II2_Dockerfile\" >II.2 Dockerfile<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/blogperso.union31.fr\/?p=966\/#III3_docker-composeyml\" >III.3 docker-compose.yml<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/blogperso.union31.fr\/?p=966\/#III4_Pour_aller_plus_loin\" >III.4 Pour aller plus loin<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"I_Mysql\"><\/span>I Mysql<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"I1_Introduction\"><\/span>I.1 Introduction<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>L&rsquo;id\u00e9e initiale est de pouvoir disposer d&rsquo;un container contenant mysql (quelque soit la version) est de pouvoir b\u00e9n\u00e9ficier d&rsquo;une base de donn\u00e9es comportant des donn\u00e9es import\u00e9es. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"I2_Dockerfile\"><\/span>I.2 Dockerfile<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Apr\u00e8s avoir tourner en rond (sans regarder la doc officielle \ud83d\ude42 ) il se trouve qu&rsquo;il n&rsquo;est pas possible \u00e0 partir de l&rsquo;image Mysql officielle de cr\u00e9er des bases de donn\u00e9es et d&rsquo;importer une base de donn\u00e9es en le sp\u00e9cificiant dans un fichier Dockerfile propre \u00e0 soi. En revanche, il est possible :<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>de cr\u00e9er une base de donn\u00e9es via les variables d\u2019environnement dans le fichier docker-compose.yml<\/li><li>d&rsquo;int\u00e9grer une ou plusieurs bases de donn\u00e9es en pla\u00e7ant les fichiers sql dans le r\u00e9pertoire \u00ab\u00a0<strong>\/docker-entrypoint-initdb.d<\/strong>\u00a0\u00bb de l&rsquo;image. A l\u2019initialisation du container, les fichiers seront lus par ordre alphab\u00e9tique.<\/li><\/ul>\n\n\n\n<p>Donc pour l&rsquo;exemple il a \u00e9t\u00e9 d\u00e9cid\u00e9 :<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>de cr\u00e9er la base de donn\u00e9es via docker-compose,<\/li><li>d&rsquo;int\u00e9grer les donn\u00e9es sql dans le r\u00e9pertoire sp\u00e9cifique.<\/li><\/ul>\n\n\n\n<p>Exemple du fichier docker file :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>##################################\n#  MYSQL (derni\u00e8re version)\n#    \n#  notes :\n#   si on utilise l'image fournit par Mysql : \n#    - pas de possibilit\u00e9 de cr\u00e9er une base de donn\u00e9es et\/ou d'importer des donn\u00e9es dans une base de donn\u00e9es\n#        --&gt; il faut passer par les variables d'environements du docker-compose\n#        --&gt; placer les fichiers sql dans \/docker-entrypoint-initdb.d\n#             --&gt; \u00e0 l'initialisation tous fichiers sera pris et execut\u00e9 dans l'ordre alphab\u00e9tique\n\n# A partir de quelle source\nFROM mysql\n\n# qui maintien ?\nMAINTAINER union31xh union31xh@gmail.com\n\n# copie export donn\u00e9es de la base de donn\u00e9es (le fichier sql ne cr\u00e9e par la database)\nADD .\/export.sql \/tmp\n\n# cr\u00e9ation fichier .my.cnf pour \u00e9viter de saisir le mot de passe en interactif \nADD .my.cnf \/root\nRUN chmod 0600 \/root\/.my.cnf\n\n# place les fichiers sql \u00e0 int\u00e9grer lors de la premi\u00e8re initialisation de l'image\nADD .\/export.sql \/docker-entrypoint-initdb.d\n\nEXPOSE 3306 33060\n\nCMD &#91;\"mysqld\"]\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"I2_docker-compose\"><\/span>I.2 docker-compose<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>C&rsquo;est donc dans cette partie que la base de donn\u00e9es sera cr\u00e9\u00e9e en sp\u00e9cifiant le nom de la base de donn\u00e9es dans une variable d&rsquo;environnement d\u00e9di\u00e9e.<\/p>\n\n\n\n<p>Pour l&rsquo;image, il est fait r\u00e9f\u00e9rence au docker-file personnalis\u00e9. Pour le port d\u2019acc\u00e9der \u00e0 MySQL, il est d\u00e9clar\u00e9 mais ce n&rsquo;est pas la peine en soit &#8230; (A enlever \u00e0 terme).<\/p>\n\n\n\n<p>Pour le reste rien de particulier :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>version: '3.7'\nservices:\n\n\n        #######################################################\n        # mysql\n\n        mysql :\n                build :\n                        context : .\/dockerfiles\/mysql\n                        dockerfile : Dockerfile\n                container_name : mysql\n                networks :\n                        - reseau1\n                environment:\n                        - MYSQL_ROOT_PASSWORD=example\n                        - <strong><span class=\"has-inline-color has-vivid-purple-color\">MYSQL_DATABASE=open_food<\/span><\/strong>\n                ports:\n                        - \"3307:3306\"\n\n\nnetworks:\n        reseau1 :\n                external : true\n\n\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"II_Php-Apache\"><\/span>II Php-Apache<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"II1_Introduction\"><\/span>II.1 Introduction<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Apr\u00e8s avoir lu la doc d&rsquo;Apache sur le site <a rel=\"noreferrer noopener\" href=\"https:\/\/hub.docker.com\/_\/php\" target=\"_blank\">dockerhub<\/a> il a \u00e9t\u00e9 d\u00e9cid\u00e9 dans un premier temps de partir d&rsquo;une image contenant Apache et PHP.<\/p>\n\n\n\n<p>Le process apache sera lanc\u00e9 et l&rsquo;image contiendra la version de php 8.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"II2_Dockerfile\"><\/span>II.2 Dockerfile<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Un dockerfile a \u00e9t\u00e9 fait pour :<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>mettre une clef priv\u00e9e et un certificat auto-sign\u00e9 ;<\/li><li>placer 2 fichiers conf d&rsquo;Apache (port 80 et 443) ;<\/li><li>l&rsquo;activation du module ssl dans Apache;<\/li><li>l&rsquo;installation du module msqli.<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>##################################\n#  Image dev pour php 8.0.3\n\n# A partir de quelle source\nFROM php:8.0.3-apache\n\n\n# qui maintien ?\nMAINTAINER union31xh union31xh@gmail.com\n\n# copie la clef privee et le certificat\nCOPY .\/server.crt \/etc\/ssl\/certs\/\nCOPY .\/server.key \/etc\/ssl\/private\/\n\n# copie le 000-default.conf : attention redirige le port 80 vers le port 4443 (A mapper avec le docker-compose.yml) \nCOPY .\/000-default.conf \/etc\/apache2\/sites-available\/000-default.conf\n# copie default-ssl.conf \nCOPY .\/default-ssl.conf \/etc\/apache2\/sites-available\/default-ssl.conf\n\n# active la conf ssl\nRUN ln -s \/etc\/apache2\/sites-available\/default-ssl.conf \/etc\/apache2\/sites-enabled\/default-ssl.conf\n\n# active le module SSL dans Apache\nRUN a2enmod ssl\n\n# install divers outils pour travailler dans le container si besoin \nRUN apt update\nRUN apt install -y vim\nRUN apt install -y tree\n\n# ajoute extension mysqli qui n'est pas pr\u00e9sente par defaut\nRUN docker-php-ext-install mysqli\n\n# lance apache\nCMD &#91;\"apache2-foreground\"]\n\n# Expose les ports du serveur Apache\nEXPOSE 80\nEXPOSE 443\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"III3_docker-composeyml\"><\/span>III.3 docker-compose.yml<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Mappage du r\u00e9pertoire www sur le disque dur local qui contient les sites php<\/p>\n\n\n\n<p>Sinon rien de particulier :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>        #####################################################\n        #  apache\/php 8 pour debug avant migration site prod\n        apache_php8:\n                #                image : union31xh\/php_8_0_3_apache\n                build :\n                        context : .\/dockerfiles\/php.8.0.3.apache\/\n                        dockerfile : Dockerfile\n                container_name : apache_php_8.0.3\n                ports :\n                        - \"8080:80\"\n                        - \"4443:443\"\n                volumes:\n                        - \/media\/donnees\/Dev\/apache\/www:\/var\/www\/html\n                environment:\n                        - APP_ENV=development\n                        - APP_DEBUG=true\n                networks :\n                        - reseau1\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"III4_Pour_aller_plus_loin\"><\/span>III.4 Pour aller plus loin<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Il faut s\u00e9parer la liaison apache et php via 2 containers distincts. Ainsi, pour une m\u00eame version d&rsquo;apache il sera possible d&rsquo;avoir plusieurs version de PHP et ce sera plus rapide pour swicther avec les containers &#8230;<\/p>\n\n\n\n<p>A \u00e9tudier \u00e9galement l&rsquo;id\u00e9e, suivant le port d&rsquo;attaque, d&rsquo;avoir une ex\u00e9cution avec  une version de PHP bien pr\u00e9cise. Ce qui pour les tests seraient vraiment pas mal pour les changements de portage&#8230;<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>L&rsquo;espace de d\u00e9veloppement doit me permettre de faire : de travailler \u00e0 partir d&rsquo;un environnement Linux avec lequel on disposera : sous un serveur apache avec du PHP (en plusieurs version) du mysql d&rsquo;un serveur de mail pour le d\u00e9veloppement<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-966","post","type-post","status-publish","format-standard","hentry","category-_dev"],"_links":{"self":[{"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=\/wp\/v2\/posts\/966","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=966"}],"version-history":[{"count":15,"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=\/wp\/v2\/posts\/966\/revisions"}],"predecessor-version":[{"id":2389,"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=\/wp\/v2\/posts\/966\/revisions\/2389"}],"wp:attachment":[{"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=966"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=966"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=966"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}