昔はXAMPPを使ってローカル環境構築をしてたけど、今じゃDocker使うのが当たり前。正直まだまだ俺のDockerの理解は浅いんだけど、どうしてもこのクジラをペットにしたいので勉強してみる。
とういうことで今回は最初のステップとして、Laravel + Apache + MySQL + phpMyAdmin のローカル環境構築をDockerを使用してする方法を解説する。
目次:クリックでジャンプ
ゴール
Dockerを使ってLaravelの開発環境を構築する。会社では、リーダーでない限りGitHubやBacklogからリポジトリをローカルにcloneするところから始めることが多い。しかし今回はDockerfileやYMLを作成するところからスタート。
手順は下記。
- ディレクトリとファイルを作成(まだ中身は空でOK)
- Dockerfileの作成
- 000-default.conf(バーチャルホスト)の作成
- php.ini の作成
- my.cnf の作成
- docker-compose.ymlの作成
- コマンドでImage作成してコンテナ起動
- Laravelプロジェクトの作成
- 動作確認
ディレクトリとファイルを作成(まだ中身は空でOK)
フォルダ構成はこんな感じでOK。php.iniはPHP設定用のファイルで000-default.confはApacheの設定ファイル。 dbフォルダのdataフォルダ内にはMySQLのデータを保存して、my.cnfはMySQLの設定ファイル。 srcフォルダにはLaravelのソースを格納するフォルダになる。
Dockerfileの作成
# どんな docker イメージを利用して構築をするかを指定 # FROM : 今回はPHPの公式イメージの「php:7.4-apache」というイメージを指定 # このイメージはPHPとApacheが両方パックでインストールされているイメージで、Docker Hubというサイトからダウンロードされる。 FROM php:7.4-apache # 設定ファイルをdockerコンテナ内のPHP、Apacheに読み込ませる # ADD:ローカルのファイルをDockerコンテナ内にコピーする # 左側の「php.ini」はローカルで右側の「/usr/local/etc/php/」はDockerコンテナ内 ADD php.ini /usr/local/etc/php/ ADD 000-default.conf /etc/apache2/sites-enabled/ # Composerのインストール # RUN:コンテナ内でコマンド実行 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 pecl install xdebug-2.9.1 && docker-php-ext-enable xdebug # Laravelで必要になるmodRewriteの有効化 RUN mv /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled RUN /bin/sh -c a2enmod rewrite
Dockerfile とは、Dockerイメージを作成するための設定値が記述されるファイルで、このファイルをビルドすることでDockerイメージが作成される。コンテナを作成するときに利用するイメージ情報を主に記述。
000-default.conf(バーチャルホスト)の作成
<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www/html/practicedocker/public ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined <Directory /var/www/html/practicedocker/public> AllowOverride All </Directory> </VirtualHost>
「practicedocker」というフォルダは、あとで作成するLaravelプロジェクト名。
php.ini の作成
[Date] date.timezone = "Asia/Tokyo" [mbstring] mbstring.internal_encoding = "UTF-8" mbstring.language = "Japanese" xdebug.remote_enable=1 xdebug.remote_autostart=1 xdebug.remote_host=host.docker.internal xdebug.remote_port=9003 xdebug.remote_log=/tmp/xdebug.log
my.cnf の作成
[mysqld] character-set-server=utf8
my.cnf とは Linux の設定ファイル。 MySQLの文字コードがをShift-JIS から UTF-8 に変えるために my.cnf を修正。
docker-compose.ymlファイルの作成
# Compose fileのバージョン指定 version: '3' # どんなコンテナを立ち上げるか services: # ---laravelを動かすコンテナ -------------------------------------- app: # どのポートを開いて繋ぐか。下記はコンテナの80番ポートを開いて、ホストの80番につなぐ ports: - "80:80" # 先ほど作ったDockerfileを使って、コンテナをビルドするという指定 build: ./docker/app # コンテナの名前を指定 container_name: laravel_app # ローカルのディレクトリとコンテナ上のディレクトリのリンクを設定 # ./src は docker-composer.yml のディレクトリ直下にある src を設定している # コンテナが作成されると src ディレクトリからコンテナの /var/www/html にアクセスすることができる volumes: - ./src:/var/www/html # ---MySQLを動かすコンテナ---------------------------------------- db: # Docker HubからMySQL5.7の公式イメージをダウンロードしてくる指定 image: mysql:5.7 container_name: laravel_db # コンテナ内の環境変数を指定。環境変数を渡すとビルド時に設定してくれるDockerイメージがあるので、利用の際はDocker Hubのサイトで確認する environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: laravel_db MYSQL_USER: laravel_user MYSQL_PASSWORD: laravel_pass TZ: 'Asia/Tokyo' # 起動時のコマンド command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci # ディレクトリ同期。設定ファイルとMySQLのデータが保存される場所を同期している。コンテナは基本的に起動時に変更されてもコンテナ自体が止まるとデータが消えてしまうため、保存しておきたいものはホストマシンと同期しておく必要がある。 volumes: - ./docker/db/data:/var/lib/mysql - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf ports: - 3306:3306 # phpMyAdminを動かすコンテナ phpmyadmin: image: phpmyadmin/phpmyadmin:5 environment: PMA_HOST: 'db' PMA_USER: 'laravel_user' PMA_PASSWORD: 'laravel_pass' # コンテナの名前 container_name: phpmyadmin # コンテナと他のサービスを繋げる links: - db # localhost:8080 で phpmyadmin の管理画面にアクセス ports: - 8080:80 # セッション情報をボリュームに設定して永続化 volumes: - ./docker/phpmyadmin/sessions:/sessions例えば↓こんな感じにプロジェクト合うように↑を修正。
launch.jsonにデバッグの設定
VSCODE側の設定としてlaunch.jsonを以下のように設定
"configurations": [ { "name": "Listen for Xdebug", "type": "php", "request": "launch", "port": 9003, // //php.iniで設定したxdebug用のport番号 "pathMappings": { "/var/www/html": "${workspaceRoot}/src" // {docker上のdocument root}:{ローカルのdocument root} } },
コマンドでImage作成してコンテナ起動
# プロジェクトディレクトリに移動 $ cd PracticeDocker # Dockerイメージを作成(直下にdocker-compose.ymlがあること) $ docker-compose build # Dockerを起動 # -d オプションでバックグランド起動 $ docker-compose up -d # 起動しているコンテナが表示される $ docker ps
Laravelプロジェクトの作成
# appコンテナ(名称:laravel_app)に入る $ winpty docker-compose exec app bash # 以下でもdockerコンテナに入れる $./container.sh # Laravelプロジェクト作成 $ composer create-project --prefer-dist laravel/laravel practicedocker "6.18.*" # Laravelプロジェクト移動 $ cd practicedocker # ストレージの権限変更 $ chmod 777 -R storage/ # composerをインストール $ composer install
ホスト側のsrcディレクトリ直下にもpracticedockerディレクトリが同期される。
動作確認
上記にアクセスして、Laravel のスタート画面とphpMyAdminの管理画面が表示されてれば成功。
.gitignoreファイル追加
db配下のファイルはpushしたくないので、git管理下に置かない。
shell
container connect
# shell起動 $ ./container.sh root@390cfc38dae:var/www/html# [コマンド]
DB connect
# shell起動 $ ./db-connect.sh mysql> [コマンド]
次にデータベースに接続できるように設定をする必要がある。以下を参照すればOK!
Docker上のMySQLのDBコンテナにLaravelコンテナ、phpMyAdminコンテナとロカールPCのDBeaverから接続する
参照したサイト
下記のサイトがマジ超分かりやすい。当記事の内容は下記のサイトを参照してます。 ⇒https://laraweb.net/environment/8652/