TensorFlow DockerイメージをUbuntuに構築し他ホストから接続する
TensorFlowで学ぶ機械学習・ニューラルネットワークなる書籍を購入した。
Dockerのイメージが環境として提供されているので、MacにDocker Desktopをインストールして至極簡単に環境はできた。
ただ、Webアプリケーションかつ、処理を流しっぱなしにするようなことも想定されるので、メインのMacではなく、どの端末からでも利用できるよう書斎にころがっているPCのUbuntuに構築することにする。
仕事の調査などの環境づくりには、最近、Ubuntu + Multipass が瞬間にUbuntuサーバーが構築できて、我が家のネットワークに独立したホストとして加える手順も確立していて非常に便利なのだが、せっかくDockerイメージが提供されているので、そのまま利用したい。また他にもDockerのイメージを試したい。MicroK8s(Kubernetes)とか使えると勉強になると思うのだが、まだハードルが高く完全に目的が変わってきてしまうので、Windows PCを一台潰してUbuntuでDocker環境を作り、他のホストから利用できるようにする。
1.Docker0とかいうブリッジがデフォルト作成される
というので、そちらの方からゴニョゴニョやれば、簡単に疎通できるだろうと思っていたが、ハマった。
/etc/docker/daemon.json に、bip の設定をしたり、あれこれ試行錯誤したが、うまくまとめることができなかった。
ただ、HOSTのUbuntuで、以下のIPパケット転送を許可する設定は必要なのかもしれない(あれやこれややり直したが、ここは元に戻していないので、要否が判断できない)
$ sysctl net.ipv4.conf.all.forwarding net.ipv4.conf.all.forwarding = 0 $ sysctl net.ipv4.conf.all.forwarding=1 $ sysctl net.ipv4.conf.all.forwarding net.ipv4.conf.all.forwarding = 1
2.他ホストからDockerコンテナに接続する目的達成
この辺りを参考にさせていただき、
Dockerコンテナに固定IPを振る – ときどきAnsible日記 (hatenablog.com)
以下の手順で目的を達成
- ホストとなるUbuntuに静的IPアドレスを指定(ゲートウェイとするため)
- Dockerネットワーク(ブリッジ)を作成(ホストIPをゲートウェイとして指定)
- 作成された、ネットワークブリッジを、デバイスと紐付け
- Dockerコンテナ作成時に、作成したネットワークを指定する
一つずつ手順を追っていく。
2.1 ホストとなるUbuntuに静的IPアドレスを指定(ゲートウェイとするため)
ルーターで静的アドレスように確保してあるIP 192.168.0.23 をUbuntu ホストのIPとする
- /etc/netplan に、99-netcfg.yaml というような名前でファイルを作成する
- netplan では、yaml設定ファイルが全てマージされて適用されるようだ
- その時に、頭 2桁の数値が大きい方が優先らしい
- 自分は、UIの画面と設定を共有したいので、renderer: NetworkManager とした。
$ sudo vi /etc/netplan/99-netcfg.yaml network: version: 2 renderer: NetworkManager ethernets: enp1s0f1: dhcp4: no addresses: [192.168.0.23/24] gateway4: 192.168.0.1 nameservers: addresses: [192.168.0.1, 8.8.8.8, 8.8.4.4]
上記でファイルを編集したら、$ sudo netplan apply で適用させる。手元に実物がない場合、接続が切れてしまったりするので、注意。
GUI側にも反映された。
2.2 Dockerネットワーク(ブリッジ)を作成(ホストIPをゲートウェイとして指定)
- shared_nw という名前の Docker network を作成する。docker network サブコマンド で色々操作できる
- br0 という名前でネットワークブリッジを生成
- その時に、ホストのUbuntuの静的IPアドレスをゲートウェイとして指定する
$ docker network create --driver bridge --subnet=192.168.0.0/24 --gateway=192.168.0.23 --opt "com.docker.network.bridge.name"="br0" shared_nw fcdef22003bdc75011a53a8a0e71ec8a992f17b15ce671b8064753548541f53e
- ブリッジの内容を確認する
$ ip addr show br0 6: br0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:d5:99:f5:a0 brd ff:ff:ff:ff:ff:ff inet 192.168.0.23/24 brd 192.168.0.255 scope global br0 valid_lft forever preferred_lft forever
2.3 作成された、ネットワークブリッジを、デバイスと紐付け
- brctlで、ブリッジbr0 と 接続先のデバイス今回の環境では、 enpls0f1 と結びつける(調べ方とかは、こちら)
piroto@darjeeling:~$ sudo nmcli con add type bridge-slave ifname enp1s0f1 master br0 接続 'bridge-slave-enp1s0f1' (5d278e9b-c4c6-4ecb-9709-728fd4d87488) が正常に追加されました。 piroto@darjeeling:~$ sudo nmcli con up bridge-slave-enp1s0f1 接続が正常にアクティベートされました (D-Bus アクティブパス: /org/freedesktop/NetworkManager/ActiveConnection/5) piroto@darjeeling:~$ sudo nmcli con show NAME UUID TYPE DEVICE br0 e9c64cbd-04bb-487b-9f6d-77f6ed863be0 bridge br0 docker0 d470ad37-d29b-4ddf-aef2-ff5b08ce5478 bridge docker0 bridge-slave-enp1s0f1 5d278e9b-c4c6-4ecb-9709-728fd4d87488 ethernet enp1s0f1
2.4 Dockerコンテナ作成時に、作成したネットワークを指定する
試しにubuntu イメージで実行
$ docker pull ubuntu $ docker run -i -t --net shared_nw --ip 192.168.0.22 ubuntu /bin/bash
docker inspect で見ると、ゲートウェイとIPアドレスが指定通りになっている。
ホストUbuntuからのpingも通った。(外部のMacからのpingも通った)ので、tensorflowでも行けそう!
3.TensorFlow(Dockerコンテナ)を試す
イメージをダウンロード
$ docker pull tensorflow/tensorflow:latest
実行する。
と、アクセス用のURLとトークンが表示される。
$ docker run -i -t --net shared_nw --ip 192.168.0.21 tensorflow/tensorflow:latest-jupyter [I 13:56:25.626 NotebookApp] Writing notebook server cookie secret to /root/.local/share/jupyter/runtime/notebook_cookie_secret jupyter_http_over_ws extension initialized. Listening on /http_over_websocket [I 13:56:26.377 NotebookApp] Serving notebooks from local directory: /tf [I 13:56:26.377 NotebookApp] Jupyter Notebook 6.3.0 is running at: [I 13:56:26.378 NotebookApp] http://92ce0f7112eb:8888/?token=deadf022c3f634f84f7efa67b7b37decbfd28a9519e14c75 [I 13:56:26.378 NotebookApp] or http://127.0.0.1:8888/?token=deadf022c3f634f84f7efa67b7b37decbfd28a9519e14c75 [I 13:56:26.378 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation). [C 13:56:26.389 NotebookApp] To access the notebook, open this file in a browser: file:///root/.local/share/jupyter/runtime/nbserver-1-open.html Or copy and paste one of these URLs: http://92ce0f7112eb:8888/?token=deadf022c3f634f84f7efa67b7b37decbfd28a9519e14c75 or http://127.0.0.1:8888/?token=deadf022c3f634f84f7efa67b7b37decbfd28a9519e14c75
指定した、IPアドレス:8888/?token=…. で外部ホストから接続に成功!!