M1MacでDocker(Ubuntu)+Rails6環境の構築手順メモ

# 0. 概要
M1プロセッサ搭載のMacbook-Airを持っています。その環境に、Dockerを入れて、コンテナとしてUbuntuを構築して、Ubuntu上でrails6を構築しようとしました。すると、yarnのインストールを行う手順でメモリ違反が発生してインストールすることができませんでした。結果的にはUbuntuのバージョンを18.04ではなく、20.04をインストールことで対応できました。

# 1. 環境
machine : MacBook Air (M1, 2020)
OS      : macOS BigSur Version 11.5.2

# 2. MacBook
## 2.1. docker インストール
- docker公式ページ[https://hub.docker.com/editions/community/docker-ce-desktop-mac] の「Mac with Apple chipe」からダウンロードする。
- ダウンロードした「docker.dmg」をダブルクリックする。
- 画面に従い、dockerアイコンをアプリケーションフォルダに移動してインストールする。

```shell
toshihiroinoue@T21MacAir ~ % docker -v
Docker version 20.10.8, build 3967b7d
```

## 2.2. コンテナ インストール
- Macのターミナルを起動する。
- Ubuntu:21.04のイメージをダウンロードする。

:::note warn
rails6＋M1プロセッサ＋dockerで動かす場合、Ubuntuは21.04でないと動作しません。yarnのインストールを行うためのCurlやWgetでメモリ違反が発生するためです。

詳細は、Docker Desktop 3.4.0 release notes(https://docs.docker.com/desktop/mac/release-notes/)のKnown issuesに説明があります。

Known issues
On Apple Silicon in native arm64 containers, older versions of libssl in debian:buster, ubuntu:20.04 and centos:8 will segfault when connected to some TLS servers, for example curl https://dl.yarnpkg.com. The bug is fixed in newer versions of libssl in debian:bullseye, ubuntu:21.04 and fedora:35.
:::

```shell
user@MacBook-Air ~ % docker pull ubuntu:21.04
```

- イメージのダウンロード結果は以下となる。

```shell
user@MacBook-Air ~ % docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
ubuntu       21.04     8002c671f7fe   13 days ago   72.4MB
```

- コンテナを作成する。

```shell
user@MacBook-Air ~ % docker run -it -d --name ubuntu ubuntu:21.04
```

- コンテナが正常に動作していることを確認する。

```shell
user@MacBook-Air ~ % docker ps 
CONTAINER ID   IMAGE          COMMAND   CREATED        STATUS        PORTS     NAMES
ea99b2bc3338   ubuntu:21.04   "bash"    34 hours ago   Up 16 hours             ubuntu
```

# 3. ubuntu
## 3.1. ubuntu パッケージインストール

- 個人的にほしいパッケージをインストールする。私がほしいだけなので、通常不要ではあるが、以降のコマンドがこれらが入っている前提になる。

```shell
root@ea99b2bc3338:~# apt-get update
root@ea99b2bc3338:~# apt-get upgrade
root@ea99b2bc3338:~# apt-get install aptitude vim
```

- このあとのインストールに必要なパッケージをインストールする。

```shell
root@ea99b2bc3338:~# apt-get install git curl wget
```

## 3.2. rbenv インストール
- rbenvのインストールに必要なパッケージをインストールする。

```shell
root@ea99b2bc3338:~# aptitude install autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm6 libgdbm-dev libdb-dev
```

- rbenvのリポジトリをクローンする。

```shell
root@ea99b2bc3338:~# git clone https://github.com/rbenv/rbenv.git ~/.rbenv
```

- ruby-buildのリポジトリをクローンする。

```shell
root@ea99b2bc3338:~# git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
```

- パスを通する。

```shell
root@ea99b2bc3338:~# echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
```

- rbenvを初期化する。

```shell
root@ea99b2bc3338:~# ~/.rbenv/bin/rbenv init
```

- 設定を追加する。

```shell
root@ea99b2bc3338:~# echo 'eval "$(rbenv init -)"' >> ~/.bashrc
```

- 設定を反映する。

```shell
root@ea99b2bc3338:~# source ~/.bashrc
```

- インストールできるRubyのバージョンを確認する。

```shell
root@ea99b2bc3338:~# rbenv install -l
2.6.8
2.7.4
3.0.2
jruby-9.2.19.0
mruby-3.0.0
rbx-5.0
truffleruby-21.2.0.1
truffleruby+graalvm-21.2.0

Only latest stable releases for each Ruby implementation are shown.
Use 'rbenv install --list-all / -L' to show all local versions.
```

## 3.3. ruby インストール

- Rubyをインストールする。

```shell
root@ea99b2bc3338:~# rbenv install 2.7.4
```

- ruby version 2.7.4をデフォルトのバージョンに指定する。

```shell
root@ea99b2bc3338:~# rbenv global 2.7.4
```

- 確認する。

```shell
root@ea99b2bc3338:~# ruby -v
ruby 2.6.8p205 (2021-07-07 revision 67951) [aarch64-linux]
```

## 3.4. SQLite インストール

- データベースとしてSQliteをインストールする。PostgreSQLやMySQLなどは任意で入れる。

```shell
root@ea99b2bc3338:~# aptitude install sqlite3
```

## 3.5. Node.js インストール

- 最新のNode.jsをインストールする。

```shell
aptitude install nodejs sqlite3 npm
```

- しかし、aptのNode.jsは古いため、 n packageを使って最新版をインストールする。

```shell
root@ea99b2bc3338:~# npm install -g n
root@ea99b2bc3338:~# sudo n stable
```

- 不要なので最初に入れておいたnodejsとnpmは削除しておく。

```shell
root@ea99b2bc3338:~# apt remove -y nodejs npm
root@ea99b2bc3338:~# exec $SHELL -l
```

- 最新バージョンがインストールできたことを確認する。

```shell
root@ea99b2bc3338:~# node -v
v14.17.6
```

## 3.6. Yarn インストール

- Yarnをインストールする。公式サイトのコマンドをそのまま実行する。

```shell
root@ea99b2bc3338:~# curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
root@ea99b2bc3338:~# echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list

aptitude update && aptitude install yarn
```

- バージョンが表示されれば成功となる。

```shell
root@ea99b2bc3338:~# yarn -v
1.22.5
```

## 3.7. rails インストール

- 最後にRailsを入れる。

```shell
root@ea99b2bc3338:~# gem install rails
```

- こちらも正しくインストールできているか確認する。

```shell
root@ea99b2bc3338:~# rails -v
Rails 6.1.4.1
```