M1 mac で x86_64 の Docker コンテナイメージ(gitbucket)を動かしてみたよ(ただし、動作がもたついている状態)
はじめに
Docker、Linux コマンドなどをあまり使い慣れていません。用語の違いや解釈の違いなどがあったら、ご指摘もらえるとうれしいです・・。
今回の内容を確認したかった動機
現在、自宅のメイン PC は、Mac mini(M1 2020)で、CPU が Apple シリコン となりました。
10万円以下で購入できる PC としては、とにかく基本性能の高い!(少なくとも自分には満足な性能!)で、
ものすごくコストパフォーマンスが良く、PC の性能ってまだまだ向上するものなんだなと感心しています。
が、arm 系 CPU は、2022 年 03 月現在、ハードウェアとの接続を管理するデバイスドライバなどがまだ十分にそろっておらず、たとえばドキュメントスキャナに関しては、先日、Canon のドキュメントスキャナ(DR-C230)のデバイスドライバがようやくメーカーにて正式対応し、ダウンロードできるようになりました。(半年くらい対応を待っておりました。ありがとう Canon。信じて待ってたおかげで、他のメーカーのドキュメントスキャナを買わずに済んだよ。)
次に、作成したソースコードの管理方法として、Git を使う上でのリモートリポジトリ保存先として、私は竹添直樹さんが公開している gitbucket を愛用しています。
(余談ですが、竹添さんといえば、
Seasar2 徹底入門。この本で Web アプリケーション開発のことを学びました。(当時は非常に助けられました。ありがとうございます。))
肝心の gitbucket ですが、OSS でここまでのものが作れてしまうことがすごいですね。見習わなければ・・。
話を戻して、
以前は手組みで CentOS サーバーを用意し、gitbucket を入れておりましたが、Java の設定などを簡略することを考えて、今回、Docker での gitbucket を構築してみようと思いました。コンテナ技術って便利ですね。
が、gitbucket の正式 Docker コンテナイメージは、x86 関連のものしか見当たらない
・qemu
・lima
というキーワードにたどり着きました。
つまり、
Mac 上での 「Windows における WSL みたいなもの」 で、かつ、「m1 mac 上で x86 エミュレーション動作する」 ものの様子。こりゃすごい!! ということで、早速試してみることにします。
ちなみに私、VisualBasic の思い出 Blog
を書いているように、基本的に、Windows 野郎(今でも Mac も Windows も両方好きです)でしたので、bash や、zsh より、PowerShell や MS-DOS コマンド の方が詳しいのですが、逐次頭を置き換えながら作業をしていってみます。目指すべきゴール
・m1 mac 上で x86_64 プラットフォームの gitbucket の Docker コンテナイメージ が動作し Git リモートリポジトリ管理できる
構成要素の把握
まず、lima ですが、
うん、Windows における WSL のようなもの、ですね。早速、インストールしてみましょう。
環境整備
まず、homebrew は 入っている前提です。
まず、 lima を入れてみます。ちなみに、自室ではなくリビングでいろいろと試してみたかったので、m1 mac mini ではなく、アラフィフ(表現が古い?)モバイル野郎として利用しようと購入した m1 MacbookAir(2020) で試してみます。このマシンは先日購入したばかりで、ほとんどアプリケーションを入れていない状態です(こいつもバッテリーは長持ちするし、Rethina ディスプレイは老眼気味になってきた目にもみやすい。TouchID も便利ですね)。
brew install lima
不安になるくらい、いろんなものが追加インストールされた様子ですが、最終的に
以下のバージョンがインストールされました。
/opt/homebrew/Cellar/lima/0.9.1: 45 files, 26.5MB
現在のプラットフォーム環境を確認します
uname -a
Darwin xxxx.local 21.3.0 Darwin Kernel Version 21.3.0: Wed Jan 5 21:37:58 PST 2022; root:xnu-8019.80.24~20/RELEASE_ARM64_T8101 arm64
開始してみます。
limactl start
確認プロンプト状態になるので、デフォルトのまま進めてみます。
? Creating an instance "default" [Use arrows to move, type to filter]
> Proceed with the current configuration
Open an editor to review or modify the current configuration
Choose another example (docker, podman, archlinux, fedora, ...)
Exit!
インストールが終わりました。
コンテナの動作状態をチェックしてみます。
lima uname -a
Linux lima-default 5.13.0-28-generic #31-Ubuntu SMP Thu Jan 13 17:44:32 UTC 2022 aarch64 aarch64 aarch64 GNU/Linux
arm64 の Ubuntu がインストールされていることがわかります。ちゃんとできてますね(あたりまえ)。
limactl list コマンドで、イメージのリストが表示されます。
limactl list
NAME STATUS SSH ARCH CPUS MEMORY DISK DIR
default Running 127.0.0.1:60022 aarch64 4 4GiB 100GiB /Users/xxxxxxx/.lima/default
なにも指定していない状態なので、default という名前でコンテナイメージが作成されていることがわかります。
このイメージは、以下の設定ファイル内容で、仮装コンテナ内 OS の設定が決まっているようです。
10行目、arch の 部分が null なので、
m1 mac としては、arm64(aarch64) の ubuntu が自動選択されて、作成されているということですね。
ということは、同じように設定ファイル(.yaml)を用意して、arch の部分を x86_64 を指定して、lima を起動すれば、 x86_64 版のコンテナイメージが作成できるのでは? という風に想像できますね。早速やってみます。
x86_64 版の lima 環境整備
デフォルトで作成したコンテナの.yaml ファイルは、以下のフォルダに保存されていました。このファイルをコピーします。
先ほどはホームディレクトリから直接 limactrl コマンドを実行していましたが、挙動を確認するため、任意のフォルダ(ディレクトリか)を作成し、先ほどのファイルを持ってきて、lima_x86.yaml にリネームします。
適当なエディタで中を開いて、 arch を "x86_64" に修正して保存します。
今度は、カレントディレクトリを上記のディレクトリに移動させて、limactl start コマンドで .yaml ファイルを指定して実行してみます。
cd lima
limactl start lima_x86.yaml
またまた不安になるくらい時間がかかるのですが、ターミナル内で進捗がみられます。先ほどは意識していませんでしたが、途中のセットアップ情報のなかで、 QEMU なるキーワードが出てきます。
lima 上において、 QEMU が 各コンテナの指定条件の CPU アーキテクチャに合わせてエミュレーションを行う形になって、CPU の違いを吸収している、という解釈をしていますが、合ってるかな?
そうこうしている間に、不安をよそに、コマンドの実行が終わりました。動作状況を確認してみます。
limactl list
NAME STATUS SSH ARCH CPUS MEMORY DISK DIR
default Running 127.0.0.1:60022 aarch64 4 4GiB 100GiB /Users/xxxxxxxxx/.lima/default
lima_x86 Running 127.0.0.1:57944 x86_64 4 4GiB 100GiB /Users/xxxxxxxxx/.lima/lima_x86
先ほどの default 以外に lima_x86 が増えました。動作している様子です。早速、作成したコンテナイメージを limactl コマンドにて 利用してみましょう。
limactl shell lima_x86
xxxxxxxxx@ubuntu:/Users/xxxxxxxxx/lima$
無事に 対象コンテナイメージの shell としてターミナルが切り替わりました。
CPU が x86 環境で動作していることを確認してみます。
uname -a
Linux ubuntu 5.13.0-28-generic #31-Ubuntu SMP Thu Jan 13 17:41:06 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
x86_64 の文字が確認できます。おおー! arm64 系の CPU 上で、x86 をエミュレーションしながら仮装コンテナイメージ内で ubuntu が動作しているのですね。すごいすごい!
(確認できたので、shell は exit にて終了させておきます。)
ここで、不要なトラブル発生を抑止するため、先に動作させている arm64 default コンテナイメージ動作を停止させておきます。
limactl stop default
現在の状態を確認します。
limactl list
NAME STATUS SSH ARCH CPUS MEMORY DISK DIR
default Stopped 127.0.0.1:0 aarch64 4 4GiB 100GiB /Users/xxxxxxxx/.lima/default
lima_x86 Running 127.0.0.1:57944 x86_64 4 4GiB 100GiB /Users/xxxxxxxx/.lima/lima_x86
defalut コンテナ は Stopped で、止まってますね。
では、ここから x86_64 で動作している lima ubuntu 内の 仮想マシン上にて、Docker を動作させて、最終目標である、Gitbucket の 正式コンテナイメージ を動作させてみましょう。
x86_64 版の lima 内 ubuntu にて Docker を動作させる
m1 arm64 を x86 環境でエミュレーションした、lima ubuntu 内にて、さらに Docker を動作させます。(何重のエミュレーションが走っているのでしょうか、すごいことだ・・)
作成した 名称、lima_x86 の shell を起動します。(プロンプト表示が username@ubuntu:にかわります)
limactl shell lima_x86
起動した shell 内に ベタ ですが、そのまま Docker(Docker-ce) を入れてみます。
Docker のインストールについては
上記 URL の情報を参考にさせていただきました。Step01 部分を参考に、インストールを実行。
sudo systemctl status docker
で、Docker が常駐していることを確認できました。
x86_64 版の オフィシャル Docker イメージ gitbucket の起動
では、いよいよメインの目的 オフィシャル Docker イメージの gitbucket を動かしてみます。
利用するイメージを特定します。
竹添さんの本家 Blog の情報をもとに、公式イメージを取り込みます。
DockerHub の対象ページも参照します。
では、取り込み開始。
docker pull gitbucket/gitbucket
あれ、エラーになりました。実行権限が弱いようです。sudo を 付加します。
sudo docker pull gitbucket/gitbucket
今度は成功しました。
Using default tag: latest
latest: Pulling from gitbucket/gitbucket
0e29546d541c: Pull complete
9b829c73b52b: Pull complete
cb5b7ae36172: Pull complete
99ce012bef04: Pull complete
22dc2a72d098: Pull complete
9c69a57e10d9: Pull complete
f249eb2068a0: Pull complete
f4460442282c: Pull complete
Digest: sha256:eafcdaf0e9b7c775f34b068b1360f221674fd896321920a49d536ac678afceb1
Status: Downloaded newer image for gitbucket/gitbucket:latest
docker.io/gitbucket/gitbucket:latest
では、gitbucket を docker run で起動してみます。
sudo docker run -d -p 8080:8080 gitbucket/gitbucket
docker プロセスの状態を確認してみます。
sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3eefc1eeb2a7 gitbucket/gitbucket "sh -c 'java -jar /o…" 2 minutes ago Up 2 minutes 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 29418/tcp priceless_shirley
では、gitbucket に GoogleChrome でアクセスしてみますが、
ぐ、ぐむー(キン肉マンを見ているとよく出てくる困った時に出るセリフ)。
管理画面ページが表示されないですね。
home ディレクトリ配下の、隠しフォルダ(.lima)内にある lima の実行ログを確認してみます。
ha.stderr.log
というログが出力されていました。
内容を確認すると、
{"error":"failed to run [ssh -F /dev/null -o
以下略
SSH 関連のエラーが発生している様子です。竹添さんのサイト情報の「SSH 経由での接続」を考慮して、実行コマンドを変更してみます。
まずは、起動中の Docker gitbucket を停止します。
sudo docker stop 3eefc1eeb2a7
コマンドを変更して、再トライ。
sudo docker run -d -p 8080:8080 -p 29418:29418 gitbucket/gitbucket
さあ、動くかな?と思い、 gitbucket への url に再アクセスするも、 あれ、やっぱり同じ状態・・。
こんなときはちょっと一呼吸入れて、頭を切り替えてみよう、と思い、3時間ほど放置。戻ってきて macbook air を見てみると・・・
gitbucket の画面が表示されています!!!
とりあえず、内部でメイン画面を起動できるところまでは成功しているようです。
初期設定を行うため、サインインしてみます。
サインインできましたが、
GoogleChrome のタブバーの「読み込み中」部分が動いたままの状態で 「localhost を 待機しています...」が連続していますね。
現時点のままでは、動作として、Gitbucket としては実用に耐えられる状態ではないかも、です。
しかしながら、m1 mac 上で x86_64 イメージの仮装コンテナが動作する ということは確認できました。もう少し調査を進めて、現状の動作のもたつきの原因を解消してみようと思います。
まとめ
いやー、しかし素晴らしい!!
Docker というか、コンテナ技術を使いこなせると、PC98 の Config.sys の記述内容と戦っていた MS-DOS 時代とは考えられないくらい、各種環境を迅速に用意できますね(例えが古すぎるかも・・)。
ただ、逆に、結局 Config.sys をいじるのと同じように、「各構成要素を正しく理解して使う」必要もありますね。便利であるが故に、何が使われて動作しているのだろう、という、何がの部分が隠蔽されてしまうため、構成要素を分解し理解できるようにしていこうと思います。
今回はプライベートで確認している限りですので、まずはやってみようの意識で取り組んでみました。
次は、gitbucket を 実用に耐えられるようにしてみたいなあ・・。
参考にさせていただいたサイト
Discussion
そんな難しいことをしなくても、GitBucketはJREが動けば良いので、下記Dockerfileを手元の環境でビルドすればarm64なopenjdk:8-jreを使って動作するはずです。
コメントありがとうございます。確かに、arm64で動作するJREの環境を作ってあげれば良いですねー。こういう点に気がつくということが大事ですね。ありがとうございます。
ビルドして試してみました。mac単体でDockerが動作するという、検証目的とは違うところでの確認になりますが・・・。なお、コマンドに --platform linux/x86_64 を追加することで、正常動作が確認できました。