Apple Silicon(M1チップ)搭載のMacでDockerを用いてAnacondaの環境を構築する

2022-10-08

概要

背景

いつの間にかM1チップに対応していたDockerが正式リリースされていたので、今までローカルに構築していたMiniforgeの環境をDockerに移管したいと思います。

目的

Apple Silicon搭載のMacにDockerを用いてAnaconda環境を構築します。Mac側からアクセスしやすくするために以下の対応を行います。

  • ファイルの共有できるようにDockerに共有フォルダの追加
  • matplotlibのグラフを確認できるように、ローカルからJupyter Notebookにアクセスできるように設定

Anacondaの環境構築

準備

まずはDockerをインストールします。こちらのサイトで配布されていますのでダウンロードして、手順にしたがってインストールを進めてください。

イメージの取得

以下のコマンドを入力してDockerのイメージを取得します。

docker pull continuumio/anaconda3

コンテナの作成

コンテナの作成コマンド

次にAnacondaの環境を公式サイトを参考にして構築していきます。公式の手順では以下のコマンドを入力するように指示がありますが、こちらを使用するとエラーがでます

docker run -i -t -p 8888:8888 continuumio/anaconda3 /bin/bash -c "/opt/conda/bin/conda install jupyter -y --quiet && mkdir /opt/notebooks && /opt/conda/bin/jupyter notebook --notebook-dir=/opt/notebooks --ip='*' --port=8888 --no-browser"

エラーの内容
省略
[I 2021-05-29 03:26:43.961 LabApp] JupyterLab application directory is /opt/conda/share/jupyter/lab
[C 03:26:43.963 NotebookApp] Running as root is not recommended. Use --allow-root to bypass.

そこで「–allow-root to bypass」を追記します。一応下記の内容で環境の構築はできます。ただし、こちらの手順では共有フォルダが作成されません。

docker run -i -t -p 8888:8888 continuumio/anaconda3 /bin/bash -c "/opt/conda/bin/conda install jupyter -y --quiet && mkdir -p /opt/notebooks && /opt/conda/bin/jupyter notebook --notebook-dir=/opt/notebooks --ip='*' --port=8888 --no-browser --allow-root"

公式サイトの通りにコンテナの作成コマンドを打ち込むと2回目のコンテナの起動に失敗します。原因を調べたところこちらの記事に対応方法の記載がありました。mkdirに-pをつけないとフォルダが既にあるためエラーを起こしてしまうそうです。

共有フォルダを作成する

共有フォルダのパスを指定します。-notebook-dir=の値を共有フォルダとすることで、jupyter notebookで開く先を共有フォルダにすることが可能です。その場合、ディレクトリを作成するコマンドは不要のため、「mkdir -p /opt/notebooks && \」の行は削除してください。
以下の項目は環境に合わせて任意の値を入力してください。

  • CONTAINER_NAME
    任意のコンテナ名を入力します。
  • SHARED_FOLDER_PATH
    Mac側の共有したいフォルダのパス。
  • MOUNTED_DIR
    Docker側のマウント先のフォルダ。好きな場所で良いですが、コンテナにマウントされるフォルダなので「/mnt/フォルダ名」が良いかと思います。指定したフォルダが存在しない場合は自動で作成されます。
docker run -v SHARED_FOLDER_PATH:MOUNTED_DIR \
    -i -t --name CONTAINER_NAME \
    -p 8888:8888 \
    continuumio/anaconda3 /bin/bash -c "\
    conda install jupyter -y --quiet && \
    mkdir -p /opt/notebooks && \
    jupyter notebook \
    --notebook-dir=/opt/notebooks --ip='*' --port=8888 \
    --no-browser --allow-root"

Jupyter Notebookにアクセスする

ブラウザからアクセスする

先程作成したコンテナを起動すると以下のようなメッセージが表示されます。

省略
[I 08:12:51.691 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 08:12:51.692 NotebookApp]

    To access the notebook, open this file in a browser:
        file:///root/.local/share/jupyter/runtime/nbserver-691-open.html
    Or copy and paste one of these URLs:
        http://f703614b19e3:8888/?token=1096eac49e73fjaioefjaeofajeofajeofajeaojf
     or http://127.0.0.1:8888/?token=1096eac49e73fjaioefjaeofajeofajeofajeaojf

ブラウザに起動Logに記載されたURLを入力します。上記の場合は「http://127.0.0.1:8888/?token=1096eac49e73fjaioefjaeofajeofajeofajeaojf」がURLとなります。

図 トークン入力画面

ページを開くとトークンの確認画面が表示されます。先程の起動Logにあるtoken=以降の文字(先程の例では「1096eac49e73fjaioefjaeofajeofajeofajeaojf」)を入力してログインをクリックしてください。

動作の確認

今回目的のmatplotlibが使用できるか確認をします。適当なフォルダに新しいプロジェクト(.ipynb)を作成してプログラムを実行します。

図 mltplotlib描写画面

matplotlibが読み込まれ、グラフが表示できることを確認してください。

2回目以降の起動

Dockerの起動コマンドを入力します。

docker start CONTAINER_NAME

ブラウザに1回目と同様のURLを入力してください。URLについては毎回起動Logに出力されますので、いつでも確認ができます。

だんだんApple Sillicon搭載のMacでも開発環境が整ってきました。Miniforgeは自身で必要なライブラリを入れる必要があるため少々面倒でした。そのためDockerでAnacondaが使用できるようになったのは嬉しいです。
ちなみにDockerで作られるコンテナはarm64版のようです。そのためまだ対応していないライブラリもたくさんあるようです。試しにpipからtensorflowを入れようとしましたが、うまくいきませんでした。いずれは解消されると思いますので待ちましょう。

まとめ

Apple Silicon搭載のMacにDockerを用いてAnaconda環境を構築する方法を紹介しました。

次のステップ

VSCodeを使用される方は「AnacondaのコンテナにVSCodeから接続する方法」をご参照ください。