Docker

M1 Mac miniでDockerを使ってLaravel6 + MySQL開発環境を作った話

M1 Mac miniを購入しました

この度とうとうM1 Mac miniを購入しました。
これまで使っていたのがMBP 15インチ(Mid2015)なので、6年ぶりの買い換えです。

買い換えに至った顛末と開封の儀はこちらから。

こちらの記事では、エンジニアっぽい話をする事にしているので
上記の記事で延々悩んでいた原因の

M1 MacのDockerで果たしてWeb系開発はできるのか!?

と、実際にM1のDockerで動いたLaravel用の開発環境構築を書いていきます。

Dockerで作れた開発環境

私がIntel版で作っていた開発環境は
ほぼそのままで全部動いた

具体的には

  • Apache + PHP + MySQL5.7 + Laravel6
  • Next.js
  • Express (Node.js) + MySQL5.7

この3つは何の問題も無く動きました!
ちなみにMySQLだけ一行設定を描き加える必要がありました。(後述します)

・・ほんと、こんなにあっさり行くならあんなに悩まずさっさと買えば良かったよ・・(´・ω・`)

Laravel用の開発環境を作る

前提

開発機は M1 Mac mini 16GB SSD 1TB です。

上記記事にある通り、MBP Mid2015 MojaveからTimemachineで
アプリ含め全部データ移行をした後、動かないアプリを削除し
M1用のアプリが出ている物は入れ直すという大雑把戦略を取っています。

なのでHomebrewとかすでに入ったまんま。まぁ動いているからよしとした(*´ω`*)

Dockerをインストールする

https://docs.docker.com/docker-for-mac/apple-m1/

このサイトからダウンロードします。
これを書いている4/3段階ではDocker Desktop RC 3が出ていますね。
正式版になる日も近いのかな・・?

フォルダ構造

今回のフォルダ構造はこんな感じです。
説明する順に番号を振ってあります。
取りあえずこの通りフォルダとファイルを作っちゃいましょう。

(新しいフォルダ)
 |
 |- docker-compose.yml ⑥ 
 |- docker
 |   |- php
 |   |  |- 000-default.conf ③
 |   |  |- Dockerfile ①
 |   |  |- php.ini ②
 |   |
 |   |- mysql
 |      |- conf
 |      |   |-my.cnf ④
 |      |
 |      |- mysql.env ⑤
 |
 |- (プロジェクトフォルダ: 任意の名前で)

既存のプロジェクトを持ってくる場合は、この段階でプロジェクトフォルダを持ってきましょう。後々の設定でフォルダ名がいります。

新しいプロジェクトを立ち上げるのであれば、Laravelインストール時に付けるプロジェクト名だけこの段階でメモっておいて下さい。まだプロジェクトフォルダは無くても大丈夫です。

設定ファイルを作成する

ここから設定ファイルを作成していきます。
対象のファイルをエディタで開いてさくさく書いて行きましょう。

Dockerfile

FROM php:7.4.15-apache の部分は
利用するPHPバージョンに置き換えて下さい。

# どんなdockerイメージを利用して構築をするか
FROM php:7.4.15-apache

# 設定ファイルをdockerコンテナ内のPHP、Apacheに読み込ませる
ADD php.ini /usr/local/etc/php/
ADD 000-default.conf /etc/apache2/sites-enabled/

#composerをインストール
COPY --from=composer:1.10 /usr/bin/composer /usr/bin/composer

#npmインストール
COPY --from=node:lts /usr/local/bin /usr/local/bin
COPY --from=node:lts /usr/local/lib /usr/local/lib

# ミドルウェアインストール
RUN apt-get update \
    && apt-get install -y \
    git \
    zip \
    unzip \
    vim \
    libpng-dev \
    libpq-dev \
    && docker-php-ext-install pdo_mysql bcmath

# Laravelで必要になるmodRewriteを有効化する
RUN mv /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled
RUN /bin/sh -c a2enmod rewrite

#コンテナ内に入った時のディレクトリを指定
WORKDIR /var/www/html

EXPOSE 80

php.ini

PHPの設定ファイルです。タイムゾーンはここで設定します。
余談ですがマレーシアならタイムゾーンは”Asia/Kuala_Lumpur”になります。

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

000-default.conf

Apacheの設定ファイルです。
(プロジェクトフォルダ名)の部分は、先ほどメモったプロジェクトフォルダの名前、もしくは新規Laravelプロジェクトを作成する際のプロジェクト名を入れて下さい。

<VirtualHost *:80>
       ServerName localhost

       ServerAdmin webmaster@localhost
       DocumentRoot /var/www/html/(プロジェクトフォルダ名)/public
       
       ErrorLog ${APACHE_LOG_DIR}/error.log
       CustomLog ${APACHE_LOG_DIR}/access.log combined
       <Directory /var/www/html/(プロジェクトフォルダ名)/public>
           AllowOverride All
           Require all granted 
       </Directory>
