Mac(M1)でLimaを使ってx86_64のDockerイメージを動かす(2022年1月版)

目次

はじめに

Docker Desktopにおいて、M1 Mac上でx86_64イメージをpullしても、動作しない場合があります。そこで、以下の手順で、Docker Desktopの代わりにLima-VM上にDockerをインストールして動作するようにします。

流れ

  1. Docker Desktop for Macをアンインストールする。
  2. HomebrewでLimaとDocker CLIをインストールする。
  3. Limaを設定し起動する。(執筆時点では、v0.8.1)
  4. docker compose v2を導入する。

概要図

f:id:YusukeOno:20220129080135p:plain
architecture

引用:https://docs.docker.com/get-started/overview/#docker-architecture

手順

基本的には、Host側(macOS)にて作業します。

Docker Desktopをアンインストールする。

Docker Desktop の Mac へのインストール | Docker ドキュメント

  1. Docker メニューから Troubleshoot (トラブルシュート)を選択し、 Uninstall (アンインストール)を選択します。
  2. 確認画面で、Uninstall をクリックします。

さらに、Finderよりアプリケーション>Docker.appをゴミ箱に入れる。

HomebrewでLimaとDocker CLIをインストールする。

> brew install lima docker

確認結果。Docker ClientはARM版であることが確認できる。

> limactl -v
limactl version 0.8.1

> docker version
Client: Docker Engine - Community
 Version:           20.10.12
 API version:       1.41
 Go version:        go1.17.5
 Git commit:        e91ed5707e
 Built:             Sun Dec 12 06:28:24 2021
 OS/Arch:           darwin/arm64
 Context:           default
 Experimental:      true
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

Limaを設定し起動する。

LimaのDocker初期セットアップする設定ファイルをGitHubより取得し、Intel版(x86_64)として動作するように記述を加える。

> curl https://raw.githubusercontent.com/lima-vm/lima/master/examples/docker.yaml -o ~/docker.yaml
> echo 'arch: "x86_64"' >> ~/docker.yaml

docker.yamlファイルを元にVMを起動する。
設定を変更する必要がなければ、"Proceed with the default configuration"を選択する。

> limactl start ~/docker.yaml
? Creating an instance "docker"  [Use arrows to move, type to filter]
> Proceed with the default configuration
  Open an editor to override the configuration
  Exit

選択後、初期セットアップが開始する。(初回は完了まで十分程度かかる)

? Creating an instance "docker" Proceed with the default configuration
INFO[0029] Attempting to download the image from "https://cloud-images.ubuntu.com/impish/current/impish-server-cloudimg-amd64.img"  digest=
:
:
INFO[0352] READY. Run `limactl shell docker` to open the shell.
INFO[0352] To run `docker` on the host (assumes docker-cli is installed), run the following commands:
INFO[0352] ------
INFO[0352] docker context create lima --docker "host=unix:///Users/yusuke.ono/.lima/docker/sock/docker.sock"
INFO[0352] docker context use lima
INFO[0352] docker run hello-world
INFO[0352] ------

続いて、docker context create lima〜docker context use limaを実行する。
(本手順では、環境変数DOCKER_HOSTを使用しない。)

> docker context create lima --docker "host=unix://${HOME}/.lima/docker/sock/docker.sock"
lima
Successfully created context "lima"

> docker context use lima
lima
Current context is now "lima"

確認結果。Hello from Docker!と出力される。

> docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:507ecde44b8eb741278274653120c2bf793b174c06ff4eaa672b713b3263477b
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.
:

> docker context ls
NAME      DESCRIPTION                               DOCKER ENDPOINT                                          KUBERNETES ENDPOINT   ORCHESTRATOR
default   Current DOCKER_HOST based configuration   unix:///var/run/docker.sock                                                    swarm
lima *                                              unix:///Users/yusuke.ono/.lima/docker/sock/docker.sock

Lima-VM(NAME:docker)が x86_64 として起動したことを確認する。(STATUS is Running.)

> limactl list
NAME      STATUS     SSH                ARCH      CPUS    MEMORY    DISK      DIR
docker    Running    127.0.0.1:62986    x86_64    4       4GiB      100GiB    /Users/yusuke.ono/.lima/docker

Lima-VM上ではDocker ClientとDocker ServerがAMD64で動作していることが確認できる。

