M1 MacBook Airのローカル開発環境をDockerで構築した話
x86とARMが混在する環境になったので、M1 MacBook Airのローカル開発環境をDockerで構築しました。メリット・デメリット、構築する際のポイントなどをメモとして残します。
公開日: 2024.12.18
M1 MacBook Air (Late 2020)のスペック
筆者の現在のメイン開発端末はM1 MacBook Air (Late 2020)で、スペックは以下です。
- CPU: M1 8コア
- GPU: M1 7コア
- Neural Engine: 16コア
- メモリ: 8GB
- OS: macOS 15.2(24C101)
開発環境
続いて開発環境は以下です。
- OS: Ubuntu
- ターミナルシェル: Fish
- レポジトリ: Github, Gitlab
- 言語: Node.js
なぜ開発環境をDocker化したのか?
仕事のメインマシンは今回から導入したM1 MacBook Airですが、生成AIなど用にdGPUを搭載したWindowsマシンも並行して使うことがあります。(旧プログラムだと、ARMに対応していないプラグインなどもあるため、その対処でもx86環境はあった方が楽)
また、M1 MacBook Airが8GBメモリなのでメモリが厳しくなったらメモリを32GBとモリモリに積んでいるマシンに一部の作業を移したいという狙いもあります。
Docker化するメリット
Docker化するメリットは次のものかなと思います。
- 環境の明確化
- 機種変更の時にスムーズ
- 複数台で開発する際に環境同期が楽
- 端末環境が汚れない
特に今回M1 MacBook Airを投入したことで、開発環境にx86とARMが混在するようになったため、「環境の明確化」というのは大きな目標でした。何か不具合が起きた際に、明文化していると修正が楽です。
自分は機種を買い替えるサイクルは比較的短い方で、2年に一回はメインマシンを変えるので、その際に乗り換えが楽になるようにという狙いもあります。
あとは、Homebrew依存度を下げるという狙いもあります。Homebrewは便利すぎて、なんでもbrew installしたくなるんですが、brew内で環境がごちゃごちゃになってしまうことが多いため、なるべく依存度を下げたいなと思っていました。
その意味でもDockerで仮想化しておいた方が後々楽になります。
Docker化するデメリット
続いてDocker化するデメリットも。
- パフォーマンスが10%程度落ちる
- ビルドの手間が増える
- 知識が必要
パフォーマンスについては、Node.jsで比較した分には体感ではわからないレベルです。数値で比較したらそれくらいだろうという感じです。
ビルドの手間に関しては正直手間です。しかも、環境に変更を加えるたびにDockerfileを書き直してビルドをするので、そこはデメリットかなと思います。
最後の知識については、今はChatGPTとかに聞けば簡単に答えを教えてくれるので、そこまでハードルは高くないかなと思います。
Dockerfileのサンプル
さて、自分の環境用ですが、サンプルを置いておきます。
# Ubuntuイメージをベースにする
FROM ubuntu
# 環境設定
ENV LANG C.UTF-8
# 必要なツールとSSHサーバーのインストール
RUN apt-get update && \
apt-get install -y \
openssh-server \
build-essential \
curl \
git \
&& apt-get clean
# SSHサーバーの設定
RUN mkdir /var/run/sshd
# SSHの設定ファイルを修正
RUN sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config && \
sed -i 's/#PubkeyAuthentication yes/PubkeyAuthentication yes/' /etc/ssh/sshd_config && \
sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
# dockeruserの作成
RUN useradd -m dockeruser && echo "dockeruser:password" | chpasswd && \
mkdir -p /home/dockeruser/.ssh && \
chmod 700 /home/dockeruser/.ssh && \
chown dockeruser:dockeruser /home/dockeruser/.ssh
COPY id_rsa.pub /home/dockeruser/.ssh/authorized_keys
# 権限を設定
RUN chmod 600 /home/dockeruser/.ssh/authorized_keys && \
chown dockeruser:dockeruser /home/dockeruser/.ssh/authorized_keys
## 以降、必要なインストール処理
# コンテナが起動したときに実行されるコマンド
CMD ["/usr/sbin/sshd", "-D"]
このDockerfileを元に、立ち上げるdocker-compose.ymlも置いておきます。
version: "3.8"
services:
ubuntu-dev:
build: .
container_name: ubuntu_dev_container
hostname: ubuntu-dev-server
volumes:
- ~/Workspace:/home/dockeruser/Workspace
working_dir: /workspace
environment:
- LANG=C.UTF-8
stdin_open: true
tty: true
ports:
- "2222:22"
- "3000:3000"
- "3001:3001"
- "4000:4000"
- "1313:1313"
- "1314:1314"
- "8787:8787"
networks:
- dev-network
networks:
dev-network:
driver: bridge
ローカルとの連携などは自分の環境に合わせてみてください。
あと、docker-compose.ymlを実行するディレクトリに、id_rsa.pubを置いておく必要があります。
これで、自分の公開鍵と秘密鍵のペアでsshログインができます。
自分の場合は、VSCなどのエディタからリモートサーバー接続させて開発をしています。