🐋

Mac の Docker の x86-64 エミュにプッツンした勢いで、余ったパソコンをリモート Docker サーバーにした

2023/04/16に公開

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を買うとよいでしょう。

https://www.amazon.co.jp/s?k=ミニPC

USB メモリを買ってくる

手元になければ、テキトーに2本くらい買っておきます。2本なのは、1本は作業ミスってダメにするので、また買いに行かなくて済むよう予備のもう1本です。最近はコンビニでも売ってることがあって助かりますね。

https://www.amazon.co.jp/s?k=usbメモリ

GitHub アカウントを作りSSH公開鍵を登録しておく

https://github.com/ユーザー名.keys で公開鍵が見えるように登録します。

https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account

https://docs.github.com/en/authentication/connecting-to-github-with-ssh/testing-your-ssh-connection

Ubuntu Server をインストールする

ダウンロードする

LTS な Ubuntu Server をダウンロードします。LTSではないバージョンを選ぶと、他にインストールするものが対応してなかったり、EOLまで期間が短かくてOSアプデが面倒臭かったりします。黙ってLTSを選べ。

https://ubuntu.com/download/server

ISO ファイルを fedora media writer で USB メモリに焼く

ddコマンド思い出せないので fedora media writer で焼きます。簡単。

https://getfedora.org/ja/workstation/download/

インストールする

電源入れたらBIOSメニューに入って、USBメモリから起動するようストレージの起動優先順位を変えて、BIOSから抜けて、Ubuntuインストーラーを起動します。

https://ubuntu.com/server/docs/install/step-by-step

  • キーボードレイアウトはちゃんと設定やっとけ
  • ネットワークは有線が簡単だけど、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 の手順でやるのが手間なく簡単です。

https://docs.docker.com/engine/install/ubuntu/

インストールできたら、 sudo なしで docker コマンドできるよう、追加のグループ設定など済ませます。sudo あってもいいよと思うかもしれませんが、これをサボると絶妙にダルくなるので、面倒がらずやってしまうのがよいです。

https://docs.docker.com/engine/install/linux-postinstall/

ここまでで、手元 Mac から Ubuntu に SSH で入って、docker コマンドで操作できるようになりました。

手元 Mac で docker context を設定する

docker コマンドは context を切り替えることで、docker コマンドの操作対象を切り替えることができます。

https://docs.docker.com/engine/context/working-with-contexts/

docker context では、UNIXドメインソケット、TCP接続の他に、SSH接続もサポートしており、以下記事のように設定できます。これによりSSH経由で入れるサーバーで稼動してるDocker Engineを、手元Macのdockerコマンドで操作できるようになります。

https://maku77.github.io/p/qatbs9p/

手元 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 実機では成功しました。とてもよい。

https://github.com/aws/aws-codebuild-docker-images

検討したこと

パソコンが無かったら?

安いミニ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