> limactl shell docker docker version
Client: Docker Engine - Community
 Version:           20.10.12
 API version:       1.41
 Go version:        go1.16.12
 Git commit:        e91ed57
 Built:             Mon Dec 13 11:45:33 2021
 OS/Arch:           linux/amd64
 Context:           rootless
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.12
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.16.12
  Git commit:       459d0df
  Built:            Mon Dec 13 11:43:41 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.4.12
  GitCommit:        7b11cfaabd73bb80907dd23182b9347b4245eb5d
 runc:
  Version:          1.0.2
  GitCommit:        v1.0.2-0-g52b36a2
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

docker compose v2を導入する。

GitHub - docker/compose: Define and run multi-container applications with Docker

macOSでも、Linuxでの導入手順でOK。

GitHubより releases ページからバイナリを手動でダウンロードし、所定のディレクトリに配置する。
なお、下記の例のバージョン番号(v2.2.3)は、適宜変更する。

> mkdir -p ~/.docker/cli-plugins/
> curl -L https://github.com/docker/compose/releases/download/v2.2.3/docker-compose-darwin-x86_64 -o ~/.docker/cli-plugins/docker-compose
> chmod +x ~/.docker/cli-plugins/docker-compose

確認結果

> docker compose version
Docker Compose version v2.2.3

もし、v1を使用したいならば、brew install docker-composeでインストールする。

トラブルシューティング

Host側(macOS)のdocker composeコマンドでエラーになる。

エラー内容

error getting credentials - err: exec: "docker-credential-desktop": executable file not found in $PATH, out: ``

上記のエラーが出た場合は、Host側(macOS)の ~/.docker/config.json にDocker Desktopでの設定が残っているので、下記コマンドでcredsStoreフィールドを削除する。なお、viエディタなどで当該行を削除しても構わない。

https://docs.docker.com/engine/reference/commandline/login/#credentials-store

> cp -p ~/.docker/config.json ~/.docker/config.json.bak
> cat   ~/.docker/config.json.bak | jq 'del(.credsStore)' > ~/.docker/config.json

確認結果

> diff ~/.docker/config.json.bak ~/.docker/config.json
3d2
<  "credsStore": "desktop",

Lima-VM上でファイルを作成できない。

デフォルトでLima-VMにマウントされたHost側(macOS)のHOMEディレクトリは、Read-onlyになっている。

touch: cannot touch 'aaa.txt': Read-only file system

~/.lima/docker/lima.yaml に mountsキーにおいて、所定のディレクトリにwritable: trueを付与し、以下のコマンドでlima-vmを立ち上げ直して、変更した設定を反映させる。なお、同yamlファイルを修正した際には、lima-vmの停止・起動が必要となる。

> limactl stop docker
> limactl start docker

最後に

limactl で VM をバックグラウンドで起動させておく必要はありますが、特にLima-VMにログインすることもなく、Host側のmacOSからdockerを利用できるので便利です。

参考

github.com

MacBook Pro (14インチMacBook Pro - スペースグレイ) を買いました

Macbook Pro 14インチを購入しました。

f:id:YusukeOno:20211216073920p:plain
Macbook Pro 14-inch 2021

これまで、13インチのIntelモデルを使っていたのですが、M1モデルの方がスペックも高く省電力性も高いとのことで、乗り換えを決断しました。

  • CPU M1 Max
  • Memory 64GB
  • SSD 4TB

