Why not login to Qiita and try out its useful features?

We'll deliver articles that match you.

You can read useful information later.

374
394

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

macOSでもWSLみたいなLinux環境を手に入れる

Last updated at Posted at 2021-09-20

macOSでもLinuxの仮想環境が欲しい時はある

Dockerを利用するなど、macOSであってもLinux環境が欲しい時はあります。

Microsoft365や、Adobe CCなど、macOSかWindowsでしか使えないプロプライエタリなソフトウェアを使う、開発もほとんどの場合macOSネイティブで問題ない、でもDockerも使う、などのように主たる作業はmacOSでやりながらLinuxもちょっと使わないといけないということは多々あります。

VirtualBoxなどを利用することによって、仮想環境にLinuxをインストールし利用することはできますが、WindowsにおけるWSL (Windows Subsystem for Linux) のようにネットワークやファイルシステムが統合されたように見える環境を構築するのは面倒です。

そこで、"macOS subsystem for Linux" のような世界を目指して開発されているのが Lima です。

Limaを利用することで、WSLのような便利なLinux環境を利用することができ、またDocker Desktop for MacのようなDocker環境も構築することができます。

Limaを利用して、Linux環境を用意し、dockerをDocker Desktop for Macのように動かすところまでやってみます。

この記事の手順は Intel Mac および ARM Mac (M1 Mac) の両方で動作します。

大まかな手順

  • Homebrew のインストール
  • Lima のインストール
  • LimaによるゲストVMの作成と起動
  • macOSへ docker コマンドをインストール
  • Dockerによるコンテナの起動と動作確認

実際の手順

Homebrewのインストール

limaのインストールには Homebrew を利用します。公式ページの手順に従って brew コマンドをインストールしてください。
すでに brew コマンドが利用できる場合にはこの手順は不要です。

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Lima のインストール

brew install lima

LimaによるゲストVMの作成と起動

Limaでは limactl start コマンドによりゲストVMの作成や起動ができます。

インストール作業に関してはWSLにおける wsl --install コマンドに相当します。

ゲストVMの作成時にはYAMLファイルによる定義を利用することができ、幾つかのサンプルが Limaのリポジトリ/examples にあります。

今回は examples/docker.yaml を参考に、docker-composeとqemu-user-staticもインストールされるように 作ったYAML を利用します。

このYAMLファイルでは、UbuntuのベースイメージをダウンロードしゲストVMを作成し、Docker関連のセットアップがなされるような指示を書いています。

ゲストVMの作成時に使ったYAMLファイルのファイル名がそのままゲストVMの名前として利用されるため、一番よく使うゲストVMはdefaultという名前にしておきましょう。

curl -o default.yaml https://raw.githubusercontent.com/chibiegg/lima-config/master/docker.yaml
limactl start default.yaml

標準ではホストとおなじアーキテクチャ (M1の場合にはaarch64) のVMが出来上がります。
ほとんどの場合問題ないですが、x86_64 (amd64) のDockerイメージをビルドするときに問題が起きる場合もあります。
そういう場合には default.yaml の最後の行を arch: default から arch: x86_64 に書き換えてからVMの作成をしてください。

筆者の環境では一部の GOOS=linux GOARCH=amd64 go build で segmentation fault が起きることがありました。

x86_64にする場合
curl -o default.yaml https://raw.githubusercontent.com/chibiegg/lima-config/master/docker.yaml
sed -i -e 's/arch: default/arch: x86_64/g' default.yaml
limactl start default.yaml

(参考 : Lima で Intel on ARM やる )

ただし、この方法で起動したVMは全体的に動作がかなり緩慢になります。使い分けをするほうが良さそうです。

すでに作成されているゲストVMの二回目以降の起動は limactl start のみでOKです。

Limaで起動しているゲストVMの中でコマンドを実行するには lima コマンドを利用します。

lima と引数なしで実行した場合にはゲストVMのシェルに入ることができます。

先程の設定ファイルによってdockerはすでにインストールされているため、以下のようなコマンドでdockerを利用することができます。

lima docker ps

