Pour une meilleure compréhension du matériel suivant, il est recommandé de lire d'abord le
message précédentPrenons un exemple de développement d'un environnement local composé d'un tas de Nginx + PHP + MySql + phpMyAdmin. Ce bundle est très populaire et peut satisfaire un certain nombre de besoins standard d'un développeur ordinaire.
Comme dans le post précédent, l'accent sera déplacé vers l'utilitaire de composition docker que le docker dans sa forme la plus pure.
Alors allons-y!
Commençons par docker-compose.yml, qui se trouve dans un dossier proxy distinct:
docker-compose.yml pour nginx-proxyversion: '3.0' services: proxy: image: jwilder/nginx-proxy ports: - 80:80 volumes: - /var/run/docker.sock:/tmp/docker.sock:ro networks: - proxy networks: proxy: driver: bridge
Le fichier présenté décrit la configuration pour créer un conteneur avec le nom
proxy sur la base de l'
image: image jwilder / nginx-proxy et créer un réseau avec le même nom. La directive
réseaux indique à quels réseaux le conteneur est connecté, dans cet exemple, il s'agit de notre réseau proxy.
Lors de la création d'un réseau, la directive driver: bridge peut être omise. Un pilote de pont est le pilote par défaut. Ce conteneur communiquera sur le réseau avec d'autres conteneurs.
L'image jwilder / nginx-proxy est basique et prise, et le
Docker Hub fournit également une description assez complète et détaillée de son utilisation. Le principe de fonctionnement de nginx-proxy est assez simple: il accède aux informations sur l'exécution des conteneurs via un socket docker transféré, analyse la présence d'une variable d'environnement avec le nom VIRTUAL_HOST et redirige les demandes de l'hôte spécifié vers le conteneur pour lequel cette variable d'environnement est définie.
Nous démarrons le proxy avec la commande docker-compose up -d déjà connue, nous observons la sortie suivante:
Creating network "proxy_proxy" with driver "bridge" Creating proxy_proxy_1 ... done
Cette conclusion nous informe qu'au début, le réseau proxy_proxy a été créé, puis le conteneur proxy_proxy_1 a été créé. Le nom du réseau est obtenu à partir du nom du dossier dans lequel se trouvait le fichier docker-compose.yml, j'ai un proxy et le nom du réseau du même nom.
Si vous entrez la
commande docker network ls , nous verrons une liste des réseaux docker dans notre système et l'un d'eux devrait être proxy_proxy.
Le nom du conteneur est construit sur le même principe que le nom du dossier plus le nom et le numéro du service, ce qui permet aux conteneurs portant des noms similaires de ne pas être dupliqués.
En utilisant la directive
container_name , vous pouvez spécifier explicitement le nom du conteneur, mais je trouve que c'est une fonction plutôt inutile. Ceci sera discuté plus en détail dans les articles suivants.
Créez un deuxième docker-compose.yml avec le contenu suivant:
docker-compose.yml pour d'autres services version: '3.0' services: nginx: image: nginx environment: - VIRTUAL_HOST=site.local depends_on: - php volumes: - ./docker/nginx/conf.d/default.nginx:/etc/nginx/conf.d/default.conf - ./html/:/var/www/html/ networks: - frontend - backend php: build: context: ./docker/php volumes: - ./docker/php/php.ini:/usr/local/etc/php/php.ini - ./html/:/var/www/html/ networks: - backend mysql: image: mysql:5.7 volumes: - ./docker/mysql/data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: root networks: - backend phpmyadmin: image: phpmyadmin/phpmyadmin:latest environment: - VIRTUAL_HOST=phpmyadmin.local - PMA_HOST=mysql - PMA_USER=root - PMA_PASSWORD=root networks: - frontend - backend networks: frontend: external: name: proxy_proxy backend:
Qu'est-ce qui est annoncé ici?
Quatre services sont répertoriés: nginx, php, mysql et phpmyadmin. Et deux réseaux. Un réseau proxy, appelé frontend, est annoncé comme un réseau externe et un nouveau réseau backend interne. Le pilote n'est pas spécifié, comme je l'ai écrit plus tôt, le pilote par défaut du type de pont sera utilisé.
nginx
Tout devrait être clair ici. Nous utilisons l'image de base avec le hub docker. La variable d'environnement est nécessaire pour que le proxy fonctionne et lui indique à quelle adresse le conteneur doit être accessible. L'option depend_on indique la dépendance de ce conteneur sur le conteneur php. Cela signifie que le conteneur php sera lancé à l'avance, et après cela, le conteneur nginx qui en dépend sera lancé. Ensuite, nous transmettons la configuration de notre nginx. Il sera un peu plus bas et montera le dossier en html. Nous remarquons également que le conteneur a accès à deux réseaux à la fois. Il doit communiquer à la fois les proxys du réseau frontal et le php du réseau principal. En principe, il serait possible de pousser tous les conteneurs dans le même réseau frontal, mais je reconnais qu'une telle séparation est plus correcte.
default.nginx server { listen 80; server_name_in_redirect off; access_log /var/log/nginx/host.access.log main; root /var/www/html/; location / { try_files $uri /index.php$is_args$args; } location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass php:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } location ~ /\.ht { deny all; } }
default.nginx est une configuration pour nginx qui est transmise au conteneur. Le point clé ici est la directive
php fastcgi_pass: 9000 . Il définit l'adresse du serveur FastCGI. L'adresse peut être spécifiée en tant que nom de domaine ou adresse IP et port.
php: 9000 - le nom du service est l'adresse du serveur FastCGI. Nginx accédant à php recevra l'adresse IP du conteneur dans lequel php s'exécute. Le port 9000 est un port standard, il est déclaré lors de la création du conteneur de base. Ce port est disponible pour nginx sur le réseau, mais n'est pas disponible sur la machine hôte, car il n'a pas été transféré.
php
Il est inhabituel qu'une image ne soit pas indiquée. Au lieu de cela, il crée sa propre image directement à partir du fichier de composition. La directive context indique le dossier dans lequel se trouve le Dockerfile.
Dockerfile FROM php:7.3.2-fpm RUN apt-get update && apt-get install -y \ libzip-dev \ zip \ && docker-php-ext-configure zip --with-libzip \ && docker-php-ext-install zip \ && docker-php-ext-install mysqli COPY --from=composer:latest /usr/bin/composer /usr/bin/composer WORKDIR /var/www/html
Le Dockerfile indique que la construction utilise l'image php de base: 7.3.2-fpm, puis les commandes d'installation des extensions php sont exécutées. Ensuite, composer est copié à partir d'une autre image de base et le répertoire de travail du projet est défini. J'examinerai les problèmes d'assemblage plus en détail dans d'autres articles.
De plus, le fichier php.ini et le dossier html avec notre projet sont jetés à l'intérieur du conteneur.
Notez que php est situé sur le réseau principal et, par exemple, le proxy ne peut plus y accéder.
mysql
L'image mysql de base est prise avec la balise 5.7, qui est responsable de la version mysql. Le dossier ./docker/mysql/data est utilisé pour stocker les fichiers de base de données (vous n'avez même pas besoin de le créer, il est créé au démarrage). Et grâce aux variables d'environnement, le mot de passe est défini pour l'utilisateur root, également root.
La base de données est située sur le réseau backend, ce qui lui permet de rester en contact avec php. L'image de base utilise le port standard 3306. Elle est disponible sur le réseau docker pour php, mais n'est pas disponible sur la machine hôte. Si vous transférez pour ce port, vous pouvez vous y connecter, par exemple, à partir du même PHPSTORM. Mais si l'interface phpmyadmin vous suffit, vous ne pouvez pas le faire.
phpmyadmin
L'image officielle de phpmyadmin. Les variables d'environnement utilisent VIRTUAL_HOST pour interagir avec le proxy, similaire à nginx. Accès PMA_USER et PMA_PASSWORD à la base de données. Et PMA_HOST la base de données hôte elle-même. Mais ce n'est pas localhost, comme c'est généralement le cas, mais mysql. C'est-à -dire la communication avec la base de données est disponible par le nom de son service, c'est-à -dire mysql. Le conteneur phpmyadmin peut communiquer avec la base de données, car il dispose d'une connexion au réseau frontal.
Nous démarrons les services avec la commande habituelle: docker-compose -d.
Nous voyons la sortie suivante:
Lancement du service Creating network "lesson2_backend" with the default driver Building php Step 1/4 : FROM php:7.3.2-fpm ---> 9343626a0f09 Step 2/4 : RUN apt-get update && apt-get install -y libzip-dev zip && docker-php-ext-configure zip --with-libzip && docker-php-ext-install zip && docker-php-ext-install mysqli ---> Using cache ---> 5e4687b5381f Step 3/4 : COPY --from=composer:latest /usr/bin/composer /usr/bin/composer ---> Using cache ---> 81b9c665be08 Step 4/4 : WORKDIR /var/www/html ---> Using cache ---> 3fe8397e92e6 Successfully built 3fe8397e92e6 Successfully tagged lesson2_php:latest Pulling mysql (mysql:5.7)... 5.7: Pulling from library/mysql fc7181108d40: Already exists 787a24c80112: Already exists a08cb039d3cd: Already exists 4f7d35eb5394: Already exists 5aa21f895d95: Already exists a742e211b7a2: Already exists 0163805ad937: Already exists 62d0ebcbfc71: Pull complete 559856d01c93: Pull complete c849d5f46e83: Pull complete f114c210789a: Pull complete Digest: sha256:c3594c6528b31c6222ba426d836600abd45f554d078ef661d3c882604c70ad0a Status: Downloaded newer image for mysql:5.7 Creating lesson2_php_1 ... done Creating lesson2_mysql_1 ... done Creating lesson2_phpmyadmin_1 ... done Creating lesson2_nginx_1 ... done
Nous voyons qu'au début le réseau de leçon2_backend est créé, puis l'image php est assemblée, puis des images qui ne sont pas déjà dans le système (pull) peuvent être téléchargées et les services décrits sont réellement lancés.
La touche finale, pour que tout fonctionne, cet ajout aux domaines hosts ou sites.local et phpmyadmin.local.
Le contenu de index.php peut ĂŞtre le suivant:
Ici, nous vérifions que la connexion de l'extension php - mysqli, qui a été ajoutée lors de l'assemblage du Dockerfile, est correcte.
Et notez que pour la connexion avec le conteneur, le nom du service est utilisé - mysql.
La structure de l'ensemble du projet était la suivante:
Structure du projet habr/lesson2$ tree . ├── docker │ ├── mysql │ │ └── data │ ├── nginx │ │ └── conf.d │ │ └── default.nginx │ └── php │ ├── Dockerfile │ └── php.ini ├── docker-compose.yml ├── html │ └── index.php └── proxy └── docker-compose.yml