合計は、¥ 541,800(税込)です。(高い・・・

M1 MacにおいてもParallelsを使ってWindowsを併用しています。当初は、日本語環境にしようとすると設定アプリが起動しなくなるなどの挙動が見られたのですが、この時点の最新版Parallels(v17.1.1)ではWindows11のインストールがシンプルになり、初期状態で日本語環境でセットアップされて、安定的に使うことができるようになりました。

クリックだけでApple M1チップのMacにWindows 11をインストール出来るようになった「Parallels Desktop v17.1.1 for Mac」がリリース。

とはいえ、Windowsを使うのは、Excelマクロが使われているOfficeのファイルを扱う場合や、画像やOfficeファイルの差分を取得確認ためにWinMergeを使う場合、あとはギガバイト単位のテキストファイルを扱う場合など、サブでの利用のみでメインはmacOSです。

前評判の通り、負荷の高い作業(とはいえ、動画編集は行わないのですが)を行なってもファンが回ることは、ほとんどありません。以前の13インチモデルでは、Web会議において画面共有しながらカメラをONにしただけでも、ファンが結構うるさかったのですが、M1 Maxではほんのりキーボードの中心があったかいくらいで、やはりファンはほとんど回っていないようです。

あと、キーボードのキーとキーの間が艶消し黒になったことで、キートップと同じ色のため汚れが目立ちにくいようで、気がつくとびっくりするほど汚れていることがありました。

今のところARMアーキテクチャになって、以前使っていたアプリが動かなくなったことは無いので、このままメインで使い続けていこうと思います。

JAWS DAYS 2021 に参加してきました (スライドまとめ)

JAWS DAYS 2021 に参加してきました

jawsdays2021.jaws-ug.jp

昨年のJAWS DAYS 2020からオンライン開催となった今年のJAWS DAYS 2021(3月20日開催)は、参加申し込み数は約4,000人!AWS関連のユーザーイベントとしては、日本最大かと思います。

見逃した方や同じ時間帯で別のセッションを試聴されていた方は、もしかしてアーカイブが配信されるかもしれません。

www.youtube.com

1回の試聴では咀嚼できなかった私は、アーカイブ配信までスライドで復習するとします :)

▼ 2021/4/15 追記

アーカイブ配信されましたね!上記のYouTubeチャンネル JAWS DAYS 2021 より視聴可能です!


スライドまとめ

[Track_B][10:00-10:40]ハニートークン型ハニーポットによる攻撃者の行動分析と脆弱性の発見と報告まで ~AdministratorAccessポリシー付きアクセスキーを手にした攻撃者がとる行動とは~

ハニートークン型ハニーポットによる攻撃者の行動分析と脆弱性の発見と報告まで / AWS HoneyToken HoneyPot - Speaker Deck

[Track_C][10:00-10:40]AWS Control Towerを利用したマルチアカウント管理とセキュリティ統制

AWS Control Towerを利用したマルチアカウント管理とセキュリティ統制 - Speaker Deck

[Track_D][10:00-10:40]AWS Security Hub を活用してマルチアカウントのセキュリティを強化した話

AWS Security Hub を活用してマルチアカウントのセキュリティを強化した話 / Multi-account operation with AWS Security Hub - Speaker Deck

[Track_B][10:40-11:00]組織でAWSを使い始めるときに考えたいアカウントと請求の管理

組織におけるAWSのアカウント管理とコスト管理 - Speaker Deck

[Track_B][10:40-11:00]組織でAWSを使い始めるときに考えたいアカウントと請求の管理

HashiCorp Vaultを使った セキュアなDBアクセスの実現/Secure DB access with HashiCorp Vault - Speaker Deck

[Track_B][11:00-11:20]AWSからのメール読んでますか?

AWSからのメール読んでいますか? - Speaker Deck

[Track_C][11:00-11:20]AWS Wavelength 低遅延性能の実力に迫る!

AWS Wavelength 低遅延性能の実力に迫る! - Speaker Deck

[Track_D][11:00-11:20]医療データレイクで分析基盤の構築

医療データレイクで分析基盤の構築 / JAWS DAYS 2021 JMDC DATALAKE - Speaker Deck

[Track_B][13:00-13:40]AWS Lambdaのテストで役立つ各種ツール

AWS Lambdaのテストで役立つ各種ツール

[Track_D][13:40-14:00]サポーターセッション:Amazon ConnectとServerless〜事例やハマったポイントも公開〜

[JAWS DAYS 2021] Amazon Connect and Serverless - Speaker Deck

[Track_A][14:00-14:20]AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(シスコ認定インストラクター監修!)

AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)

[Track_C][14:20-15:00]AmplifyとLINEで作るJAWSDAYS投票システムの話/[AWS×LINE]高校の卒業記念に8,700枚の写真でモザイクアートに挑戦した話

JAWSDAYS2020_LINEDC - Speaker Deck

[Track_B][14:40-15:00]10年続いている電子書店をリニューアルする話

10年続いている電子書店をリニューアルした話 JAWS Days 2021 MediaDo/mediado-jaws-days-2021 - Speaker Deck

[Track_C][15:00-15:40]StepFunctions Expressで作るフルマネージドなサーバーレスバッチ

Step Functions Expressで作るフルマネージドなサーバーレスバッチ - Speaker Deck

[Track_D][15:00-15:20]スタートアップ企業での散乱したシステムリリースフローをととのえる話

