MacでPythonのGUIライブラリをDocker Container内のJupyterlabから稼働させる方法
【2022.2.2追記】
docker composeとdockerfileで設定する完全版の方もご覧ください。
【完成版】MacでPythonのGUIライブラリが使えるDockerの設定方法
現在Pythonを勉強中です。
環境は、
- マシン:MacBook Pro
- OS:macOS Catalina(10.15.7)
- 開発環境:Docker Desktop
- エディタ:JupyterLab、Sublime Text
DockerにUbuntu公式のImageを使用、それから作成したContainerにPythonやJupyterlabを入れ、Tkinterを使えるようにしたい。
というのは、現在Pythonの教科書として、森 巧尚 著『Python 1年生 体験してわかる!会話でまなべる!プログラミングのしくみ』を使用中。
この本は簡潔丁寧に解説してくれているので、本当の初心者には良いが、少しかじった人だとクドく感じるかもしれない。(Amazonだと試し読みできるので確認してみるのも良い)
進んでいくと、アプリを作る項目に入ります。
その時にTkinterをインポートすることになりますが、Docker内にPythonを入れている状況だとTkinterは稼働しないことが判明。
調べたところによると、X11をMacにインストールして、Dockerにも何かしらインストールしなければならないようです。
結論から申し上げると、2日かけて無事Docker Container内でJupyterlabからTkinterを稼働させることに成功しました。
では、DockerでJupyterlabからTkinterを稼働させる方法を、順に説明していきます。
目次
- 1 MacにXQuartzをインストール
- 2 XQuartzの環境設定を開く
- 3 Docker Imageを導入
- 4 Containerを作成
- 5 Containerの中に入る
- 6 ContainerにPythonをインストール
- 7 libx11-devのインストール
- 8 python3-tkをインストール
- 9 Jupyterlabをインストール
- 10 ContainerをDocker Imageに変換する
- 11 新しいDocker ImageからContainerを作成
- 【2022.2.4追加】11-add XQuartzに接続する
- 12 Jupyterlabをブラウザで開く
- 13 JupyterlabでPythonを実行する
- 【2022.2.4追加】13-add コンテナを終了したあとは…
- 14 おわりに―今後の課題
- 参考サイト
1 MacにXQuartzをインストール
XQuartzをXQuartz.orgからdmgファイルをダウンロード、ダブルクリックするとインストール画面になるので、それに従って行けばMacにXQuartzをインストールすることができます。
2 XQuartzの環境設定を開く
XQuartzはアプリケーション/ユーティリティ フォルダに格納されます。
XQuartzを立ち上げ、ファイルメニュー→環境設定→セキュリティで、「接続を認証」のチェックを外し入れ、「ネットワーク・クライアントからの接続を許可」のチェックを入れます。
このあと、XQuartzを必ず再起動させます(再起動させないと設定が反映されないため)。
本当は、「接続を認証」のチェックをしてセキュリティを維持した方が良いのですが、チェックをするとJupyterlabにてpythonを実行するとエラーになるので「接続を認証」のチェックを外しています。
この辺については自己責任でお願いいたします。
3 Docker Imageを導入
Docker Hubに会員登録(無料)し、Docker Desktopを入れて起動していることが前提になります。
今回はUbuntuの公式Imageを導入することにします。
Docker Hubのサイトの一番上の検索窓に「ubuntu」と入れ検索すると、ubuntuの「Official Image」が出てくると思います。
ここからダウンロードしても良いのですが、Terminalに
$ docker run -it ubuntu bash
と打ち込むと、自動的にDocker HubからubuntuのImageを入れ込んでくれます。
そしてrunしたので、Containerも一緒に作成されています。
4 Containerを作成
既に3で、Containerも作成されていますので割愛します。
5 Containerの中に入る
Terminalで
$ docker ps -a
と打つと、作成されたContainerの一覧が出てきます。
該当するContainerのSTATUSが「Exited 〜」の場合、
$ docker restart コンテナ名またはID
でSTATUSを「Up 〜」にします。
その後、Terminalに
$ docker exec -it コンテナ名 bash
と打ち、Containerの中に入ります。
Terminalの表示が、「root@コンテナID:/#」に変わります。これがContainerの中に入っている証拠になります。
6 ContainerにPythonをインストール
Terminalに
# apt-get update
と入れ、Containerの中をアップデートします。
次に
# apt-get install -y python3 python3-pip
と打ち、pythonをインストールします。
pythonとpython3-pipのインストーラなどを事前に用意する必要はありません。上記コマンドを実行すると自動で探してきてインストールしてくれます。以下のインストールでも同様です。
(python3-pipは後に必要になるので、一緒に入れます)
テキストラインが多めに出てきますが気長に待ちましょう。
Terminalの最終行に「root@コンテナID:/#」が現れたら、インストール終了です。
7 libx11-devのインストール
X11に関するもののようですが、正体は理解していません!
Terminalに
# apt-get update
と入れ、Containerの中をアップデートします。
次に
# apt-get install libx11-dev
と打ち、libx11-devをインストールします。
途中で、Terminal上に「〜[Y/n]〜」が出ていたら、「Y」と打ちreturnキーを押してください。インストールが進みます。
【2022.2.4追記】これを自動的にスルーする方法をDockerfileにて記述することが出来ます。
詳細は、【まとめ】MacでPythonのGUIライブラリが使えるDockerの設定方法をご覧ください。
8 python3-tkをインストール
Tkinterに関係するものらしいですが、こちらも正体が分かりません。
Terminalに
# apt-get update
と入れ、Containerの中をアップデートします。
次に
# apt-get install python3-tk
と打ち、python3-tkをインストールします。
途中で、Terminal上に「〜[Y/n]〜」が出ていたら、「Y」と打ちreturnキーを押してください。
その後、地域一覧が出て来て現在の居住地域を尋ねてくるので、今お住いの地域の数字を入れreturnキーを押してください。
次に、現在の居住地に近い都市名(ほぼ首都名)が出てくるので、今お住いの地域近い都市の数字を入れreturnキーを押してください。インストールが進みます。
(以上は、日本に居住の場合、地域はAsia、都市はTokyoで良いと思います)
【2022.2.4追記】これを自動的にスルーする方法をDockerfileにて記述することが出来ます。
詳細は、【まとめ】MacでPythonのGUIライブラリが使えるDockerの設定方法をご覧ください。
9 Jupyterlabをインストール
Terminalに
# pip3 install jupyterlab
と打ち、Jupyterlabをインストールします。
以上で、Container内には必要なものが入りました。
10 ContainerをDocker Imageに変換する
pythonからJupyterlabまでをインストールしたContainerをDocker Imageに変換します。
Containerのままですと、Jupyterlabが上手く稼働しない(接続できない)のと、このContainerを保存するためです。
もしContainer内に入っている場合(Terminalの最終行が「root@コンテナID:/#」)は、
# exit
と打ってContainerから出ます。(Terminalの最終行が「皆さんのMacの名前:~ ユーザ名$」となります)
Terminalに
$ docker commit 変換したいコンテナ名 新しいイメージ名
と打つと、新しいDocker Imageが作成されます。
新しいDocker Imageを確認するには、Terminalに
$ docker images
と打つと、Docker Imageの一覧が現れますので、これで確認します。
11 新しいDocker ImageからContainerを作成
実行するに当たって、まず皆さんのMacのIPアドレスを調べてください。
アップルメニュー→システム環境設定→ネットワークのウインドウ内にIPアドレスが小さな文字で書かれていると思います。
あとでコピペします。
Terminalに以下のコマンドを入力します。長いですが1行で書いてください。
$ docker run -e DISPLAY="皆さんのIPアドレス:0.0" -v ~/Desktop/work:/work -p 8888:8888 --name 新しいコンテナ名 イメージ名 jupyter lab --ip=0.0.0.0 --allow-root --NotebookApp.token=""
「皆さんのIPアドレス」は、先程調べたものです。「新しいコンテナ名」は適宜つけてください。「イメージ名」は前項10で名付けた「新しいイメージ名」と同じです。
実行したら、Terminalで
$ docker ps -a
と打つと、作成されたContainerの一覧が出てきます。
該当するContainerのSTATUSが「Exited 〜」の場合、
$ docker restart コンテナ名またはID
でSTATUSを「Up 〜」にします。
また、XQuartzが立ち上がっているか確認してください。
【2022.2.4追加】11-add XQuartzに接続する
XQuartzに接続します。
XQuartzが立ち上がっていてもいなくても構いません。最初のxhostコマンドを打つと自動的にXQuartzが立ち上がります。
最初に、XQuartzへのすべてのアクセス制限を復活させます。
$ xhost -
アクセス制限を復活したかを確認します。以下の「access control〜」の1文のみ出力されたら成功。
$ xhost
access control enabled, only authorized clients can connect
次に、localhostからのアクセスのみを許可します。「localhost being added〜」が出れば成功です。
$ xhost + localhost
localhost being added to access control list
因みに、
$ xhost +
は、接続全開放なので、安全上あまりよろしくないとのこと。
XQuartzは立ち上がったままにしてください。
XQuartzを終了すると、localhostからのアクセスのみを許可も終了してしまいます。
12 Jupyterlabをブラウザで開く
ブラウザを開き、URL欄に
localhost:8888
と入力し、Jupyterlabを開きます。(画像はlocalhost:1111になっていますが気にしないでください)
13 JupyterlabでPythonを実行する
Jupyterlabの画面左のサイド画面から「work」フォルダをダブルクリックします。
メイン画面の「Notebook」の「Python 3」ボタンを押すと、新規ファイルが開き、「work」フォルダに格納されます。
このファイルに、以下のコマンドを入力します。
import tkinter as tk
root = tk.Tk()
root.mainloop()
と打ってshift+returnで実行します。
上記のようなウインドウが出たら成功です。
【2022.2.4追加】13-add コンテナを終了したあとは…
コンテナを終了したあとは、Terminalにて必ず以下の処理をしてください。
$ xhost - localhost
localhost being removed from access control list
でれで、XQuartzへのすべてのアクセス制限が復活されます。
14 おわりに―今後の課題
一応Docker内でTkinterを稼働させることができましたが、セキュリティ関係はまだ手付かずです。
Xauthorityの設定方法を調べねばなりません。
コレを今後の課題としまして、精進していく次第です。
参考サイト
- Mac上のdockerでPythonのtkinterを使えるようにする - Qiita
- DockerでPythonの環境構築を行う - すくすくすくらっぷ
- tkinter - インストールまたはセットアップ | tkinter Tutorial
- dockerコンテナにファイルを転送する - Qiita
- Ubuntu on Docker on UbuntuでGUIを表示する方法 - Qiita
- docker 上で Ubuntu に Jupyterlab をインストールして 自分好みの機械学習環境を手に入れる - Qiita
- Docker で JupyterLab を起動し、token 入力なしでアクセスする - Qiita
コメント
コメントを投稿