</VirtualHost>

my.cnf

続いてMySQLの設定です。
これはこのままコピペでOK。

[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

[mysqldump]
default-character-set=utf8mb4

[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_bin

# Enable access from the host machine.
bind-address=0.0.0.0

mysql.env

データベース設定です。
ここで決めたデータベース名は後でLaravel側で設定するのでメモって置いて下さい。

MYSQL_ROOT_HOST=%
MYSQL_ROOT_PASSWORD= root
MYSQL_USER= (任意のユーザー名)
MYSQL_PASSWORD= (任意のパスワード)
MYSQL_DATABASE= (任意のデータベース名)

docker-compose.yml

docker-composeの設定ファイルを書いていきます。
phpMyAdminに関してはいらない人はいらないと思うんですが
私、黒い画面でDB操作するのが未だにドキドキする人なので躊躇無く入れますw

コンテナー名は、私は

  • app: Laravelのプロジェクト名
  • mysql: Laravelのプロジェクト名_db

に統一しています。じゃないとすぐ忘れるので(;´Д`)

version: "3"
services:
  app:
    ports:
      - "8000:80"
    build: ./docker/php
    container_name:  (任意のコンテナー名)
    volumes:
      - .:/var/www/html
    depends_on:
      - mysql

  mysql:
    image: mysql:5.7
    platform: linux/x86_64
    container_name: (任意のコンテナー名)
    env_file: ./docker/mysql/mysql.env
    environment:
      - TZ=Asia/Kuala_Lumpur
    ports:
      - "3306:3306"
    volumes:
      - ./mysql/conf:/etc/mysql/conf.d/:ro
      - mysqldata:/var/lib/mysql
    networks:
      - default

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOSTS=mysql
      - PMA_USER=root
      - PMA_PASSWORD=root
    ports:
      - 8081:80
    restart: always
    links:
      - mysql:mysql

      # コンテナが削除されてもデータが消えずに保持される
volumes:
  mysqldata:

Intel版 Mac用Dockerから変更になった部分

docker-compose.ymlのmysql設定の部分に

platform: linux/x86_64

を追加しました。

まだM1のプラットフォームに合わせたMySQLが無いらしくて、これを設定しないとエラーが出ちゃいます。

呪文を唱える

ここまで来たら、ターミナルから今回作ったフォルダに移動し、Dockerを立ち上げます。

#Dockerイメージを作る
docker-compose build --no-cache

#Dockerコンテナを作る
docker-compose up -d

#作ったコンテナの中に入る
docker exec -it (appのcontainer_name) bash

#新規プロジェクトの場合はここからLaravelをインストール
#これはlaravel6系のインストールなので、別バージョンの場合は最後の部分を変えてね!
composer create-project --prefer-dist laravel/laravel (プロジェクト名) "6.*"

Laravelの.envファイル設定

URLとDB設定を書き換えます。

	APP_URL=http://localhost:8000
	
	DB_CONNECTION=mysql
	DB_HOST=mysql
	DB_PORT=3306
	DB_DATABASE=(さっきメモったDB名)
	DB_USERNAME=root
	DB_PASSWORD=root

後はいつも通り、必要に応じてmigration,seedingなどを実行して下さい。

ブラウザ表示の確認

Laravelは http://localhost:8000
phpMyAdminは http://localhost:8081

で入る事が出来ます。

おまけ: 近況報告

1年ほど某所の運営業務に携わりつつちょこちょこ開発案件をいただいてましたが、契約満了に伴い2月からは開発案件の受託に専念しています。
ま、フルリモートのフリーランスという意味では何も変わっていませんねw

相変わらずフロントもバックもやる、闇鍋っぷりですw
こないだまでNext.js案件にいたと思ったら、今月はLaravel案件に携わるというね・・
長期で取り組むのも良いですが、助っ人状態で短期決戦しに行くのが性には合ってますねぇ。

エンジニアのお仕事をする前もフリーランスで、やってたことは
「RIEさんならできそうだから」とホントいろんな事(半分以上未経験)を依頼されてましたから・・ある意味何も変わってないっすねw

ちょいちょい修羅場ったり頭抱えたりしつつも、運営業務があまりに濃厚ブラックだったお陰で何やっても平和に感じる日々ですw

今後も体調と相談しつつ、余裕があれば個人開発にも手を出しつつ、のんびりやっていきます(*´ω`*)

参考文献

いつもながらAuthorの皆様ありがとうございました!




コメントはこちらから

メールアドレスが公開されることはありません。

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください