Quand j'ai essayé de créer un environnement pour PHP7.4 + Apache + MySQL avec Docker, je suis resté bloqué [Windows & Mac]

"Introduction"

Cette fois, j'aimerais utiliser Docker pour créer un environnement de développement ** Laravel + Apache + MySQL **. Le développement individuel étant effectué par une équipe comprenant des programmeurs débutants, la politique est d'adopter des méthodes et des procédures d'installation simples et visuellement faciles à comprendre.

"Introduction de Docker"

Introduisons immédiatement Docker, qui est le sujet principal.

Est-ce qu'Hyper-v est activé (Windows uniquement)

Vous devez activer une fonctionnalité de virtualisation appelée Hyper-v avant d'installer Docker. Cette fonction semble être installée uniquement dans la série Windows Pro, et dans d'autres cas, il est nécessaire d'installer d'autres technologies de virtualisation telles que VirtualBox.

** ① Entrez "Activer ou désactiver les fonctionnalités Windows" dans la section "Entrez ici pour rechercher" à droite du bouton Windows **

image.png

** ② L'écran de réglage selon le libellé de la recherche s'affiche ** image.png

** ③ Trouvez l'élément Hyper-v dedans et vérifiez-le ** image.png

Maintenant vous êtes prêt à installer

Si la plateforme Hyper-v n'est pas cochée à l'étape ③

Si vous utilisez principalement votre propre PC, vous ne pourrez peut-être pas le vérifier, et lorsque vous le vérifiez, il semble que vous deviez activer la fonction elle-même à partir de l'écran du BIOS. Si la même chose se produit, recherchez "Nom du fabricant Mazabo" BIOS Hyper-v "et vous trouverez un article sur la façon de l'activer. Au fait, je suis un Mazabo GIGABYTE, donc l'article suivant m'a été utile.

Installez Docker Desktop

Veuillez télécharger le programme d'installation adapté à votre environnement à partir du lien ci-dessous

Après le téléchargement, suivez les étapes pour installer sans réfléchir. Il y aura un écran pour sélectionner quelque chose, mais en gros, vous n'avez pas à vous soucier de quoi que ce soit.

Il sera redémarré lorsque l'installation sera terminée, veuillez donc fermer toutes les autres applications ouvertes, etc.

Après redémarrage

Exécutez la commande suivante à partir du terminal sur Mac ou de l'invite de commande sous Windows.

docker -v

Après exécution, si la version suivante est affichée, l'installation est terminée.

PS C:\Users\Kohei Takahashi> docker -v
Docker version 19.03.13, build 4484c46d9d

[Exception] Lorsqu'un message d'erreur s'affiche depuis Docker Desktop lors du redémarrage

L'erreur que j'ai eue n'était pas exactement la même que la mienne, mais dans mon cas j'ai eu l'erreur "Je n'ai pas de noyau Linux". Fondamentalement, si le lien est affiché avec le message d'erreur, vous pouvez accéder au lien et la solution sera décrite avec soin, veuillez donc procéder telle quelle.

Installez Docker Compose

Docker a le concept de conteneurs, et Docker Compose est un outil qui rend ces conteneurs faciles à gérer. Comment installer

L'article ci-dessus est facile à comprendre.

Construisez réellement l'environnement en utilisant Docker

Cette fois, comme mentionné ci-dessus, nous allons préparer l'environnement de Laravel (PHP) + Apache + MySQL! Si vous développez une équipe, une personne peut faire le travail à partir d'ici, et les autres peuvent passer à "Lancer Docker". Il semble qu'il n'y ait pas de restrictions sur la structure des dossiers, mais la structure est comme indiqué dans Référence. Créez un dossier / fichier dans votre répertoire préféré avec la configuration suivante.


├── docker/
│   ├── app/
│   │   ├ Dockerfile
│   │   ├ php.ini #Fichier pour les paramètres PHP
│   │   └ 000-default.conf  #Fichier de configuration Apache
│   └── db/
│        ├ data/ #Répertoire de stockage des données MySQL
│        └ my.cnf  #Fichier de configuration MySQL
│
├── src/ #Répertoire de stockage des sources Laravel
└── docker-compose.yml

Très beau.

Ensuite, nous donnerons vie aux fichiers de réglages que nous venons de préparer.

Dockerfile Tout d'abord, donnons vie au Dockerfile.

#Quel type d'image Docker utiliser pour la construction
FROM php:7.4-apache

