MacbookAir(M1)上で Gphys を動かす

はじめに

ここでは、Docker を用いてGphysを Mac(M1, 2020)上で動かすための方法を、以下の流れで紹介する。

  1. Docker のインストール
  2. x11サーバーのインストール
  3. x86_64エミュレーション環境の有効化
  4. Docker イメージの作成
  5. Docker コンテナの起動

Dockerを使うため、他のOS(Windows, Ubuntu, など)からでも 同様の方法でGphysを動かすことができるので、ぜひ参考にしてほしい。

使用環境

Gphys とは

地球流体電脳 Ruby プロジェクトが提供する多次元物理データ取り扱いライブラリー。 DCPAM が出力する NetCDF形式のデータを可視化するために用いる。 公式サイトはこちら

Dockerのインストール

Docker Desktop のサイト の「Docker Desktopをダウンロードする」の中から「Mac 版をダウンロード - Apple Silicon」をクリックする。 ダウンロードされた .dmg ファイルを開き、画面の指示に従ってアイコンをドラッグ&ドロップでインストール完了。

Homebrew がインストール済みの場合は brew install --cask docker でインストール可能。

XQuartzのインストールおよび設定

Mac 用の X11 について 「X11 は Mac に付属しなくなりましたが、X11 のサーバとクライアントのライブラリは、XQuartz プロジェクトから入手できます。」 ということで、 XQuartz プロジェクトから XQuartz-2.8.5.pkg をダウンロードして開き、画面の表示に従ってインストールする。

Homebrew がインストール済みの場合は brew install --cask xquartz でインストール可能。

open -a XQuartzなどでXQuartzを起動し、 設定 > セキュリティ >「接続を認証」「ネットワーク・クライアントからの接続を許可」 のチェックボックスにチェックをいれる。

設定画面

また、.zshrc に以下を追加する。

                
                    export PATH="/usr/X11/bin:$PATH"
                    /usr/X11/bin/xhost + localhost
                
            

rosetta2 を有効化する

arm64アーキテクチャCPUの Apple Silicon で x86_64用 Debian を動かすという半ば強引な方法を実現するため、 Apple が提供するrosetta2というエミュレーション機能を用いる。

アーキテクチャを切り替えて実行するコマンド arch -x86_64 zsh を実行する。エラーが出る場合は rosetta2 が使えない状態なので、以下のコマンドを実行する。

                
                    "sudo softwareupdate --install-rosetta"
                
            

Dockerfile からイメージを作成する

適当なディレクトリ (~/gphys など) を用意し、 Debian に Gphys をインストールするためのコードを書いた Dockerfile を配置し、 以下のコマンドを実行する。

Dockerfile例
                    
                        FROM debian:bookworm

                        RUN apt-get update && apt-get upgrade -y && apt-get install -y debian-keyring ca-certificates wget netcdf-bin

                        # 公開鍵署名 ~ Gphys インストール
                        RUN echo 'deb http://www.gfd-dennou.org/library/cc-env/Linux/debian-dennou bookworm main \n\
                        deb-src http://www.gfd-dennou.org/library/cc-env/Linux/debian-dennou bookworm main \n ' >>/etc/apt/sources.list \
                        && gpg --keyring /usr/share/keyrings/debian-maintainers.gpg --export -a 891D7E07 | tee /etc/apt/trusted.gpg.d/debian-dennou.asc \
                        && apt-get update \
                        && apt-get install -y gphys \
                        && rm -rf /var/lib/apt/lists/*

                        # gphys irb 初期設定
                        RUN wget -P ~/ https://ruby.gfd-dennou.org//products/gphys/tutorial2/irbrc_ggraph.rb \
                        && echo 'require "~/irbrc_ggraph.rb"' > ~/.irbrc

                        # サンプルデータダウンロード
                        RUN wget -P ~/sample https://ruby.gfd-dennou.org//products/gphys/tutorial2/air.2012-01.nc \
                        ; wget -P ~/sample https://ruby.gfd-dennou.org//products/gphys/tutorial2/hgt.2012-01.nc \
                        ; wget -P ~/sample https://ruby.gfd-dennou.org//products/gphys/tutorial2/ncep2.Jan.clim.1981-2010.nc
                    
                
                
                    docker image build \
                    --platform linux/amd64
                    --tag gphys:1.5.6 \
                    -f ~/gphys/Dockerfile ~/gphys
                
            

これにより、Gphys がインストールされた x86_64用 Debian のイメージが gphys:1.5.6 という名前で保存される。

ボリュームを作成する

Dockerコンテナ内のデータはそのままでは他のコンテナに引き継ぐことができず、コンテナ削除のたびに作業データも消えてしまう。 そこで、ボリュームと呼ばれるストレージをコンテナ内の適当なディレクトリにマウントすることで、これを回避したい。 ここでは、その前段階としてボリュームを作成するコマンドを実行する。

                
                    docker volume create --name gphys-work
                
            

これにより、gphys-work という名前のボリュームが作成される。 作成したボリューム一覧は、 docker volume ls により確認できる。

また、コンテナにホストマシン上に存在するディレクトリをマウントする方法もあるので、 「Docker バインドマウント」などと検索し バインド マウント(bind mount) の使用 - Docker ドキュメント などといったページを参照するといい。

Dockerコンテナを作成・起動する

docker container run コマンドにより、コンテナの作成〜起動までが行われる。

                
                    docker container run \
                    -it --rm \
                    --name gphys_work \
                    --env DISPLAY="host.docker.internal:0.0" \
                    --volume gphys-work:/root/work \
                    gphys:1.5.6
                
            

これにより gphys_work という名前のコンテナが立ち上がり、カレントシェルでコンテナのシェルが立ち上がる。

実行例
実行例

コンテナの停止・削除

コンテナを停止するときは、ログアウトする時と同様にしてコンテナ内のbashを終了すればいい。 起動時に --rm オプションを用いていた場合、 コンテナ停止と同時にコンテナは削除される。 --rm を使用しなかった場合は、 exit でコンテナは停止するが削除はされないので、 docker container rm gphys_work で削除する必要がある。

コンテナの起動(2回目以降)

一度停止したコンテナを再び起動する際は、 docker container start gphys_work \ してから docker container exec -it gphys_work bash することで先程と同様にコンテナを立ち上げることができる。

補足および注意点

参考資料