Mac の Docker の x86-64 エミュにプッツンした勢いで、余ったパソコンをリモート Docker サーバーにした
ARM Mac で Docker Desktop や Lima を使っていて、 docker build --platform x86-64 ....
や docker run --platform x86-64 ....
が、いきなりクラッシュしたり、途中まで進むけど特定の箇所でコケたりで困ったことはありませんか。
私はしょっちゅう困ってます。いよいよ我慢の限界になり、部屋でホコリを被ってた x86-64 なパソコンを使ってどうにかすることにしました。
これはホコリをはたいてキッティング中の様子です。
前準備
x86-64 なCPUを搭載したパソコンを調達する
Intel でも AMD でもどっちでもいいです。私は手元に転がってた Lenovo M75q-1 を使いました。手元になければアマゾンで安いミニPCを買うとよいでしょう。
USB メモリを買ってくる
手元になければ、テキトーに2本くらい買っておきます。2本なのは、1本は作業ミスってダメにするので、また買いに行かなくて済むよう予備のもう1本です。最近はコンビニでも売ってることがあって助かりますね。
GitHub アカウントを作りSSH公開鍵を登録しておく
https://github.com/ユーザー名.keys
で公開鍵が見えるように登録します。
Ubuntu Server をインストールする
ダウンロードする
LTS な Ubuntu Server をダウンロードします。LTSではないバージョンを選ぶと、他にインストールするものが対応してなかったり、EOLまで期間が短かくてOSアプデが面倒臭かったりします。黙ってLTSを選べ。
ISO ファイルを fedora media writer で USB メモリに焼く
ddコマンド思い出せないので fedora media writer で焼きます。簡単。
インストールする
電源入れたらBIOSメニューに入って、USBメモリから起動するようストレージの起動優先順位を変えて、BIOSから抜けて、Ubuntuインストーラーを起動します。
- キーボードレイアウトはちゃんと設定やっとけ
- ネットワークは有線が簡単だけど、WiFi接続もGUI並に簡単に設定できます
- OpenSSHサーバーをインストールしましょう。
Import SSH Identity
やると、https://github.com/ユーザー名.keys
を~/.ssh/authorized_keys
に追記しといてくれます - Snaps から docker を入れると、だいたいややこしくなるのでスルーします
- ストレージ。デュアルブートは、だいたいややこしくなるので、ストレージまるごと Ubuntu に使わせましょう
インストールが終わったら再起動します。
IP アドレスを調べる
再起動したら、このUbuntuパソコンに自宅内ネットワークで付与されてるIPアドレスを調べます。
ip a
IPアドレスがわかったら、以降は手元MacからSSH接続して作業できます。手元MacのSSH公開鍵はGitHubに登録してあり、 https://github.com/ユーザー名.keys
を ~/.ssh/authorized_keys
に追記済みだからです。
Docker Engine をインストールする
Install using the convenience script
の手順でやるのが手間なく簡単です。
インストールできたら、 sudo なしで docker コマンドできるよう、追加のグループ設定など済ませます。sudo あってもいいよと思うかもしれませんが、これをサボると絶妙にダルくなるので、面倒がらずやってしまうのがよいです。
ここまでで、手元 Mac から Ubuntu に SSH で入って、docker コマンドで操作できるようになりました。
手元 Mac で docker context を設定する
docker コマンドは context を切り替えることで、docker コマンドの操作対象を切り替えることができます。
docker context では、UNIXドメインソケット、TCP接続の他に、SSH接続もサポートしており、以下記事のように設定できます。これによりSSH経由で入れるサーバーで稼動してるDocker Engineを、手元Macのdockerコマンドで操作できるようになります。
手元 Mac から docker build, docker run やってみる
docker context を設定できたら、手元 Mac に テキトーな Dockerfile を用意して、 docker build, docker run, docker ps などやってみましょう。
私は AWS CodeBuild マネージドイメージの Dockerfile の docker build に、 ARM Mac の x86-64 エミュではコケていましたが、今回構築した x86-64 実機では成功しました。とてもよい。
検討したこと
パソコンが無かったら?
安いミニPCといっても1万数千円するので、微妙といえば微妙ですね。余ってるパソコンがあるならやるくらいでいいと思いました。AWS で Intel か AMD な CPU の EC2 インスタンスを、使うときだけ起動でもいいと思います。
そもそも docker --platform x86-64
指定で何も困ってないなら、ここまでやる必要ありません。
バインドマウント
手元 Mac の特定のディレクトリを、コンテナにマウントさせるもので、 docker build --volume ./hoge:/hoge-tmp ....
のようにやるやつです。
Docker Desktop などローカルに完結するソリューションではやれてますが、しかし今回の作例のリモートのDockerサーバーでは手軽にはできなそう。
- バインドマウントさせたいディレクトリを、手元 Mac 側で NFS, SMB などで公開する。それを Ubuntu 側がマウントし、コンテナにバインドマウントする
- バインドマウントさせたいディレクトリを、Ubuntu 側が NFS, SMB などで公開する。そこに 手元 Mac 側からファイル、フォルダを置く。それをコンテナにバインドマウントする
Docker Engine のインストール手法
振り返ってみると Snap の docker でよかったかもしれない。
k8s
手軽さ最優先なら minikube とか microk8s とか k3s で立てたらいいんじゃないですかね。
k3s はスパッと立って好き。Docker Engine を活かすなら、このくらいに
curl -sfL https://get.k3s.io \
| sh -s - --docker --write-kubeconfig-mode 644
〆
ここまで1時間くらいでやれました。とにかく短時間で簡単に手軽に構築できるを優先したので、まあまあ、こんなもんかなという感じです。
x86-64 なコンテナイメージのビルドと実行は、x86-64 エミュではコケていたものも、x86-64 の実機では完璧に動作します。やっぱ実機サイコーです。バインドマウントの問題はどうにかしたい。
M75q-1は、ふだんは液晶やらキーボードやら外して、足元の棚に設置してます。邪魔にならなくてよい。熱が籠もるとヤバいので通気は十分に確保してます。
Discussion