理屈はさておき、Dockerを使って、あっという間にPythonのデータ分析の環境構築をする|WindowsとMacの説明あり

はじめに

こんにちは。キノコードです。

こんにちは、キノコードです。
プログラミングをするとき、環境構築が上手くいかないことがありませんですか?
あるいは、新しくパソコンを買ったときに環境構築が面倒だと感じたことがありませんか?
そういった問題を解決してくれるソフトウェアが、Dockerです。
Dockerは誤解を恐れずにいうと、バーチャル上で使える、新しいパソコンを無料で貰えるようなものです。
バーチャル上というと少しわかりにくいかもしれません。
別の言い方をしてみると、パソコンの中に、もう1つの新しいパソコンを無料で貰えるといったイメージです。
では、なぜDockerがいいのか?
Dockerはフリープランがあり、無料で使うことができます。
高度なことをするための有料プランもありますが、個人で使うのであればフリープランで十分です。
先ほど、無料で新しいパソコンをもらえるという表現をしましたが、私とあなたのパソコンは同じです。
同じパソコンなので、手順通り進めればうまくいかないということがありません。
Dockerは、バーチャルで使えるパソコンです。なので、ネットを経由して持ち運べます。
したがって、自分の作った環境と同じ環境を、会社のパソコン、新しく買ったパソコンで構築することができます。
また、Dockerはバーチャルなものなので、環境構築が上手くいかなくなった時や捨ててやり直せばよいですし、必要なくなった時にいつでも捨てることができます。
このDocker。今やエンジニアの必須のツールとなっています。
この動画では、Dockerの細かい理屈は置いておいて、最速でPythonのデータ分析の環境構築する方法について説明したいと思います
理屈はいいからDockerを使ってみたい、環境構築がうまくいかないからDockerを使ってみたいという方にお勧めです。
この動画のゴールは、WindowsとMac上に、UbuntuというLinuxのOSを立てて、そこにAnacondaをインストールします。
そして、Pythonでのデータ分析の環境として有名なJupyterLabを立ち上げるまでをやってみます。
Dockerのインストールが完了すれば、環境構築が5分以内で完了します。
なお、理屈をしっかり説明した動画も別途アップしますのでチャンネル登録をしてお待ちいただければと思います。
それでは、パソコン画面に切り替えてレッスンを進めていきます。

DockerToolBox

Dockerのインストール方法を説明する前に、Windowsユーザーに注意点です。
Windows 10 ProまたはWindows 10 Enterpriseの場合は、そのまま「Docker for Windows」を使用することができます。
Windows 10 Homeで、OSのバージョンが「バージョン 2004、ビルド 19041 以上」の場合は、WSL2というソフトをインストールすることで、「Docker for Windows」を使用することができます。
それ以外のWindows PCの場合は、64bitのWindows 7以降の場合、 「Docker Toolbox」をインストールすることでDockerを利用することができます。
私のパソコンは、Windows10Homeです。
しかし、WSL2の設定は難しいので、この動画では、設定が簡単なDockerToolboxを使ってインストールをします。
DockerToolboxの設定を進めていきましょう。
このURLにアクセスし、このファイルをダウンロードしましょう。URLは概要欄に貼っておきます。

Docker for Mac」または「Docker for Windowsのインストール方法

次に、MacまたWindows10ProとEnterpriseをお使いの方は、「Docker for Mac」または「Docker for Windows」をダウンロードします。
まずはこのURLにアクセスし、Get Startedをクリックしましょう。
Docker Desktopをダウンロードしましょう。
またDockerアカウント作成することでDocker Hubを使用することができるので、余力があれば登録してもいいでしょう。
私はWindows10Proをもっていないので、Macでのインストールを進めていきます。
ダウンロードしたインストーラーに従い、インストールを進めていきます。
このアイコンをクリックすると、チュートリアルなどを表示することができます。
問題なくインストールが完了したら、ターミナルやコマンドプロンプトを開き、「docker run hello-world」というコマンドを実行します。
「Hello from Docker!」と表示されたら成功です。
これでdockerの準備が完了しました。

