MacOS Rancher Desktop が proxy環境で docker run hello-world できない人の Tips

追記：minikubeを教えてくれた先輩がWindows版の記事を追加してくれました。Windowsでproxy環境の方は[こちら][ranchar-win-proxy]

## 環境

- Macbook Pro 2019 (Intel)
- Mac OS Monterey

## 経緯（蛇足。読み飛ばしOK）

SAMのビルド用に業務でDockerを使用しています。

Docker Desktop有償化以降、[先輩の記事][qiita-minikube]を参考にminikubeを使ってきましたが、細かいところで使い勝手が気になってました。

- 毎回起動時に `minikube mount` するのが煩わしい
- ターミナルを開く度に `eval $(minikube docker-env)` するのが嫌
- `localhost`でアクセスできない

などなど。

そんな中、SAMのissueに「[Colima と Rancher Desktop で動くようにしたで][sam-issue]」というコメントを発見。試してみました。

## 問題点

ざっと検索した感じで[Rancher Desktop][rancher-desktop]がベタ褒めされてたのでインストールしてみましたが、どうも会社のproxyが邪魔してdockerが上手く動かない。

```bash
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers).
See 'docker run --help'.
```

環境変数にも `~/.docker/config.json` にもプロキシ設定してみましたが変化なし。

「[`override.yaml` を作って環境変数渡せばいいよ][qiita-rancher-proxy] 」って記事も見ましたが、nerdctl は上手くいっても docker コマンドだと上手くいかない。

## 解決策

結局、以下の手順が必要でした。

1. `~/Library/Application Support/rancher-desktop/lima/_config/override.yaml` を作成して、以下を記述する

   ```yaml
   hostResolver:
     enabled: false
   dns:
   - <社内のDNSサーバー>
   env:
     http_proxy: http://<プロキシサーバー名>:<ポート番号>
     https_proxy: http://<プロキシサーバー名>:<ポート番号>
   ```

2. limaにログインして、 `/etc/init.d/docker` に環境変数を指定

   1. limaにログイン

      ```bash
      LIMA_HOME="$HOME/Library/Application Support/rancher-desktop/lima" "/Applications/Rancher Desktop.app/Contents/Resources/resources/darwin/lima/bin/limactl" shell 0
      ```

   2. `/etc/init.d/docker` に環境変数の設定を追加

      ↓この２行を追加

      ```bash
      export http_proxy="<プロキシサーバー名>:<ポート番号>/"
      export https_proxy="<プロキシサーバー名>:<ポート番号>/"
      ```

      vi で編集

      ```bash
      sudo vi /etc/init.d/docker
      ```

      ```text
      #!/sbin/openrc-run
      supervisor=supervise-daemon

      name="Docker Daemon"
      description="Persistent process that manages docker containers"
      description_reload="Reload configuration without exiting"

      # ↓ここに追加した
      export http_proxy="<プロキシサーバー名>:<ポート番号>/"
      export https_proxy="<プロキシサーバー名>:<ポート番号>/"

      command="${DOCKERD_BINARY:-/usr/bin/dockerd}"
      command_args="${DOCKER_OPTS}"

      以下省略
      ```

   3. サービス再起動

      ```bash
      $ sudo service docker restart
      * Caching service dependencies ...    [ ok ]
      * Stopping Docker Daemon ...          [ ok ]
      * Starting Docker Daemon ...          [ ok ]
      ```

## さいごに

本当はproxyが無いのが一番好きです

## 参考記事

- [VPN利用でProxyを超えてRancher Desktopを使う][qiita-rancher-proxy]
  - 最初に見たのがこの方の記事。dockerに拘らなければこの記事だけで解決してたかも
- [MacOS×Rancher Desktopでdocker image pullが使えないの解決法][qiita-ranchar-mac]
  - これを読んで「LimaにLoginせんとダメやん」ってなったのが一番の気づき。ありがとうございます
- [軽量コンテナ用 OS alpline に dockerを入れるまで][tofu]
  - service 起動時の環境変数を設定しようとして「`systemctl`ないやん」ってなった時にお世話になったページ

[rancher-desktop]: https://rancherdesktop.io
[qiita-minikube]: https://qiita.com/RyoWakabayashi/items/e243be18b2db6b11400d
[sam-issue]: https://github.com/aws/aws-sam-cli/issues/3595#issuecomment-1112402289
[qiita-ranchar-mac]: https://qiita.com/Yuppe-jp-eng/items/efa212185679aa3da929
[qiita-rancher-proxy]: https://qiita.com/yassan168/items/91b15b5edba8718d6196
[tofu]: https://tofu.hatenadiary.com/entry/2017/02/10/docker-alpine
[ranchar-win-proxy]: https://qiita.com/RyoWakabayashi/items/158e6957d362709dc4d6