M1 MacのDockerプレビュー版でLaravelとRuby on Railsは動くのか
はじめに
先日、M1チップ搭載のMacBookAirを購入しました。
記事執筆時点(2021/3/23)ではM1 MacのDockerはプレビュー版ということで、
LaravelとRuby on Railsが動作するのか検証していきます。
本記事のハンズオンはこちら
Dockerダウンロード
M1 MacのDockerプレビュー版をダウンロードします。
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
を作成します。
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
を作成します。
FROM php:8.0-fpm
COPY /usr/bin/composer /usr/bin/composer
COPY /usr/local/bin /usr/local/bin
COPY /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
ファイルを作成します。
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に変更
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の設定に合わせます。
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
を作成します。
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
を作成します。
FROM ruby:3.0
COPY /usr/local/bin /usr/local/bin
COPY /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の設定に合わせます。
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
M1もRailsもほぼ初見だったのこの記事とても参考になりました!
ありがとうございます!
お役に立てて良かったです!!