#Chargez le fichier de configuration dans PHP et Apache dans le conteneur docker
ADD php.ini /usr/local/etc/php/
ADD 000-default.conf /etc/apache2/sites-enabled/

#Installation de Composer
RUN cd /usr/bin && curl -s http://getcomposer.org/installer | php && ln -s /usr/bin/composer.phar /usr/bin/composer

#Installation du middleware
RUN apt-get update \
&& apt-get install -y \
git \
zip \
unzip \
vim \
libpng-dev \
libpq-dev \
&& docker-php-ext-install pdo_mysql

#Activer modRewrite requis par Laravel
RUN mv /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled
RUN /bin/sh -c a2enmod rewrite

C'est aussi un pakuri rond de Référence. Il semble que ces commandes soient exécutées dans l'ordre du haut.

000-default.conf Ensuite, donnez vie au fichier de configuration Apache.

<VirtualHost *:80>
       ServerAdmin webmaster@localhost
       DocumentRoot /var/www/html/laravelapp/public
       ErrorLog ${APACHE_LOG_DIR}/error.log
       CustomLog ${APACHE_LOG_DIR}/access.log combined
       <Directory /var/www/html/laravelapp/public>
           AllowOverride All
       </Directory>
</VirtualHost>

Pour "application laravel" qui apparaît ici, entrez le nom de l'application Laravel que vous prévoyez de créer.

php.ini Vient ensuite php.ini


