Docker Desktop for Mac(Windows)が有料化するから対応策を考えた

※再投稿
本記事は[朝日新聞社 Advent Calendar 2021](https://qiita.com/advent-calendar/2021/asahi)の25日目、つまりクリスマスの記事です！

# Docker Desktop for Mac(Windows)が有料化する
![File.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2277284/39a3d6ba-816f-069b-6f5d-f105c9d84ff1.jpeg)
2021年9月にDocker Desktopが有料化するという発表がありました。
猶予期間は2022年1月31日です。

Docker Desktopを開いた時に、上のようなおしゃれなポップアップがでてきませんでしたか？
最近、Docker DesktopのUIがどんどんおしゃれになっていくなぁと思っていたら、そういうことだったんだな‥と繋がりました。

私は業務でDockerを使っています。
Docker Desktop for Macも頻繁に使うソフトウェアの一つです。

Docker Desktopさんにはお世話になっているし便利なのでのでもちろん契約するのですが、Docker Desktopを使わずにMacで快適にDockerを使う手段はないものかと思いいろいろ調べてみました。

# 過去に見つけたDocker for Mac高速化の記事

一年前ほど前に「Docker for Macは遅い。VirtualBoxを使えばもっとはやい。」的な記事を見つけたのを思い出しました。

正確にはこれです↓

https://qiita.com/yuki_ycino/items/cb21cf91a39ddd61f484

DockerはLinux上で動くソフトウェアなわけですが、MacだったりWindowsでDockerを使う場合にはLinuxの仮想環境をそれぞれのOS上で動かさなくてはいけません。

Docker Desktop for Mac(Windows)を使うとそれらが[Linuxの仮想環境](https://docs.docker.jp/docker-for-mac/faq.html?highlight=hyperkit#mac-components-of-docker-desktop)を準備してくれるので、簡単にDockerを導入できるということだったようです。

上記記事では**VirtualBox + Docker**の組み合わせでDocker Desktopを使わないでDocker環境を構築しています。

以上から、Docker Desktopを使わずにMacでDockerを使うには、Docker Daemonを動かすためのLunux仮想環境をMac上に作ればいいということがわかりました。

# Macで仮想環境を作るには

Macで仮想環境を作るにはいくつか方法があります。

- VirtualBox
- VMware
- Parallels Desktop

この3つが主流なんじゃないかなと思います。

私は個人的にParallels DesktopとVirtualBoxを使ったことがあります。
VirtualBoxに関しては中学生のころくらいからよく使っていた馴染み深いソフトです。

最初は私も「VirtualBox」で環境構築しようかな…と思いましたが、どうやら最近、WindowsでいうWSL的なものがMacで出てきたという噂を耳にしました。

# LimaというMac版WSL

それが***Lima***です。

https://github.com/lima-vm/lima

> Lima can be considered as a some sort of unofficial "macOS subsystem for Linux", or "containerd for Mac".
→(訳)**Limaは、ある種の非公式な「Linux用macOSサブシステム」、あるいは「Mac用containerd」と考えることができるだろう。**
> 

いいですね。

私は個人プロダクトを進める時はWindowsでWSL2を使って開発をしています。

VirtualBoxとは違い、感覚的にはWindows上で開発している気分のままLinux上で開発をすることができ非常に便利です。
WSLからWindows側のファイルに簡単にアクセスできますし、IPアドレスが一緒だったり、メモリもホストマシンと共有だったりと、VirtualBoxで面倒な部分がWSLだとすべてスムーズに事が進みます。

どうやらLimaもWSLのように使うことができるようなのです。

つまり、Limaを導入すれば簡単にLinux環境が構築でき、Docker daemonの動作環境も構築できるのでは…。

# 簡単にLimaの導入と使い方

[github](https://github.com/lima-vm/lima)を見ていただくとLimaの導入方法が書いてあります。

Homebrewでパッケージが用意されていて、

```jsx
brew install lima
```

でさくっとインストールが可能です。

次に仮想環境を作ります。

仮想環境はyamlファイルを使って様々な設定をすることができ、[こちら](https://github.com/lima-vm/lima/tree/master/examples)に様々な定義yamlファイルが追いてあるので参考にするといいでしょう。

yamlを準備しないで

```jsx
limactl start
```

とすることもできます。この場合defalut.yaml([これ](https://github.com/lima-vm/lima/blob/master/pkg/limayaml/default.yaml))の設定で仮想環境が構築されます。

もしyamlを用意した場合は

```jsx
limactl start hoge.yaml
```

のようにコマンドを叩くと仮想環境の構築が始まります。

yamlファイルのファイル名が仮想環境名となるので注意してください。

作られた仮想環境は

```jsx
$HOME/.lima
```

に追加されていきます。

存在している仮想環境は

```jsx
$ limactl ls
NAME       STATUS     SSH                ARCH      CPUS    MEMORY    DISK      DIR
default    Running    127.0.0.1:60022    x86_64    4       4GiB      100GiB    /Users/watashi/.lima/default
docker     Running    127.0.0.1:60006    x86_64    4       4GiB      100GiB    /Users/watashi/.lima/docker
```

という感じで見ることが可能です。

仮想環境内に入りたいときは

```jsx
limactl shell [仮想環境名]
```

で環境に入ることが可能です。

細かい使い方は[こちら](https://github.com/lima-vm/lima#usage)に書いてあるので読んでみてください。

# Dockerを使えるようにする。

## Dockerのインストール

※もしDocker Desktopがすでに入っている方はuninstallしておいてください。Docker Desktopのウィンドウの虫ボタンからuninstallをすることができます。

MacでDockerをインストールするにはHomebrewでインストールするのが一番簡単です。
Docker Desktopは有料化するので、「Docker CLI Client」のみをインストールする必要があります。

ちなみに`docker run`だったり`docker build`といった処理はDocker CLI Clientの処理です。

```jsx
brew install docker
```

これで「Docker CLI Client」のみがインストールできました。[(※参照)](https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/docker.rb#L8)

`brew cask install docker`ではないので注意してください。
`brew cask`は.appを入れるためのコマンドなのでDocker Desktopがインストールされてしまいます。

ちなみにこの状態だと

```bash
$ docker ps
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
```

Docker daemonに接続できませんというメッセージがでます。

[DOCKER_HOST](https://docs.docker.jp/compose/reference/envvars.html#docker-host)の初期設定は`unix:///var/run/docker.sock.`になっています。
MacやWindowsにはDocker daemonは存在しない(できない？)ので、初期設定で動かないのは当たりまえですね。

ということでDocker daemonを利用できるようにLinuxの仮想環境を作っていきましょう。

## Docker daemonが動く仮想環境をLimaで作る。

Limaの定義yamlは公式例の[これ](https://github.com/lima-vm/lima/blob/master/examples/docker.yaml)を使います。

下のコマンドでどこかテキトーな場所にyamlをDLしましょう。

```bash
curl -o docker.yaml https://raw.githubusercontent.com/lima-vm/lima/master/examples/docker.yaml
limactl start docker.yaml
```

DLができたら、yamlを使って仮想環境を生成します。

```bash
limactl start docker.yaml
```

上記コマンド実行後の最後のログを読んでください。(yamlの[message](https://github.com/lima-vm/lima/blob/master/examples/docker.yaml#L69)に書いてある。)

```bash
INFO[0192] READY. Run `limactl shell docker` to open the shell. 
INFO[0192] To run `docker` on the host (assumes docker-cli is installed): 
INFO[0192] $ export DOCKER_HOST=unix:///Users/watashi/.lima/docker/sock/docker.sock
```

環境変数DOCKER_HOST([Doc](https://docs.docker.jp/compose/reference/envvars.html#docker-host))が指定されていますね。

```bash
export DOCKER_HOST=unix://$HOME/.lima/docker/sock/docker.sock
```

MacにあるDocker CLI Clientは上記のDocker daemonを使うようになります。

これにより、MacにあるDocker CLI Clientは仮想環境内にあるDocker daemonを動かすことができるようになりました。

あとはMacから下記のようにコマンドを打つことで、Docker Desktopを使っているかのごとく、仮想環境内でDocker Containerを動作させることが可能です。

```jsx
docker run --name nginx -d -p 8080:80 nginx
```

## 図で描くとこんな感じ(自信ない)
![File.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2277284/bb6941cc-9e3a-fffe-5845-a51f53842dae.jpeg)
私はこんな認識をしています。
間違っていたらコメントで教えてくださるとありがたいです。

# Docker Desktopの代替はLimaでOK？

個人的にはDocker Desktopはとても楽ちんなので(何も考えなくていい)、多少速度が遅くても使い続けていきたいという思いがあります。個人では多分使うと思います。

とはいえ所属グループでは様々な考え方がありますから、業務PCには入れることのできない未来もあるかもしれません。

Docker Desktopを使わない世界線に紛れ込んだ際にはこの手法でDocker開発に取り組んでいこうと思います。

***

朝日新聞社では、技術職の中途採用を強化しています。
ご興味のある方は下記リンクから希望職種の募集ページに進んでください。
皆様からのご応募、お待ちしております！

https://www.asahishimbun-saiyou.com/information/career