18
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

DockerでLaravel+MySQL+phpMyadminの環境構築

Last updated at Posted at 2020-11-06

この記事では新卒未経験エンジニアがLaravelの環境構築を解説します。至らない点もありますが、よろしくお願いします。gitを使わずに行います。Dockerfileやdocker-compose.ymlなどの設定ファイルの解説もしています。設定をしっかり理解して環境構築したい人向けです。また、Laravel初心者の方向けです!。

動作環境
Mac(Catallina 10.15.7)
Docker 19.03.13
docker-compose 1.27.4

dockerやdocker-composeは事前にインストールしておいてください。
参考記事
dockerとdocker-composeのインストール(mac編)

##ディレクトリ構成

├── Docker/
│   ├── App/
│   │   ├ 000-default.conf  
│   │   ├ Dockerfile
│   │   └ php.ini 
│   └── DB/
│        ├ my.cnf  
│        └ volume/ 
│
├── src/ 
└── docker-compose.yml

このような表示の仕方を行うためのtreeコマンドについてこちらで記事にしています。
ディレクトリ構成を簡単に表示!treeコマンド(Mac)よく使うオプションも紹介

####各ファイル・ディレクトリの説明

000-default.conf
Apacheの設定ファイル
Dockerfile
Dockerの設定ファイル
php.ini
PHPの設定ファイル
my.conf
MySQLの設定ファイル
volumeディレクトリ
DBのデータが保存される(永続化される)
srcディレクトリ
Laravelのソースコードが収納されるディレクトリ
docker-compose.yml
docker-composeの設定ファイル

##各設定ファイル

####000-default.conf
Apacheの設定になります。
以下の内容を記載してください。

000-default.conf
<VirtualHost *:80>
       ServerAdmin laravel@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>
  • 1行目:ポート80番に対するバーチャルホストの設定を行うことを定めています。

  • 2行目:サーバーのアドレスです。laravel@localhostというアドレスでリクエストが送られた場合、今記載しているバーチャルホストを使うという意味です。今回はローカルなので適当です。

  • 3行目:エラーログのディレクトリパスを指定しています。*

  • 4行目:アクセスログのディレクトリパスを指定しています。*

  • 5~7行目:作成するコンテナ内にある.htaccessというコンテキストを持つ全てのディレクティブが利用できる。

*${APACHE_LOG_DIR}は作成した後のコンテナの中の/etc/apache2/envvarsに定義されています。

 参考記事
  名前ベースの仮想ホスト
  一つのApacheサーバーで複数ドメインのサイトを公開する方法
  メモ:Apacheの設定ファイル(http.conf)を確認する (1)

####Dockerfile
php(laravel)コンテナの設定になります。
以下の内容を記載してください。

Dockerfile
FROM php:7.4-apache

ADD php.ini /usr/local/etc/php/
ADD 000-default.conf /etc/apache2/sites-enabled/

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

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

RUN mv /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled
RUN /bin/sh -c a2enmod rewrite

FROM php:7.4-apache
DockerHubからphp:7.4-apacheというイメージを引っ張ってきています。

ADD php.ini /usr/local/etc/php/ ADD 000-default.conf /etc/apache2/sites-enabled/
後ほど説明するphp.iniと上記で説明した000-default.confを作成するコンテナ内の指定したディレクトリにコピーしています。

RUN cd /usr/bin && curl -s http://getcomposer.org/installer | php && ln -s /usr/bin/composer.phar /usr/bin/composer
コンテナ内で、laravelのインストールに必要なコンポーザーをインストールしています。

RUN apt-get update \ && apt-get install -y \ git \ zip \ unzip \ vim \ libpng-dev \ libpq-dev \ && docker-php-ext-install pdo_mysql
コンテナ内でミドルウェアをインストールしています。コンテナ内でgit,zip,unzip,vim,libpng-dev,libpq-dev が使えるようにしています.

RUN mv /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled RUN /bin/sh -c a2enmod rewrite
コンテナ内で、rewrite.loadを指定したディレクトリに移動するmvコマンドを実行しています。
その後、rewrite.loadを有効にするた目のコマンドを実行しています。詳しくは二つ目の参考資料をご覧ください。

参考資料
Apacheのディレクトリを理解しよう
UbuntuにてApacheのモジュールを有効化する
DockerでLaravel+Apache+MySQLの開発環境を構築する

####php.ini
phpの設定になります。
下記をコピペしてください。

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

date.timezone = "Asia/Tokyo"
文字通りタイムゾーンの設定をしています。
default_charset
HTTPヘッダに出力するデフォルトの文字コードを指定します。
mbstring.language = "Japanese"
デフォルトの言語を設定します。

参考資料
php.ini ディレクティブのリスト
php.ini設定で設定可能な項目について
php.iniの編集