Dockerfileの用意

ここからは実際にJupyterLabを実行できる環境を作っていきます。
デスクトップに「MyDocker」というフォルダを作りましょう。
そのフォルダにDockerfileというものを作ります。
Dockerは、コンテナという箱のようなものにOSやソフトウェアがインストールされた環境を閉じ込めておくと冒頭に説明しました。
このコンテナは、Dokcerfileからイメージというものを作成し、イメージからコンテナを作ります。理屈はさておき、構築を進めます。

Dockerfileは、さくらエディタ、VSCode、SublimeTextなどエディタを使って、このように記述します。
ここには、DockerコンテナにLinuxのubuntuを立てて、そのubuntu上にAnacondaをインストールする記述がされています。
このDockerfileは、キノコードのサイトから無料でダウンロードできるので、ダウンロードしてください。
ダウンロードできるファイルには、コメントアウトでコードの意味について簡単に説明を加えています。
ご興味がある方はお読みください。
さて、ご自身で気合で入力した方は、ファイル名をDockerfileとしましょう。
拡張子はつけなくてよいです。

イメージの作成

では、このdockerfileからイメージを作成しましょう。コマンドプロンプトかターミナルを開きましょう。
まず、このフォルダにDockerfileがあるか確認をしましょう。

ls /Users/kinocode/Desktop/MyDocker
dir C:¥¥Users¥¥KinoCode¥¥Desktop¥¥MyDocker

macの方はこのソースコード、windowsの方はこのソースコードを実行してください。
Dockerfileと返ってきたらオッケーです。

docker build -t jlab:latest /Users/kinocode/Desktop/MyDocker
docker build -t jlab:latest C:¥¥Users¥¥KinoCode¥¥Desktop¥¥MyDocker

Dockerfileからイメージを作成しましょう。Dockerfileからイメージを作ることをビルドといいます。
ビルドをしていきましょう。
docker build -t jlab:latest そのあとにDockfileを保存してあるディレクトリを入力してください。
今回はコンテナ名をjlabという名前にしましたが、お好きな名前に設定して頂いてよいです。
エンターを押して実行です。あとは自動でイメージが作成されるのを待ちましょう。Dockerが環境構築してくれます。便利ですよね。
「Successfully built」と表示されたら完了です。

docker images

それでは作成したイメージの一覧を表示するコマンドを実行してみましょう。
REPOSITORYという項目に「jlab」という名前のイメージがあれば問題ありません。
このとき作成したイメージのIMAGE IDをメモしておいてください。
続いて作成したイメージからコンテナを作成しましょう。

コンテナの作成、実行

docker run -p 8888:8888 -v /Users/kinocode/Desktop/mydocker:/workspace --name jlab IMAGE ID
docker run -p 8888:8888 --name jlab IMAGE ID

macの方はこのソースコード、windowsの方はこのソースコードを実行してください。
macの方は、マウントをしたいフォルダがあれば-vとパスの記述をしてください。
マウントとは、簡単にいってしまうと、あなたのパソコンのフォルダとDockerコンテナのフォルダの同期をするということです。
つまり、マウントをしておけば、あなたのパソコンのフォルダ内でファイルを作れば、Dockerコンテナでもみたり操作することができるし、反対にDockerコンテナ内で作ったファイルもあなたのパソコンでみたり操作することができます。
ここでは、DockerfileをおいたデスクトップのフォルダであるMyDockerのマウントします。
-vを書き、コロンより左側があなたのパソコンのフォルダ、つまり、ディクトリ名を書き、コロンより右側がDokcerコンテナ内のディレクリ名を記述します。
ちなみに、WindowsのDockerToolboxでは、この設定がかなり面倒です。
そのため、今回は、WinodwsではマウントをせずにDokcerの設定をして、Dockerコンテナ内のファイルを、あなたのパソコンにコピーする方法などをこの動画の最後に説明します。
さて、話を戻してコンテナ作成の方法です。
IMAGE IDには先程メモしたIMAGE IDを記述してください。
エンターを押して実行をしましょう。

