WSL2+docker+Jupyterと
VS Codeリモート環境の構築
2020.11.3
@Saito56565656
このハンズオン資料について
• WSL2インストール
【参考】https://www.atmarkit.co.jp/ait/articles/2008/31/news023.html
• ssh設定
【参考】https://blog.mihyaeru.com/2020/06/28/wsl2-ssh/
【参考】https://qiita.com/gengen16k/items/18262af0781fd32fc9cd
• Docker Dessktopのインストール
【参考】https://www.docker.com/
【参考】https://qiita.com/KoKeCross/items/a6365af2594a102a817b
• Jupyter-Lab imageのビルドと実行
【参考】https://qiita.com/komiya_____/items/96c14485eb035701e218
【参考】https://qiita.com/ss_33_sss/items/b018e55834f21d1a593d
☞ 理屈はさておき、docker上でJupyter-Lab(Python機械学習環境)の最速立上げ手順
☞ 仮想上directoryとPCフォルダーをbindしwindows上でファイル保存する環境構築手順
☞ VSCodeでのnotebook利用方法
【謝辞】Blog著者の皆様ありがとうございました
説明すること
☞ windows shellとLinuxとdockerの基礎知識、コマンドの役割
☞ VSCodeの初期設定、使用方法
☞ Pythonの文法、基礎知識
説明しないこと(手を動かして自分で調べましょう)
WSL2のインストール
WSLのインストール
• 「コントロールパネル」⇒「プログラムと機能」を開く
• 「Windowsの機能の有効化または無効化」をクリック
• 「Linux用Windowsサブシステム」にチェックを入れて「OK」をクリック
• Windowsを再起動する
【参考】WSL2とは: https://www.atmarkit.co.jp/ait/articles/1906/14/news019.html
Ubuntuのインストール
• Microsft Storeで「wsl」と検索
• 「Ubuntu」を選択して「インストール」
• インストールが完了するとUbuntuが立上るので「UNIX username」「New password」
を入力してユーザー初期設定する
仮想マシン有効化
• 「コントロールパネル」⇒「プログラムと機能」を開く
• 「Windowsの機能の有効化または無効化」をクリック
• 「仮想マシン プラットフォーム」にチェックを入れて「OK」をクリック
• Windowsを再起動する
• コマンドプロンプトより「wsl.exe –l -v」と入力しWSLのVERSIONを確認
• VERSIONは1のはずなので「wsl.exe --set-version Ubuntu 2」と入力
• 「WSL 2を実行するには、カーネルコンポーネントの更新が必要です」が表示されたら、
https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-kernel⇒「wsl_update_x64.msi」
をダウンロードして実行
• 再度「wsl.exe --set-version Ubuntu 2」を実行して「wsl.exe –l -v」でVERSION確認
変らなかったら再起動してVERSION再確認
UbuntuをWSL2用に変換
• 再度「wsl.exe --set-version Ubuntu 2」と入力して下記メッセージが出たら
または「 Windowsの機能の有効化または無効化」で「仮想マシンプラットフォーム」
が表示されない場合、BIOSの仮想化支援機能を有効化する
• BIOSで有効化する項目は
intel CPU: VT-x
VT-d
AMD CPU: AMD-V(UEFI上ではSVM Mode、CPU Configurationにある)
IOMMU(Advanced>AMD CBS>NBIO Common Options等、深い場所)
【参考】
https://jp.finalfantasyxiv.com/lodestone/character/6584870/blog/4364798?order=2
仮想化支援機能の有効化が必要な場合
ssh設定
※ssh接続しなくてもコンテナのVSCodeリモート接続に支障はないが設定しておく
• Ubuntuターミナルを起動して「/etc/ssh/sshd_config」を開く
(nanoならsudo nano /etc/ssh/sshd_config)
• 「PasswordAuthentication」がnoだったらyesにして保存
• 以下のスクリプトをWindowsで起動時実行するバッチファイルとして作成(コピペ可)
wsl -d Ubuntu -u root exec service ssh restart
for /F %%i in (‘wsl -d Ubuntu exec hostname -I’) do set ip=%%i
netsh interface portproxy delete v4tov4 listenport=22
netsh interface portproxy add v4tov4 listenport=22 connectaddress=%ip%
• バッチファイルを任意の場所に保存
WSL2のssh設定①
WSL2のssh設定②
• 「スタートメニュー」⇒「タスクスケジューラー」⇒「タスクの作成」を開く
• 全般タグは、任意の名前を付けて「最上位の特権」をチェック、構成はWindows10
• トリガータグは、新規作成から「タスクの開始」を「スタートアップ時」に設定
• 操作タグは、新規作成から「プログラム/スクリプト」に先ほどのバッチファイルを設定
• 設定タグは、念のため再起動間隔を1分間/3回で設定
Docker Dessktopのインストール
Docker Desktopのインストール
• https://www.docker.com/get-startedより「Windows用にダウンロード」をクリック
• 「Enable WSL 2 Windows Features 」をチェックしたままインストールを続ける
• インストール完了後に「setting」⇒「General」でWSL2 engineが有効なのを確認
• 「setting」⇒「Resources」⇒「WSL INTEGRATION」でUbuntuをonにしてRestart
Jupyter-Lab imageのビルドと実行
Jupyter-Lab imageのビルド
• 作業フォルダを作成し機械学習環境imageをビルドする為のDockerfileを配置
• 作業フォルダに移動してimageをビルド(作業フォルダはDockerfileで指定するdir名)
$ mkdir docker && cd docker
$ sudo nano Dockerfile
$ docker build -t {任意のimageファイル名} . ← . は忘れないように
home
ubuntuのusername
docker
etc
Dockerfile
# ベースイメージ名:タグ名
FROM continuumio/anaconda3:2019.03
# アップグレード・インストール
RUN pip install --upgrade pip && ¥
pip install autopep8 && ¥
pip install numpy && ¥
pip install pandas && ¥
pip install matplotlib && ¥
pip install xlsxwriter && ¥
pip install Keras && ¥
pip install tensorflow
# コンテナ側:{username}はubuntuのusername、user rootの下の{docker}というフォルダをWORKDIRに指定
WORKDIR /home/{username}/docker
# コンテナ側のリッスンポート番号
EXPOSE 8888
# ENTRYPOINT命令はコンテナ起動時に実行するコマンドを指定(基本docker runの時に上書きしないもの)
# “jupyter-lab” => jupyter-lab立ち上げコマンド
# “—ip=0.0.0.0” => ip制限なし
# “—port=8888” => EXPOSE命令で書いたポート番号と合わせる
# ”—no-browser” => ブラウザを立ち上げない、コンテナ側にはブラウザがない
# “—allow-root” => rootユーザーの許可、セキュリティ的に良くないので自分で使うとき限定
# “—NotebookApp.token=‘’” => トークンなしで起動許可、これも警察に怒られる
ENTRYPOINT [“jupyter-lab”, “—ip=0.0.0.0”, “—port=8888”, “—no-browser”, “—allow-root”, “—NotebookApp.token=‘’”]
# CMD命令はコンテナ起動時に実行するコマンドを指定
# “—notebook-dir=/workdir” => Jupyter Labのルートとなるディレクトリを指定
CMD [“—notebook-dir=/home/{username}/docker”]
Dockerfileは以下の{username}を各自書き換えてコピペ作業フォルダ名をdockerにする場合
必要に応じてパッケージは追加・削除
{ }は不要、念のため
Jupyter-Lab imageの実行
• ビルドしたdocker imageを実行する
• 右のメッセージが出たら成功
• ブラウザーで「localhost:8888」と入力し起動を確認
以下の{}内を各自書き換えてコピペ
$ docker run -it -p 8888:8888 --rm --name my-lab --mount type=bind,src=/mnt/c/Users/{winPCのユーザーフォルダ名}/{任意の作業フォルダ
名},dst=/home/{username}/docker {自分がbuildしたコンテナimage名}
src=以下はPC側の作業(保存)フォルダー、ubuntu側からbindで/mnt以下にぶら下がる
dst=以下は仮想マシンの作業(保存)フォルダー、
VS Codeからcontainerへ接続
VS Code拡張機能インストール
• 「 Ctrl-Sihft-x」(拡張機能)から「remote」と入力
• Remote Developmentをインストール
拡張機能の検索窓に
「remote」と入力
インストール
• Ubuntuターミナルでdocker runした状態で
リモートウィンドウボタンをクリック
• Remoto – Container: Attach to Running Container…を選択
コンテナに接続
• 先ほどdocker runしたコンテナが表示されるので選択
コンテナに接続
しばらくすると接続が完了する新しいウィンドウが開く
• 「 Ctrl-Sihft-x」(拡張機能)から「python」と入力
• Python拡張機能をコンテナ上にインストール
コンテナにPythonをインストール
コンテナに接続
• リモートエクスプローラーを開き
PC作業フォルダ(保存先)と仮想作業dirがbindされてるのを確認
リモート
エクスプローラー
Dockerfileで指定したPCフォルダ名
(Source)と仮想作業Dir(Distination)が
表示されていることを確認
作業dirを開く
• エクスプローラーボタンを押して「フォルダを開く」から
Ubuntu上の作業dirに移動する
コンテナをdocker rnした
Ubuntuフォルダ名を入力
エクスプローラー
VS Codeから新しいnotebookを作成
• 「 Ctrl-Sihft-p」(コマンドパレット)から
Python: Create Blank New Jupyter Notebookを選択
• しばらくすると新しいnotebookが立ち上がる
サンプルcode実行
• 適当なグラフを描画してみる
• ↓怒られたら再実行する
sin_wave.py
import wave
import numpy as np
from matplotlib import pylab as plt
import struct
a = 1 # 振幅
fs = 500 # サンプリング周波数
f0 = 5 # 周波数
sec = 5 # 秒
swav = []
for n in np.arange(fs * sec):
# sin波生成
s = a * np.sin(2.0 * np.pi * f0 * n / fs)
swav.append(s)
# 表示
plt.plot(swav[0:100])
plt.show()
ファイルをbind先のPCフォルダに保存
• 名前を付けて保存したら、bindしたPCフォルダでも確認
保存
test_sampleで保存
Docker上の作業dir
PC上の作業フォルダ
VS Codeリモートの切断とコンテナ終了
• リモートを切断してVS Codeを閉じてからdocker imageを停止
クリック
リモート接続を終了後、VS Codeを閉じる Ubuntuターミナルで「Ctrl-C」⇒「y」で
コンテナを停止

WSL2+docker+JupyterとVS Codeリモート環境の構築