M1 Mac miniを購入しました

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

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

https://yuruknowledge.com/m1-mac-mini%e3%82%92%e8%b3%bc%e5%85%a5%e3%81%97%e3%81%be%e3%81%97%e3%81%9f%ef%bc%81.html

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

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

.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.timezone = "Asia/Tokyo"  


mbstring.internal_encoding = "UTF-8"  

mbstring.language = "Japanese"

000-default.conf

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

       ServerName localhost  

  

       ServerAdmin webmaster@localhost  

       DocumentRoot /var/www/html/(プロジェクトフォルダ名)/public  

  

       ErrorLog ${APACHE_LOG_DIR}/error.log  

       CustomLog ${APACHE_LOG_DIR}/access.log combined  

       
           AllowOverride All  

           Require all granted   

       

my.cnf

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

default-character-set=utf8mb4  

  


default-character-set=utf8mb4  

  


default-character-set=utf8mb4  

  


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の皆様ありがとうございました!

https://morizyun.github.io/docker/docker-compose-mysql-phpmyadmin.html
https://note.com/pocke_techblog/n/n8af813848fa0
https://qiita.com/shimotaroo/items/679104b7e00dd9f89907
https://qiita.com/toyoyuto618/items/f225e1b2ab22ca5adf33