I 13:14:32.098 LabApp] Writing notebook server cookie secret to /root/.local/share/jupyter/runtime/notebook_cookie_secret
[W 13:14:32.548 LabApp] All authentication is disabled.  Anyone who can connect to this server will be able to run code.
[I 13:14:32.569 LabApp] JupyterLab extension loaded from /opt/anaconda3/lib/python3.7/site-packages/jupyterlab
[I 13:14:32.570 LabApp] JupyterLab application directory is /opt/anaconda3/share/jupyter/lab
[I 13:14:32.575 LabApp] Serving notebooks from local directory: /
[I 13:14:32.576 LabApp] The Jupyter Notebook is running at:
[I 13:14:32.576 LabApp] http://8cd732fac69b:8888/
[I 13:14:32.576 LabApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[W 13:14:32.583 LabApp] No web browser found: could not locate runnable browser.

上記の表示が出たら完了です。下記のURLにアクセスして、JupyterLabのログイン画面が表示されたら成功です。
あなたのパソコンのデスクトップのフォルダMyDockerをマウントしているので、Dockerコンテナ内のディクトリworkspaceを開くと新しく作られたディレクトリなのに、Dockerfileがあります。
つまり、あなたのパソコンとDockerコンテナ内のフォルダが同期されています。
http://localhost:8888/
jupyterLabを閉じます。Pandas入門コースで説明しましたが、JupyterLabの閉じ方は、controlとCでした。controlとCを入力します。

lsof -i:8888

アクセスに失敗した場合は、ポートが衝突している可能性があります。
Macであれば「lsof -i:8888」、Windowsであれば「netstat -na」に入力、他の動作中のプログラムが8888というポートを使っていないか調べましょう。

kill -9 [process id]

動作中のプログラムが8888を使っていて、そのプロセスを止めて問題ないようであれば、「Kill」コマンドでそのプログラムを止めましょう。
止めてはまずいプログラムの場合は、JupyterLabのポートを変更しましょう。
JupyterLabのポートの変更方法についてみていきましょう。

docker ps (←コンテナIDを確認)
docker rm コンテナID
docker run -p 8890:8888 -v /Users/kinocode/Desktop/mydocker:/work --name jlab e9213c63180d

先ほどは8888のポートを使いましたが、
例として8890を使用しましたが、使われていないポートであれば何でも大丈夫です。
8890を使用した場合は http://localhost:8890/ にアクセスしましょう。
WindowsのPCで、Docker toolboxを使用している場合はURLを変える必要があります。
特にホスト名を変えていなければ http://192.168.99.100:8888 でアクセスできるはずです。
せっかくなので作成したコンテナをコマンドで操作してみましょう。
まずは作成したコンテナの情報を見てみましょう。

docker ps

これは起動中のコンテナの一覧を表示するコマンドです。
コンテナ自身のユニークIDや元となっているイメージのID、作成された時間などが表示されています。
続いて起動したコンテナを止めてみましょう。

docker stop jlab

これは指定したコンテナを止めるコマンドです。
名前でなくてもコンテナIDでも可能です。
続いて先程のコンテナの一覧を表示するコマンドを再度打ってみましょう。

docker ps

起動しているコマンドがない状態だと何もコンテナが表示されませんね。
では -a オプションを付けてみましょう。

docker ps -a

これは起動していないコンテナも全て一覧表示させるコマンドです。
-aのaはallを表します。
止めたコンテナを再度起動してみましょう。

docker start  jlab

これは作成済みのコンテナを、名前を指定して起動するコマンドです。
名前でなくてもコンテナIDでも可能です。
続いて作成したコンテナの内部に入ってみましょう。

docker exec -it jlab bash

これは起動したコンテナの内部に、名前を指定して入るコマンドです。
名前でなくてもコンテナIDでも可能です。
コンテナの内部にログインすることで、新たに必要なパッケージをインストールしたり、ソースコードをダウンロードしたりすることができます。
例えば、pip install tensorflowといったことができます。
コンテナから出る時はこちらのコマンドです。

exit

exitは出口という意味ですね。
もし仮にコンテナ内部で失敗してしまっても、コンテナを削除して再度イメージから作り直せばまっさらな状態のコンテナを作り直すことができます。
安心ですね。
コンテナを削除するコマンドはこちらです。

docker rm コンテナID

こちらはコンテナIDを指定する必要があります。
続いてはイメージを削除してみましょう。
先程メモしたイメージのIDを使って下記のコマンドを入力してください。

docker rmi [イメージID]

イメージの一覧を確認してみましょう。

docker images

確かに消えていますね。

docker cp jlab:/workspace/test01.ipynb C:¥¥Users¥¥KinoCode¥¥Desktop¥¥MyDocker

最後に、windowsのDockerToolboxを使っている方へ、コンテナ内のファイルをコピーする方法などについて説明します。
macの方も使えるDockerコマンドになります。
Dokcerに詳しくなりたい方はご覧になってください。
まず最初に、コンテナにあるファイルを、あなたのパソコンにコピーする方法です。
コンテナのディレクトリworkspaceにあるtest01というファイルを、あなたのパソコンのデスクトップのフォルダMyDockerにコピーをしましょう。
まず、コンテナ名かコンテナIDを記述します。今回はコンテナ名のjlabと書いてコロン。
そして、コピーもとのディレクトリとファイル名を書きます。
次の半角スペース。ここは忘れずにあけましょう。
その次に、コピー先のディレクトリを書きます。
エンターを押して実行です。
コピーされています。
macやLinuxのUbuntuの場合は、ディレクトリの区切りはスラッシュでよいですが、Windowsの場合は基本的にはエンマーク2つを書きます。

docker cp C:¥¥Users¥¥KinoCode¥¥Desktop¥¥MyDocker¥¥test03.ipynb jlab:/workspace/

次は、あなたにパソコンにあるファイルを、コンテナ内にコピーする方法です。
test03のファイルをコンテナにコピーしましょう
書き方は、先ほどの記述を逆にしてあげればよいです。
あなたのパソコンのディクトリとファイル名、半角スペースをあけてコンテナ内のディレクトリを書きます。l
エンターで実行です。

docker cp jlab:/workspace/. C:¥¥Users¥¥KinoCode¥¥Desktop¥¥MyDocker¥¥

次に、コンテナ内のディレクトリにあるファイルのすべてを、あなたのパソコンにコピーする方法についてみていきます。
ディレクトリを書いてスラッシュ。そのあとにピリオドを書きましょう。ピリオドはすべてという意味です。そのため、ピリオドを書けば、ディレクトリにあるファイルすべてをコピーできます。
コピー先は、あなたのパソコンのデスクトップにあるフォルダMyDockerにコピーをしましょう。
実行します。
ファイル全てがコピーされています。

docker cp C:¥¥Users¥¥KinoCode¥¥Desktop¥¥MyDocker¥¥. jlab:/workspace/

次は、反対に、あなたのパソコンにあるすべてのファイルを、コンテナ内のディレクトリにコピーする方法です。
記述方法は逆にするだけで良いだけです。
あなたのパソコンのディクトリを書いて、エンマークを2つ。そして、ピリオドです。ピリオドは見えにくいですが忘れないようにしましょう。
半角スペースのあとに、コピー先のコンテナ内のディレクトリを書きます。
エンターで実行します。
コピーされています。
ちなみに、macの場合は、マウントしているので、コンテナで作ったファイルは、あなたのパソコンでも見たり操作することができるし、
逆に、あなたのパソコンで作ったファイルは、コンテナ内にも反映されます。
このようにmacの方がDockerを使う上では便利です。

レッスンで使ったファイルはこちら

■保存方法
Mac:右クリック⇒「リンク先を別名で保存」
Windows:右クリック⇒「名前を付けてリンク先を保存」
※ダウンロードするときに、拡張子がデフォルトで「txt」に設定されます。
 「ファイルの種類」で「全てのファイル」を選択し、
 「Dockerfile.txt」の「.txt」を削除してからダウンロードしてください。