####my.cnf
MySQLサーバの設定ファイルになります。
詳細な設定は後ほど記載するdocker-compose.ymlに記載しているので最小限にしています。

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

[mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci
文字コードをutf8mb4に設定しています。
[client] default-character-set=utf8mb4
クライアントの文字コードの設定

参考記事
MySQL(InnoDB) で charset を utf8mb4 にする注意点の現在
文字コードを設定する
基礎MySQL ~その2~ my.cnf (設定ファイル)

####docker-compose.yml
docker-composeの設定ファイル(各コンテナの設定)

docker-compose.yml

# docker-composeで使用するバージョンを定義しています。
version: '3'
# アプリケーションを動かすための各要素のこと。servicesの中に、app、db、phpmyadminが子要素として設定されています。
services:
 # laravelを動かすコンテナがここから下に記載されています。
 app:
   #コンテナの名前をここで決めます。
   container_name: laravel_app
   # どのポートを繋ぐかという設定です。ホストの8080番ポートとコンテナの80番をつないでいる。80番ポートのバーチャルホストは000-default.confにて設定済みです。
   ports:
     - "8000:80"
   # Dockerfileの設定の場所を指定しています。Dockerfileの内容に基づいてビルドします。
   build: ./Docker/App
   # コンテナとホスト側のディレクトリを同期する場所をここで指定しています。ここにlaravelのソースが入ります。
   volumes:
     - ./src:/var/www/html
 # MySQLを動かすコンテナがここから設定されています。
 db:
   #Docker HubからMySQL5.7の公式イメージを引っ張ってくる設定です。
   image: mysql:5.7
   # コンテナ名を指定しています。
   container_name: laravel_db
   # MySQLのコンテナ内の環境変数を指定しています。任意のものを設定してください。
   environment:
     MYSQL_ROOT_PASSWORD: root
     MYSQL_DATABASE: laraveldb
     MYSQL_USER: dbuser
     MYSQL_PASSWORD: dbpass
     TZ: 'Asia/Tokyo'
   # 起動時のコマンドになります。
   command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
   # ディレクトリの同期をしています。ここを書かないとコンテナを閉じたときにデータベースからデータがなくなるので注意してください。詳しくはdocker 永続化などと調べると良いかもです。
   volumes:
     - ./Docker/DB/volume:/var/lib/mysql
     - ./Docker/DB/my.cnf:/etc/mysql/conf.d/my.cnf
   # ホストの13306番ポートとコンテナのなかの3306番ポートとつなげる設定です。
   ports:
     - 13306:3306
 # phpmyadminの設定が書きに記載します。
 phpmyadmin:
   #コンテナ名を決めています。
   container_name: phpmyadmin
   #DockerHubからphpmyadminのイメージを引っ張ってくる設定です。
   image: phpmyadmin/phpmyadmin
   #phpmyadminの環境変数の設定です。MySQLの設定を参照して記載してください。PMA_HOSTSにはservicesのdbを指定しています。
   environment:
    - PMA_ARBITRARY=1
    - PMA_HOSTS=db
    - PMA_USER=root
    - PMA_PASSWORD=root
   ports:
    - 3000:80

参考記事
docker-compose.ymlの書き方について解説してみた
DockerでMySQLお試し環境を構築する(ついでにphpMyAdminも)
Docker で PHP 7.4 と MariaDB 10.5 の LAMP + phpMyAdmin 環境を構築する方法

##コンテナを立ちあげる

ビルドします。(docker-compose.ymlファイルがあるディレクトリで行ってください)

[Mac]$ docker-compose build
      :
      :
     Successfully built c1c2970ecb4b
     Successfully tagged docker_laravel_app:latest

などと出力され問題なく終了すれば、以下のコマンドでコンテナを立ち上げます。

[Mac]$ docker-compose up -d

-dはバックグラウンドでコンテナを立ち上げる場合につけます。
不要であれば外してください。

コンテナが立ち上がっているか確認します。

[Mac]$ docker ps
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                                NAMES
e2164a5c2371        docker_laravel_app      "docker-php-entrypoi…"   3 minutes ago       Up 2 minutes        0.0.0.0:8000->80/tcp                 laravel_app
5d80cab0e266        mysql:5.7               "docker-entrypoint.s…"   3 minutes ago       Up 2 minutes        33060/tcp, 0.0.0.0:13306->3306/tcp   laravel_db
ad4786c13249        phpmyadmin/phpmyadmin   "/docker-entrypoint.…"   3 minutes ago       Up 2 minutes        0.0.0.0:3000->80/tcp                 phpmyadmin

コンテナの情報が出力されいれば問題ないです。

##laravelのインストール

コンテナの中に入ってlaravelのプロジェクトをインストールします。

docker exec でコンテナの中に入ります。

[Mac]$ docker exec -it laravel_app bash
root@e2164a5c2371:/var/www/html# //左のように表示されていればコンテナの中に入れています。

composerを使ってlaravelをインストールします。composerはDockerfileにて設定したようにインストール済みなので以下のコマンドでインストールできます。今回は6系のlaravelをインストールします。私が持っている技術書がlaravelの6系を使っているので6系でインストールします。(ちょっと時間がかかります。)

[コンテナ内]# composer create-project "laravel/laravel=~6.0" --prefer-dist laravelapp

最新バージョンをインストールする場合は下記のコマンドを実施

[コンテナ内]# composer create-project laravel/laravel --prefer-dist laravelapp

コンテナ内の/var/www/htmlとホスト側のsrcディレクトリにlaravelappディレクトリがインストールされていることを確認します。
開発する際は、ホストOS側のsrc/laravelappディレクトリ内のソースコードを編集すれば問題ないです。

docker-compose.ymlで設定したようにホストOSの8000番ポートをコンテナ内の80番ポートに繋がっているので
http://localhost:8000
にアクセスして、laravelのTOPページが出力されれば問題なしです。
スクリーンショット 2020-11-07 1.04.45.png

##DBの設定をし、接続する。
Docker-composeで作成したコンテナはコンテナ名で名前解決をしています。(コンテナ名で通信できます。)
laravelのコンテナから、MySQLのコンテナに接続するには、laravel_dbというホスト名(コンテナ名)の3306ポートにアクセスすれば、MySQLにアクセスできます。
docker-compose.ymlで設定したものを参考にしつつsrc/laravelディレクトリないにある.envファイルの中にMySQLの設定箇所があるので以下のように記載します。docker-compose.ymlで設定を変えている場合はそれに合わせてください。

DB_CONNECTION=mysql
DB_HOST=laravel_db
DB_PORT=3306
DB_DATABASE=laraveldb
DB_USERNAME=dbuser
DB_PASSWORD=dbpass

実際に接続してみます。

[Mac]$ docker exec -it laravel_app bash
[コンテナ内]# cd laravel_app
[コンテナ内]# php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.2 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (0.18 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (0.08 seconds)

上記のように出力されれば問題なしです。

##phpmyadminに接続する
phpmyadminはブラウザ上でDBの中身をわかりやすく表示や管理が行えるツールです。
詳しくは参考資料をご覧ください。
SQLの管理に役立つ!phpMyAdminの使い方【初心者向け】
phpMyAdminの使い方

下記のURLにアクセスしてphpmyadminが表示されることを確認する。(docker-compose.ymlで3000番ポートに設定済みです)
http://localhost:3000/

image.png

##MySQLサーバに入る。

MySQLのコンテナに入り、MySQLサーバに入ってみます。下記の順番でコマンドを実行してみます。

[Mac]$ docker exec -it laravel_db bash
[コンテナ内]root@5d80cab0e266:/# mysql -uroot -p 
Enter password:(docker-compose.ymlで決めたrootユーザのパスワード)
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 17
Server version: 5.7.32 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> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| laraveldb          |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.02 sec)

mysql> use laraveldb;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+---------------------+
| Tables_in_laraveldb |
+---------------------+
| failed_jobs         |
| migrations          |
| password_resets     |
| users               |
+---------------------+
4 rows in set (0.00 sec)

mysql>

mysql -uroot -p
-uでユーザを指定します。今回はrootユーザで入ります。
-pはパスワードを入力するというオプションです。

show databases;
全てのデータベースを出力します。

use laraveldb;
laraveldbのデータベースを使うというコマンドです。

show tables;
使用中のデータベース(laraveldb)のテーブルを全て出力するというコマンドです。

##最後に
これでlaravelの環境構築は終了であとはガシガシ開発作業を進めていくだけです!!
最後まで読んでいただいてありがとうございました。

参考記事まとめ
  名前ベースの仮想ホスト
  一つのApacheサーバーで複数ドメインのサイトを公開する方法
  メモ:Apacheの設定ファイル(http.conf)を確認する (1)
  Apacheのディレクトリを理解しよう
  UbuntuにてApacheのモジュールを有効化する
  DockerでLaravel+Apache+MySQLの開発環境を構築する
  ↑特に参考にさせていただきました。
  php.ini ディレクティブのリスト
  php.ini設定で設定可能な項目について
  php.iniの編集
  MySQL(InnoDB) で charset を utf8mb4 にする注意点の現在
  文字コードを設定する
  基礎MySQL ~その2~ my.cnf (設定ファイル)
  docker-compose.ymlの書き方について解説してみた
  DockerでMySQLお試し環境を構築する(ついでにphpMyAdminも)
  Docker で PHP 7.4 と MariaDB 10.5 の LAMP + phpMyAdmin 環境を構築する方法
  SQLの管理に役立つ!phpMyAdminの使い方【初心者向け】
  phpMyAdminの使い方
 

18
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?