macOSへ docker コマンドをインストール

lima コマンド経由でdockerを利用できることは確認しましたが、macOSでビルド用のシェルスクリプトを実行する場合には、 command not found: docker となってしまいます。

そこで、macOSには docker コマンド (クライアント) のみをインストールし、ゲストVMのdockerを操作できるようにします。

brew install docker
sudo pip3 install docker-compose # docker-compose を利用する場合 (検証不足のため、うまくいかないかもしれない)

echo 'export DOCKER_HOST=ssh://limadocker:60006' >> ~/.zprofile

cat << EOS >> ~/.ssh/config
Host limadocker
  HostName localhost
  NoHostAuthenticationForLocalhost yes
  Port 60006
EOS

$SHELL -l

Dockerによるコンテナの起動と動作確認

先程、dockerコマンドをインストールし、接続先をゲストVMにしましたので、dockerコマンドで操作が可能です。

docker run -it -p 8080:80 nginx:latest

WSLやDocker Desktopと同様に、ゲストVMへのアクセスは localhost で可能です。
http://localhost:8080 で起動したnginxにアクセスすることができます。

qemu-user-staticもゲストVMにインストールしているため、 --platform linux/amd64 オプションも利用することができます。

docker build --platform linux/amd64 -t someimage .

docker-composepip3 でインストールできていれば動くはずです。

Docker Desktop for Macとの違い

Limaの制約により、1から1023番ポートまでの特権ポートは利用できません。

その他の操作

ゲストVMのシャットダウン

limactl stop

ゲストVMの削除

limactl delete default

default以外のゲストVMの利用

lima start instancename.yaml
LIMA_INSTANCE=instancename lima
lima stop instancename
lima delete instancename
374
394
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
chibiegg

@chibiegg(こたまご)

技術執行役員 兼 CISO 兼 CIO。ホスティングサービスの開発や、社内のシステム開発をしています。 (ネットワーク|情報セキュリティ|データベース)スペシャリスト。 得意分野は Python+Django、Golangでのサーバサイド、サーバインフラ、ネットワーク、電子回路設計や組み込みソフトウエア開発。 AS59105所属。写真と旅行♨️が趣味の18歳情報系女子。
sakura_internet
さくらレンタルサーバ、さくらのVPS、 さくらのクラウド、さくらの専用サーバなどのインターネットサービス・ITプラットフォームを提供しています。
Linked from these articles

Comments

MTsuyama-git
@MTsuyama-git(津山 雅彦)
(Edited)

docker-composeですが,私の環境だとconnection refusedと出てしまい,うまくいきませんでした.
最終的にいきついたのは,lima環境下にdocker-composeのgitでリリースされてる最新版を入れて,zshrcに
docker-comopse=lima docker-copose
といったようなaliasを貼るといったかんじです.dockerの方もこうすれば,hostに入れなくて済みますね(あまりメリットがないかもしれないですが)

0
chibiegg
@chibiegg(こたまご)
(Edited)

ARMアーキテクチャの場合に必要だったQEMUのワークアラウンドが不要になったため、@sasasin さんに該当箇所を削除していただきました。

ARM Mac ではパッチ適用済み QEMU を入れてくれるようになった by sasasin 2021/10/19 23:01

1
chibiegg
@chibiegg(こたまご)

dockerコマンドをmacOSに入れずに alias でやる方式も検討したのですが、そうすると docker login などの一部のコマンドで期待した動作をせずに困る場面がありました。

問題が起きない範囲では alias でも問題ないと思います。

1
chibiegg
@chibiegg(こたまご)

@pankona ありがとうございます!

タイポ修正 by pankona 2021/09/21 08:46

0

Let's comment your feelings that are more than good

Qiita Advent Calendar is held!

Qiita Advent Calendar is an article posting event where you post articles by filling a calendar 🎅

Some calendars come with gifts and some gifts are drawn from all calendars 👀

Please tie the article to your calendar and let's enjoy Christmas together!

374
394

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Login to continue?

Login or Sign up with social account

Login or Sign up with your email address