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

2022-09-18

 いつの間にかM1チップに対応していたDockerが正式リリースされていたので、今まで使用していたMiniforgeの環境を移管しようと思います。Dockerをあまり使用したことがなくて、結構時間がかかってしまったので手順を残しておきます。Mac側からアクセスしやすくするために以下の対応を行います。

  • Mac側で記載したコードが共有できるように共有フォルダを作成する。
  • matplotlibのグラフを確認したいので、ローカルからJupyter Notebookにアクセスできるようにする。

Dockerの環境構築

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

 次にAnacondaの環境をこちらの公式サイトを参考にして構築していきます。
以下のコマンドを入力してDockerのイメージを取得します。

docker pull continuumio/anaconda3

 コンテナを作成します。公式の手順では以下のコマンドを入力するように指示がありますが、こちらを使用するとエラーがでます

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"

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

<CONTAINER_NAME>:任意のコンテナ名を入力します。
<SHARED_FOLDER_PATH>:Mac側の共有したいフォルダのパス。
<MOUNTED>:マウント先のフォルダ。好きな場所で良いですが、コンテナにマウントされるフォルダなので「/mnt/フォルダ名」が良いかと思います。MOUNTEDが存在しない場合は自動で作成されます。

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

Jupyter Notebookへのアクセス
Access Jupyter Notebook

 先程作成したコンテナにアクセスをします。上の例の場合はブラウザに「http://127.0.0.1:8888/?token=1096eac49e73fjaioefjaeofajeofajeofajeaojf」と入力します。トークンの確認画面が表示された場合は、token=以降の文字「1096eac49e73fjaioefjaeofajeofajeofajeaojf」を入力してログインします。

トークン入力画面 Input of token

 無事Jupyter Notebookにアクセスできました! !
 目的のmatplotlibが使用できるか確認します。適当なフォルダに新しいプロジェクト(.ipynb)を作成します。

 matplotlibが読み込まれ、グラフが表示できているのが確認できました!

VSCodeを使用される方は引き続き「AnacondaのコンテナにVSCodeを接続した際に、Command in container failedと表示される」もご参照ください。

2回目以降の起動

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

docker start CONTAINER_NAME

 1回目と同様のURLにアクセスをします。

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

 だんだんMacでも開発環境が整ってきてありがたいですね。Miniforgeはもともと使ったことがなかったので、ライブラリを入れたりするのが面倒だったのでDockerでAnacondaが使用できるようになったのは嬉しいです。(すべての環境が動くか検証できておりません。)

ちなみにDockerで作られるコンテナはarm64版のようです。そのためまだ対応していないライブラリもたくさんあるようです。試しにpipからtensorflowを入れようとしましたが、うまくいきませんでした。いずれは解消されると思いますので待ちましょう。

 英語のアウトプットに良いかなと思って、ブログは読みづらくなりますが英訳した文章を書いてみました(笑)誤訳も多いかと思いますが、外国の方にも読んで頂けると嬉しいです。