スタートアップ企業での散乱した システムリリースフローをととのえる話/Maintain the system release flow - Speaker Deck

[Track_B][15:40-16:00]一年間運用して分かったCDKアンチパターン

JAWS DAYS2021 1年間運用して分かったCDKアンチパターン - Speaker Deck

[Track_B][16:00-16:20]Cognito+API Gateway+Lambda+S3ではじめるサーバーレスアプリ構築 ~SIer企業がはじめて挑戦してみた話~

Cognito+API Gateway+Lambda+S3ではじめるサーバーレスアプリ構築 / Building Serverless Apps with Cognito+API Gateway+Lambda+S3 - Speaker Deck

[Track_C][15:40-16:20]AWS運用を頑張らないために何が出来るのか

AWS運用を頑張らないために何が出来るのか - Speaker Deck

[Track_C][15:40-16:20]AWS運用を頑張らないために何が出来るのか

セキュリティの基本とAWSでのセキュリティ対策をフルコースで味あう

[Track_C][16:20-17:00]CI/CDプロセスにCloudFormationを本気導入するために考えるべきこと

CI/CDプロセスにCloudFormationを本気導入するために考えるべきこと - Speaker Deck

[Track_D][16:20-17:00]AWS Codeシリーズで実現するEKSのCI/CDパイプライン

JAWSDAYS_AWS Codeシリーズで実現するEKSのCI/CDパイプライン - Google スライド

[Track_B][17:00-17:20]RDSのトラブル発生に備えて!やっておくべき設定・監視

RDS のトラブル発生に備えて!やっておくべき設定・監視 #jawsdays2021 #jawsdays2021_B - Speaker Deck

[Track_D][17:00-17:20]自宅付近の気温と湿度を可視化する時に気づいたAmazon Timestream導入時の注意点

自宅付近の気温と湿度を可視化する時に気づいたAmazon Timestream導入時の注意点 / Important point of Timestream - Speaker Deck

[Track_B][17:20-18:00]Amazon Connect愛について語り尽くす

Jawsdays2021 Amazon Connect愛について語り尽くす

[Track_C][17:20-18:00]数100台規模のnodeを使うEKSのAI推論環境構築

Mobility Technologiesにおける数100台規模のnodeを使うEKSのAI推論環境 - Speaker Deck

[Track_D][17:20-18:00]KDDI CCoE Bootstrapping ~AWS公式採用から5年後の”いま”と”これから”~

KDDI CCoE Bootstrapping 〜AWS公式採用から5年後の"いま"と"これから"〜 - Speaker Deck

ハンズオン

セキュリティグループって何? 使い方を基礎から学ぼう! - Speaker Deck

[JAWS DAYS 2021] ハンズオン 〜AWSとLINEをつないでAIボットを作ろう!初心者編〜 Presented by JAWS-UG 初心者支部

JAWS DAYS 2021 Hands-on Well-ArchitectedなIAMポリシーに挑戦する 〜最小権限の原則を実装ってどゆ…

情報処理安全確保支援士の集合研修に参加しました。(2020年2月末あたり)

情報処理安全確保支援士の集合研修とは?

情報処理安全確保支援士の更新には、登録日から3年間において、集合研修の修了が必要条件となっています。(他にも、「オンライン講習A」「オンライン講習B」「オンライン講習C」の修了が必要です)

www.ipa.go.jp

続きを読む

ソフトウェア・ファーストを読んで

どうも、y-onoです。昨今は、新型コロナウイルスのニュースばかりですね。

さて、2019年末にKindle版の本書を購入しまして、Evernoteをスクラップブック代わりに、気になった箇所を写経したり図表を貼り付けたりしてました。

私もSIer側に身を置くエンジニアとして、この本を読んで非常に危機感を感じざるを得ませんでした。システムは作って終わり、あとは維持・管理していく保守を続けるSIerビジネススキームに安穏としている間に、世の中は目まぐるしく変わってしまいました。

SIerがDXで変革を起こすには、組織も事業も大きく変わることも求められていますが、丸投げに慣れてしまった体質は現状から変わることについて強いハレーションを伴います。もはや、SIerにはDX自体が相容れないものように感じました。

と悲壮感ばかり漂うのですが(笑)、個人的には今後のキャリアパスを考えるにあたっても、SIerだからこそ読んで欲しいオススメの一冊です。