[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"

Vous pouvez comprendre cela sans explication, mais cela définit le code des caractères et le fait que "Je suis japonais, donc je m'occupe du Japon".

my.cnf Le dernier fichier de configuration est my.cnf


[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
[client]
default-character-set=utf8mb4

Il s'agit principalement du réglage du code de caractère.

Docker Compose pour une gestion facile des conteneurs

Lorsque j'ai écrit la structure des répertoires plus tôt, il y avait "répertoire app" et "répertoire db" directement sous le docker, mais ils sont [container](https://cn.teldevice.co.jp/column/10509/ "title" ") A été clairement distinguée pour les séparer. Nous créons un conteneur d'application et un conteneur db, et il existe un Docker Compose qui peut les gérer facilement. Le fichier de configuration Docker Compose est docker-compose.yml. Écrivez ce qui suit dans docker-compose.yml.

#Spécification de la version du fichier de composition
version: '3'
#Quel type de conteneur lancer
services:
 #Conteneur pour exécuter laravel
 app:
   #Quel port ouvrir et connecter. Ce qui suit ouvre le port 80 du conteneur et se connecte au port 8000 de l'hôte
   ports:
     - "8000:80"
   #Spécifiez pour créer un conteneur à l'aide du Dockerfile créé précédemment
   build: ./docker/app
   #Spécifiez le nom du conteneur
   container_name: laravel_app
   #Spécifiez où synchroniser le conteneur et les répertoires hôte. Où ira la source laravel
   volumes:
     - ./src:/var/www/html
 #Conteneur qui exécute MySQL
 db:
   #MySQL 5 depuis Docker Hub.Désignation pour télécharger l'image officielle de 7
   image: mysql:5.7
   container_name: laravel_db
   #Spécifiez la variable d'environnement dans le conteneur. Il existe une image Docker qui sera définie au moment de la construction si vous transmettez la variable d'environnement, il est donc bon de la vérifier sur le site Docker Hub lors de son utilisation.
   environment:
     MYSQL_ROOT_PASSWORD: root
     MYSQL_DATABASE: laravel_db
     MYSQL_USER: laravel_user
     MYSQL_PASSWORD: laravel_pass
     TZ: 'Asia/Tokyo'
   #Commande au démarrage
   command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
   #Synchronisation d'annuaire. Synchronisez l'emplacement où le fichier de configuration et les données MySQL sont enregistrés. Fondamentalement, même si le conteneur est modifié au démarrage, les données seront perdues lorsque le conteneur lui-même s'arrête, il est donc nécessaire de synchroniser ce que vous souhaitez enregistrer avec la machine hôte.
   volumes:
     - ./docker/db/data:/var/lib/mysql
     - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
   ports:
     - 3306:330

Ceci termine les fichiers de configuration. Lançons Docker!

Lancer Docker

Lorsque vous exécutez la commande suivante, le contenu de docker-compose.yml décrit précédemment deviendra un conteneur.

docker-compose build

Ensuite, commençons le conteneur avec la commande suivante

docker-compose up

Cela va le démarrer. Cependant, lorsqu'il est démarré avec la commande ci-dessus, le journal est toujours affiché car il n'est pas exécuté en arrière-plan. C'est ennuyeux, alors exécutez la commande suivante pour le démarrer.

docker-compose up -d

Il fonctionnera maintenant en arrière-plan.

Au fait, si tu veux le laisser tomber

docker-compose down

Il tombera.

Créer un projet Laravel

Ensuite, créons un projet Laravel à l'intérieur du conteneur!

Entrez le shell du conteneur d'application créé précédemment avec la commande suivante

docker exec -it laravel_app bash

Créez un projet en entrant les commandes familières suivantes à la destination

composer create-project "laravel/laravel=~6.0" --prefer-dist laravelapp

Entrez le nom du projet que vous souhaitez développer dans la partie intitulée "application laravel" ci-dessus.

Après l'exécution, attendez un moment jusqu'à ce que le projet soit créé!

Accédez à la page d'accueil

J'ai fait la description suivante dans docker-compose.yml plus tôt.

Extrait des paramètres du conteneur d'application


services:
 app:
   ports:
     - "8000:80" #Important ici
   build: ./docker/app
   container_name: laravel_app
   volumes:
     - ./src:/var/www/html

Dans la description du conteneur d'application, j'ai défini une propriété appelée "ports", qui est un port comme son nom l'indique, et lorsque vous lancez le conteneur docker, vous pouvez en fait aller voir le projet laravel créé à l'URL suivante. Je peux le faire.

http://localhost:8000

Si vous pouvez confirmer avec cela, vous pouvez créer un projet laravel sur Docker pour le moment.

[Exception] Je ne sais pas ce que c'est, mais lorsque l'autorisation est refusée

Quand j'y ai accédé pour la première fois, on m'a dit quelque chose comme ça

The stream or file "/var/www/html/dooga/storage/logs/laravel.log" could not be opened in append mode: failed to open stream: Permission denied

Après enquête, il semble que l'utilisateur apache n'a pas l'autorisation d'écriture pour le fichier journal Laravel, il n'est donc pas possible d'écrire dans le journal et une exception se produit.

chmod -R 777 /var/www/html/laravel_app/storage

J'ai pu le résoudre avec la commande ci-dessus, mais je ne l'aime pas. Après quelques heures de recherche, j'ai trouvé cet article Lorsque j'ai essayé de suivre la procédure immédiatement, elle s'est affichée à merveille. Je me demande un peu si ce droit d'utilisateur est bon, mais je pense qu'il ne pose aucun problème.

[Exception] Lorsque la commande artisan ne peut pas être utilisée

Quand j'ai frappé la commande artisan, j'ai eu l'erreur suivante

Failed to clear cache. Make sure you have the appropriate permissions.

Si cela se produit, veuillez vérifier la structure des dossiers ci-dessous.

├─app #Probablement pas pertinent cette fois
│  └─public
├─framework
│  ├─cache
│  │  └─data
│  ├─sessions
│  └─views
└─logs #Probablement pas pertinent cette fois

Y a-t-il quelque chose qui ne va pas dans la procédure ou n'est-il pas possible de le faire en premier lieu? La raison n'est pas claire, mais le contenu du dossier ci-dessus appelé "framework" n'était pas complet. Je pense qu'il n'y avait pas de dossier appelé framework en premier lieu. Peut-être que je n'ai pas fait quelque chose que je pourrais faire parce que je n'avais pas l'autorisation d'écrire. Dans mon environnement, ces solutions m'ont conduit à la page d'accueil.

Configurer DB

Enfin, c'est le paramètre DB. Ces paramètres sont organisés dans un fichier appelé .env. Veuillez modifier comme suit.

DB_CONNECTION=mysql
DB_HOST=laravel_db
DB_PORT=3306
DB_DATABASE=laravel_db  # docker-compose.yml MYSQL_DATABASE
DB_USERNAME=laravel_user  # docker-compose.yml MYSQL_DATABASE
DB_PASSWORD=laravel_pass  # docker-compose.yml MYSQL_PASSWORD

Comme vous le savez peut-être, il s'agit de la valeur définie comme «environnement» du conteneur de base de données dans docker-compose.yml. Une base de données est également créée au démarrage, nous allons donc migrer après la configuration.

Entrez le shell du conteneur d'application comme précédemment. Démarrage du lien! !! Purururururune! !! (Style SAO)

docker exec -it laravel_app bash

Vous êtes maintenant dans / var / www / html. Si vous exécutez ls ici, vous pouvez voir qu'il y a laravel_app directement en dessous.

cd laravel_app # laravel_Aller à l'App
php artisan migrate #exécuter migrer

Si le journal suivant s'affiche après l'exécution de la commande ci-dessus, la migration est réussie. On peut dire que la construction de l'environnement a été achevée une fois.

Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.1 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (0.06 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (0.03 seconds)

Cette fois, il s'agit d'une migration en vérifiant la connexion, donc dans mon cas je vais la restaurer après cela.

php artisan migrate:refresh

Cela vous ramènera à l'état avant la migration.

[Exception] Je ne sais pas ce que c'est, mais l'accès est refusé

Dans ce qui précède, on dirait que c'est fini en douceur, mais bien sûr ce n'est pas le cas, et je suis resté coincé pendant un moment ici aussi. La raison en est que j'ai une erreur d'accès refusé lorsque php artisan migre.

Message d'erreur


root@xxxxxxxxxxxx:/var/www/html/laravel_app# php artisan migrate #Exécuter migrer

   Illuminate\Database\QueryException  : SQLSTATE[HY000] [1045] Access denied for user 'laravel_user'@'172.21.0.3' 

Pourquoi? Je suis en fait allé voir le contenu de mysql Dans ce cas, une fois sorti du conteneur d'application

docker exec it laravel_db mysql -u root -p
Enter password:  #Probablement OK en tapant root

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.31 MySQL Community Server (GPL)

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

Vous pouvez maintenant vous connecter à mysql en tant qu'utilisateur root. Après cela, j'irai voir les utilisateurs existants.

mysql> select user from mysql.user;

Ensuite, dans mon cas, l'utilisateur de laravel_db n'a pas été créé. (Peut-être que c'est naturel w)

db:
   image: mysql:5.7
   container_name: laravel_db
   environment:
     MYSQL_ROOT_PASSWORD: root
     MYSQL_DATABASE: laravel_db
     MYSQL_USER: laravel_user #Cet utilisateur n'existait pas
     MYSQL_PASSWORD: laravel_pass
     TZ: 'Asia/Tokyo'
   command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
   volumes:
     - ./docker/db/data:/var/lib/mysql
     - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
   ports:
     - 3306:330

Si tel est le cas, vous pouvez changer le fichier .env en tant qu'utilisateur qui utilise toujours root, mais je voudrais utiliser l'utilisateur laravel_user, et utiliser root entraînerait normalement la peine de mort pour des raisons religieuses.

Créez maintenant un laravel_user avec les mêmes permissions que root! (Yeux blancs)

Oui, alors je sens que je peux utiliser root, mais s'il vous plaît restez en contact.

mysql> CREATE USER 'laravel_user'@'%' IDENTIFIED BY 'laravel_pass';

Un laravel_user sera créé avec les minutes CREATE ci-dessus. Maintenant, donnez-lui les mêmes privilèges que root.

mysql> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER ON *.* TO 'laravel_user'@'%' WITH GRANT OPTION;

Accordez des autorisations à laravel_user avec cette déclaration coquine. Assurez-vous que vous avez vraiment les mêmes privilèges que root.

mysql> select host,user,select_priv,create_priv,insert_priv,grant_priv,account_locked from mysql.user;
+-----------+---------------+-------------+-------------+-------------+------------+----------------+
| host      | user          | select_priv | create_priv | insert_priv | grant_priv | account_locked |
+-----------+---------------+-------------+-------------+-------------+------------+----------------+
| localhost | root          | Y           | Y           | Y           | Y          | N              |
| localhost | mysql.session | N           | N           | N           | N          | Y              |
| localhost | mysql.sys     | N           | N           | N           | N          | Y              |
| %         | root          | Y           | Y           | Y           | Y          | N              |
| %         | laravel_user  | Y           | Y           | Y           | Y          | N              |
+-----------+---------------+-------------+-------------+-------------+------------+----------------+
5 rows in set (0.00 sec)

Vous êtes maintenant libéré de ce sort.

"Sommaire"

Ceci termine la construction de l'environnement de Laravel + Apache + MySQL avec Docker. Personnellement, j'ai trop souvent touché le mur et ce n'était pas facile, mais je suis content parce que j'ai atteint le stade où je peux le développer pour le moment. Je voudrais élargir un peu plus cet environnement, donc j'écrirai à nouveau à ce sujet! 【Article associé】 ・ Pourquoi n'incluez-vous pas Vue.js dans le Laravel de Docker! !!

ensuite

Matériel de référence

C'est un document de référence qui a été très utile.

Recommended Posts

Quand j'ai essayé de créer un environnement pour PHP7.4 + Apache + MySQL avec Docker, je suis resté bloqué [Windows & Mac]
J'ai essayé de créer un environnement de serveur UML Plant avec Docker
Comment créer un environnement [TypeScript + Vue + Express + MySQL] avec Docker ~ Vue ~
J'ai essayé de créer un environnement de WSL2 + Docker + VSCode
J'ai essayé de créer un environnement de développement http2 avec Eclipse + Tomcat
J'ai essayé de créer un serveur API avec Go (Echo) x MySQL x Docker x Clean Architecture
J'ai construit un environnement de rails avec docker et mysql, mais j'étais malade
[Rails] Comment créer un environnement avec Docker
[Première construction d'environnement] J'ai essayé de créer un environnement Rails6 + MySQL8.0 + Docker sur Windows 10.
[Résolution d'erreur] Se produit lors de la tentative de création d'un environnement pour le printemps avec docker
Quand je bcrypt avec node + docker, j'ai une erreur
J'ai eu une erreur en essayant d'installer sbt pour créer un environnement de développement Scala
Comment créer un environnement [TypeScript + Vue + Express + MySQL] avec Docker ~ Express ~
J'ai essayé de construire l'environnement petit à petit en utilisant docker
J'ai essayé de créer un environnement de développement padrino avec Docker
J'étais accro à WSl en essayant de créer un environnement de développement d'applications Android avec Vue.js
J'ai eu un IllegalAccessError en essayant d'utiliser PowerMock avec JUnit
Comment créer un environnement [TypeScript + Vue + Express + MySQL] avec Docker ~ MySQL ~
Comment créer un environnement Rails + Vue + MySQL avec Docker [dernière version 2020/09]
Comment créer un environnement [TypeScript + Vue + Express + MySQL] avec Docker ~ Sequelize ~
[Terraform] Docker résout le délai d'expiration lors de la tentative de création de ressources Azure sur une machine Windows
Créer un environnement avec Docker sur AWS
Comment créer un environnement Rails 6 avec Docker
Créez un environnement de "développement d'API + vérification d'API à l'aide de Swagger UI" avec Docker
Après tout, je voulais prévisualiser le contenu de mysql avec Docker ...
J'ai essayé de vérifier AdoptOpenJDK 11 (11.0.2) avec l'image Docker
J'ai construit un environnement CentOS 8 avec Vagrant et essayé de sync_folder, mais j'ai eu une erreur, donc je l'ai résolue.
Lorsque j'ai essayé de reproduire l'application Rails de Progate sur mon PC (environnement local), je suis resté bloqué sur l'affichage de l'image
Comment installer Docker dans l'environnement local d'une application Rails existante [Rails 6 / MySQL 8]
Une histoire sur une erreur lors de la migration dans docker PHP Laravel
La procédure que j'ai effectuée lorsque j'ai préparé l'environnement pour gradle + Java avec VS Code (Windows 10)
[Road_node.js_1-1] La voie de la création de l'environnement Node.js Express MySQL à l'aide de Docker
Comment créer un environnement Docker avec Gradle pour IntelliJ
J'ai démarré MySQL 5.7 avec docker-compose et j'ai essayé de me connecter
Créer un environnement de débogage Ruby avec VS Code de Windows 10
Rails6 J'ai essayé d'introduire Docker dans une application existante
Environnement Build Rails (API) x MySQL x Nuxt.js avec Docker
Webdrivers :: BrowserNotFound: Impossible de trouver le binaire Chrome. Lorsque j'ai essayé pour la première fois de tester E2E avec Docker + Rails, je suis resté coincé dans une erreur.
Lorsque j'ai essayé d'exécuter Azure Kinect DK avec Docker, il a été bloqué par le CLUF
J'ai essayé de créer un environnement de développement java8 avec Chocolatey
J'ai une exception InvalidUseOfMatchersException lors de l'utilisation de l'un dans le simulateur de JUnit
docker-compose.yml lorsque vous voulez garder mysql en cours d'exécution avec docker
[Vagrant] Préparez l'environnement de développement LAMP avec Vagrant (centos + apache + MySQL + PHP)
J'ai créé une application d'apprentissage automatique avec Dash (+ Docker) part2 ~ Façon basique d'écrire Dash ~
Créer un environnement Docker avec WSL