【Docker入門】〜jupyter lab起動までの最短解説〜

#はじめに
この記事では、docker初心者がjupyter labの起動まで最速で到達することを目的としております。
containerやimageなど、dockerの専門用語の深い話は飛ばされているので、気になる部分は適宜ググってみてください。

記事を読んで参考になったと思った方は、LGTM押していただけると幸いです！

#前提
・mac環境で実施しております

#目次
1. 環境構築の作業全体像
2. dockerインストール
3. Dockerfile作成
4. image作成
5. container作成
6. 環境の削除

#1. 環境構築の作業全体像
Dockerでの環境構築の基本的な流れは、以下の通り
1. Dockerfileの作成
2. imageの作成
3. containerの作成&起動

それぞれ一言で解説すると

|用語|一言解説|参考URL|
|:---|:---|:---|
|Dockerfile|構築する環境の設計書<br>(このファイルを見ればどんな環境なのか一目でわかります)|[Dockerfile のベストプラクティス](https://docs.docker.jp/engine/articles/dockerfile_best-practice.html)|
|image|環境情報を持つ複製可能な環境ファイル<br>(1つのimageでたくさんの環境を作ることができます）|[Dockerイメージの理解を目指すチュートリアル](https://qiita.com/zembutsu/items/24558f9d0d254e33088f)|
|container|imageから生成された環境インスタンス<br>(トライアンドエラーで環境を立てたり潰したりできます)|[Dockerコンテナの作成、起動〜停止まで](https://qiita.com/kooohei/items/0e788a2ce8c30f9dba53)|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/861809/728cb0fd-3473-df63-3de6-61c5cdaa2e57.png)
概略図（https://docs.docker.jp/engine/understanding-docker.html）
※クライアントが「Dockerfile」を持っており、それを用いて「image」を「build」します。

#2. dockerインストール
docker hubに登録して、トップページの「Get start with Docker Desktop」からdesktopバージョンをダウンロードする
https://hub.docker.com/
![スクリーンショット 2020-11-22 21.09.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/861809/31b08394-f8f2-7872-c69c-f074b7026e99.png)

#3. Dockerfileの作成
Desktopにdockerディレクトリを作成し、その中に以下のDockerfileを作成します

```Dockerfile:Desktop/docker/Dockerfile
#anaconda3のimageをdockerhubからpullする（https://hub.docker.com/r/continuumio/anaconda3）
#このimageは、ubuntuOSにanaconda3をセットアップした環境
FROM continuumio/anaconda3:2020.07

#jupyterの設定ファイルに変更を加える（この設定を加えないとjupyter-labが起動しません）
RUN jupyter notebook --generate-config
WORKDIR /root/.jupyter
RUN echo 'c.NotebookApp.allow_root = True' >> jupyter_notebook_config.py && \
    echo 'c.NotebookApp.ip = "0.0.0.0"' >> jupyter_notebook_config.py && \
    echo 'c.NotebookApp.token = ""' >> jupyter_notebook_config.py && \
    echo 'c.NotebookApp.port = 8888' >> jupyter_notebook_config.py && \
    echo 'c.NotebookApp.open_browser = False' >> jupyter_notebook_config.py
#セキュリティー設定については以下のURL参照
#https://jupyter-notebook.readthedocs.io/en/latest/security.html#server-security
#https://qiita.com/SaitoTsutomu/items/aee41edf1a990cad5be6

#作業用ディレクトリを作成する
RUN mkdir -p /home/work
WORKDIR /home/work

#デフォルトコマンドを設定する（containerが起動した時に実行されるコマンド）
CMD [ "jupyter", "lab"]
```
　
**Dockerfile 命令一覧**

|命令|一言解説|
|:---|:---|:---|
|FROM|docker hubからimageをpullする<br>(localに該当のイメージがある場合はpullは行われない)|
|RUN|linuxコマンドを実行する<br>(pullしたimageの環境内でコマンドを実行し、環境のカスタマイズを行う)|
|WORKDIR|カレントディレクトリを変更する<br>(linuxのcdコマンドでは、移動は一時的なため注意)|
|CMD|デフォルトコマンドを設定する<br>（containerが起動した時に実行されるコマンド）|
そんなにコマンドの数は多くないので、気になる方はその他も調べてみてください
（http://docs.docker.jp/v17.06/engine/reference/builder.html）

#4. image作成
以下の通りコマンドを実行して、imageの作成＆確認を行う

imageの作成

```bash
#Dockerfileのあるディレクトリに移動
cd desktop/docker/Dockerfile
#カレントディレクトリを指定して、imageをbuildする(-tのオプションでimageの名前を指定する)
docker build . -t anaconda-env
```

作成したimageの確認

```bash
docker images
REPOSITORY      TAG       IMAGE ID            CREATED             SIZE
anaconda-env    latest    8aacbb4fe3dc        10 hours ago        2.76GB
```
以上のように表示されていれば、imageの作成完了

#5. container作成
最後に、container作成を行うことでjupyter-labの実行環境の作成完了です！
以下のコマンドを順に入力してください

```bash
#ローカルホスト側に保存する用のディレクトリを作成する
mkdir volume
#コンテナを作成する
docker run -v $(pwd)/volume:/home/work -p 1111:8888 --name anaconda-container  -it anaconda-env
```
オプション解説

|オプション|解説|
|:---|:---|
|-v|・container内部の一部ディレクトリの保存先をローカルに指定する<br>・上記コマンドでは、コンテナ：/home/workへの保存は、ホスト：volumeに保存されます<br>・コンテナを削除しても、データが消えないため、ソースコードや学習データをこのディレクトリで管理します<br>・絶対パスで指定する必要があるため、$(pwd)によってカレントディレクトリを代入しています|
|-p|localhostとcontainer内のポートの繋ぎ込みを表します<br>(上記指定の場合、localhostの1111ポートに接続した時に、container内の8888ポートに接続する）|[Dockerイメージの理解を目指すチュートリアル](https://qiita.com/zembutsu/items/24558f9d0d254e33088f)|
|--name|生成するcontainerの名前を決めます|
|-it|おまじない<br>(-i:コマンドラインからの入力を受け付ける、-t:コマンドラインの表示を綺麗にする、これらの組み合わせ)|


上記コマンドを実行すると、jupyter-labが起動するので、以下URLにアクセスしてください
http://localhost:1111

jupyter-lab画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/861809/6b5814b1-df09-6259-d254-5a6d2d776880.png)

ここまでで、dockerによるjupyter-labの起動は完了です！お疲れ様でした！

---

この章の最後に、作成したコンテナの状態を確認します
linux画面に戻って、下図のjupyter-labを起動している状態から、**「ctrl+p+q」**でコンテナから一時的に抜け出します。（コンテナは停止されません）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/861809/183ac39c-5b1d-259f-019c-f30a79d2e70b.png)
下記コマンドでコンテナが起動されていることがわかります

```bash
#containerの状態を確認する
docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
22093b0f68f1        anaconda-env        "jupyter lab"       25 minutes ago      Up 25 minutes       0.0.0.0:1111->8888/tcp   anaconda-container
```

ちなみにコンテナの停止と実行は、以下コマンドで実行可能です

```bash
docker stop anaconda-container

#containerの停止(Exited)を確認(-aで停止中のコンテナも確認できる)
docker ps -a
CONTAINER ID        IMAGE           COMMAND          CREATED             STATUS                      PORTS         NAMES
22093b0f68f1        anaconda-env    "jupyter lab"    37 minutes ago      Exited (0) 26 seconds ago                 anaconda-container
```

再度起動したい場合は、以下のコマンドを実行してください

```bash
docker start anaconda-container
#juypter-labを起動する場合
docker exec -it anaconda-container jupyter lab
#環境のCUIに接続する場合(conda install等をしたい場合)
docker exec -it anaconda-container bash
```

#6. 環境の削除
以下の手順でcontainerとimageを削除します

```bash
#停止しなければ、コンテナは削除できない
docker stop anaconda-container
#containerの削除
docker rm anaconda-container
#imageの削除
docker rmi anaconda-env
```
　
Dockerfileでimageを作成する時に、セーブポイントとしてchasheが残されています(DockerfileのRUNの命令ごとにchashが生成されます)
chasheは、Dockerfile生成時にミスがあってもセーブポイントまではchashを再利用できるように保存されています
知らぬ間に、chasheが容量を圧迫するケースがあるのでこちらの削除もお忘れなく

```bash
#キャッシュの削除
docker builder prune
```

#さいごに
ここまで一通り流しましたが、意外とすんなり環境構築ができたのではないでしょうか？？
dockerになれてしまえば、煩わしい環境構築はDockerfileで自動化できますし、他PC・サーバーへの移行も容易です。
データ分析・AI開発やweb開発の環境構築のスタンダードとなっているようなので、押さえておいて損はないはずです。
細部の解説をかなり飛ばしているので、網羅的に勉強したい方はぜひ参考資料で学んでみてください！（特にudemyの講座はオススメです！）

記事を読んで参考になったと思った方は、LGTM押していただけると幸いです！

##参考
・Docker超入門
https://datawokagaku.com/whatisdocker/
・udemy講座(網羅的に勉強したい方はこちらおすすめです)
https://www.udemy.com/course/aidocker/