タイトルの通りVirtualBox上のUbuntuでTensorflowとJupyter notebook用コンテナをインストールした時のメモです。
何番煎じかわかりませんがメモとして残しておきます。
環境
-
- Windows 10 pro 1809
-
- VirtualBox 6.0.4
-
- Ubuntu 18.04.2
- Docker 18.09.2
母艦PCにはWindows10 Proを使用していて、そこでVirtualBoxにUbuntuをいれて、UbuntuにDockerをインストールしています。
docker on VirtualBox on Windowsな環境で動かしています。
インストール
tensorflowをjupyter環境のあるコンテナをダウンロードしてきます。ダウンロード後docker imagesコマンドで確認するとイメージが存在することがわかります。
~$ docker pull jupyter/tensorflow-notebook
:
Status: Downloaded newer image for jupyter/tensorflow-notebook:latest
~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
jupyter/tensorflow-notebook latest 5246106207ee 18 hours ago 4.78GB
コンテナの起動
サーバとして動かしたいので-dオプションを付けます。-p 8088:8888はホスト側(Ubuntu)の8088番ポートにアクセスするとコンテナの8888番ポートにフォワーディングするようにします。–name jupyterはコンテナにjupyterという名前を付けます。-v /home/yoshi/docker/jupyter:/home/jovyan/workはホストの/home/yoshi/docker/jupyterをコンテナの/home/jovyan/workにマウントします。ホスト側は好きなディレクトリで良いですが、コンテナ側はこのディレクトリにしてください。–nameと-vオプションは必要ない場合はつけなくても大丈夫です。
docker runで起動した後docker ps -aコマンドでコンテナが実行されていることが確認できます。
~$ docker run -d --name jupyter -p 8088:8888 -v /home/yoshi/docker/jupyter:/home/jovyan/work jupyter/tensorflow-notebook
9e16f3294d6baf1a9beb650024ea5cc91acc2663fbd580907efe8cde79bcbe78
~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9e16f3294d6b jupyter/tensorflow-notebook "tini -g -- start-no…" About a minute ago Up About a minute 0.0.0.0:8088->8888/tcp jupyter
セキュリティトークンの取得
jupyter notebookはセキュリティトークンが設定されていてアクセス制限されているため、docker exec <コンテナID> jupyter note book listコマンドでトークンを取得します。?token=以下の文字列がトークンになりJupyter notebookにアクセスするときに必要になります。
~$ docker exec 9e16f3294d6b jupyter notebook list
Currently running servers:
http://0.0.0.0:8888/?token=c45fe6b415b5ecd82a4c7eb5cd91e6080b66239c9d156f38 :: /home/jovyan
VirtualBoxのポートフォワーディング
windowsからアクセスするためVirtualBoxのポートフォワーディングの設定が必要になります。windowsの8008番ポートにアクセスするとUbuntuの8088番ポートにポートフォワーディングするようにします。
VirtualBox マネージャー–>設定–>ネットワーク–>高度の三角マークを押すとポートフォワーディングのボタンが登場するので押します。
基本好きな値で良いですが次のように設定します。名前は何でも良いのでjupyterで、プロトコルはTCPでホストIPはローカルアドレスの127.0.0.1。ホストポートは8008で、これはjupyter nootbookにアクセスするときにこの値をブラウザに指定します。ブラウザで指定する値と同じにすればwell known portを除けばなんでも良いです。ゲストIPはUbuntu上でip aで調べた値を入れます。ゲストポートはdocker runする時に指定した値と同じ8088にする必要があります。
~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 08:00:27:7e:e7:dd brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic enp0s3
valid_lft 80494sec preferred_lft 80494sec
inet6 fe80::a00:27ff:fe7e:e7dd/64 scope link
valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:77:6c:2c:ae brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:77ff:fe6c:2cae/64 scope link
valid_lft forever preferred_lft forever
25: veth3b86037@if24: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether 26:df:bc:10:5b:49 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fe80::24df:bcff:fe10:5b49/64 scope link
valid_lft forever preferred_lft forever
jupyter notebookにアクセス
docker execコマンドを実行した時に表示された、後ろにトークンが付いたアドレスをアドレスを127.0.0.lに変更して、ポート番号をVirtualBoxのポートフォワーディングの設定でホストポートに指定した値8008に変更してアクセスします。
すると次のようにページが表示されました。ばんざーい(^^)/
ポンチ絵
雑ですがポンチ絵で表すとポートフォワーディングの様子はこんな感じです。Jupyter notebookの8888は固定ですがVirtualBoxとWindowsのポートは好きなポートに変更して大丈夫です。