💻

M1 MacのDockerプレビュー版でLaravelとRuby on Railsは動くのか

2021/03/23に公開2

はじめに

先日、M1チップ搭載のMacBookAirを購入しました。

記事執筆時点(2021/3/23)ではM1 MacのDockerはプレビュー版ということで、
LaravelとRuby on Railsが動作するのか検証していきます。

本記事のハンズオンはこちら
https://youtu.be/2HTdXIv3heU

Dockerダウンロード

M1 MacのDockerプレビュー版をダウンロードします。
https://docs.docker.com/docker-for-mac/apple-m1/

Laravel環境構築

Laravelは

  • PHP 8.0
  • Laravel 8系
  • Nginx 1.18
  • MySQL 5.7

の環境で動作するか検証していきます。

ディレクトリ構成

docker_laravel/
├─┬ db/
│ ├── ...
├─┬ nginx/
│ ├── default.conf
├─┬ src/
│ ├── ...
├── docker-compose.yml
└── Dockerfile

ルート配下にdocker-compose.ymlを作成します。

docker-compose.yml
version: '3.9'

services:
  app:
    build: .
    volumes:
      - ./src:/var/www/html
  mysql:
    image: mysql:5.7
    ports:
      - '3306:3306'
    volumes:
      - ./db:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: laravel
  nginx:
    image: nginx:1.18
    ports:
      - '80:80'
    volumes:
      - ./src:/var/www/html
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - app
      - mysql

ルート配下にDockerfileを作成します。

Dockerfile
FROM php:8.0-fpm

COPY --from=composer:2.0.9 /usr/bin/composer /usr/bin/composer

COPY --from=node:14.15.5 /usr/local/bin /usr/local/bin
COPY --from=node:14.15.5 /usr/local/lib /usr/local/lib

RUN apt-get update && apt-get install -y zip unzip && \
    docker-php-ext-install pdo pdo_mysql

nginxディレクトリを作成し、nginxディレクトリ配下にdefault.confファイルを作成します。

nginx/default.conf
server {
    listen 80;
    index index.php index.html;
    server_name localhost;
    error_log /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    root /var/www/html/public;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
    
    location ~ \.php$ {
        try_files $uri = 404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

Dockerを立ち上げていきます。

docker-compose up -d

ここでエラー発生

Pulling mysql (mysql:5.7)...
5.7: Pulling from library/mysql
ERROR: no matching manifest for linux/arm64/v8 in the manifest list entries

MySQLはまだ対応していないのですね。。。

MariaDBは使えるようなので、DBのイメージをMariaDBに変更

docker-compose.yml
  mysql:
+   image: mariadb:10.3
-   image: mysql:5.7

Docker起動リベンジ。

docker-compose up -d

成功しました。

Creating docker_laravel_app_1   ... done
Creating docker_laravel_mysql_1 ... done
Creating docker_laravel_nginx_1 ... done

Laravelをインストールしていきます。

docker-compose exec app composer create-project --prefer-dist "laravel/laravel=8.*" .

成功しました。

> @php artisan key:generate --ansi
Application key set successfully.

http://localhostへアクセスしてみる。


問題なさそうです。

src/.envのLaravelのDB設定をdockerの設定に合わせます。

src/.env
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=password

初期マイグレーションを実行

docker-compose exec app php artisan migrate

一通り動きました!

Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (13.37ms)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (13.54ms)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (13.05ms)

試しにLaravelUIをインストールしてログイン機能が動作するか確認してみます。

docker-compose exec app composer require laravel/ui:^3.0
docker-compose exec app php artisan ui bootstrap --auth
docker-compose exec app npm install
docker-compose exec app npm run dev

表面上の動作は問題ありませんでした。

Ruby on Rails環境構築

Ruby on Railsは

  • Ruby 3.0
  • Ruby on Rails 6.1.3
  • MariaDB 10.3

の環境で動作するか検証していきます。

ディレクトリ構成

docker_rails/
├─┬ db/
│ ├── ...
├─┬ src/
│ ├── ...
├── docker-compose.yml
└── Dockerfile

ルート配下にdocker-compose.ymlを作成します。

docker-compose.yml
version: '3.9'
services:
  app:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - ./src:/app
    ports:
      - '3000:3000'
  mysql:
    image: mariadb:10.3
    ports:
      - '3306:3306'
    volumes:
      - ./db:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: password

ルート配下にDockerfileを作成します。

Dockerfile
FROM ruby:3.0

COPY --from=node:14.15.5 /usr/local/bin /usr/local/bin
COPY --from=node:14.15.5 /opt /opt

RUN apt-get update -qq && apt-get install -y build-essential libpq-dev

WORKDIR /app

COPY src/Gemfile /app/Gemfile

RUN bundle install
COPY . /app

srcディレクトリを作成し、srcディレクトリ配下にGemfileを作成します。

source 'https://rubygems.org'
gem 'rails', '~> 6.1.3'

Railsをインストールしていきます。

docker-compose run app rails new . --force --database=mysql

成功しました。

Done in 11.21s.
Webpacker successfully installed 🎉 🍰

src/config/database.ymlのRailsのDB設定をdockerの設定に合わせます。

src/config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password
  host: mysql

Dockerイメージを作成します。

docker-compose build

Dockerを立ち上げていきます。

docker-compose up -d

Dockerが立ち上がったらDBを作成します。

docker-compose exec app rails db:create

成功しました。

Created database 'app_development'
Created database 'app_test'

http://localhost:3000へアクセスしてみる。

問題なさそうです。

試しにscaffoldを使用してがCRUD機能が動作するか確認してみます。

docker-compose exec app rails generate scaffold todo title:string
docker-compose exec app rails db:migrate

表面上の動作は問題ありませんでした。

さいごに

もう少し環境構築に手こずるかと思っていましたが、意外とすんなりいきました!

動作もサクサク動くので開発体験も良くなりそうです!
正式版のリリースが待ち遠しいですね。

Discussion

Yusuke AkiyamaYusuke Akiyama

M1もRailsもほぼ初見だったのこの記事とても参考になりました!
ありがとうございます!