Dockerを使ったデータ解析環境の構築(個人的備忘録)

## Dockerfileの作成
```dockerfile:Dockerfile
FROM ubuntu:latest
# -yはインストールの際全てyesで答え、インストールする
RUN apt-get update && apt-get install -y \
# ubuntu上でroot以外のユーザーがroot権限でコマンドを打ちたい時に使用
	sudo \
# httpを使ってデータをダウンロードする
	wget \
# エディター
	vim
# anacondaのインストローラの保存場所
WORKDIR /opt
# anacondaのインストローラをダウンロードする。
RUN wget https://repo.continuum.io/archive/Anaconda3-2019.10-Linux-x86_64.sh
```
**apt-get**はubuntuのパッケージ管理ツールで、「\」区切りでパッケージを分けて記述すると、何がインストールされているのかが分かり易い

##Dockerfileでコンテナのビルド
```haml
-#これでubuntuのパッケージと、optディレクトリの中にanacondaのインストローラがダウンロードされる。
% docker build .
-# 作成したコンテナの起動
% docker run -it コンテナID bash
-# optになっているのは「WORKDIR /opt」の指定があるため
-# インストローラがあることを確認する。
root@85a5e79aa6c2:/opt# ls
Anaconda3-2019.10-Linux-x86_64.sh
-# インストローラの実行
# sh Anaconda3-2019.10-Linux-x86_64.sh
```
1.エンターを押し続ける
2.yesと答える
3.どこにインストールするか聞かれるので/opt/anaconda3とする
4.init(初期化)するか聞かれるので、yesと答える
5.**「Thank you for installing Anaconda3!」**と表示されたらダウンロードされている。
しかしながら**パスを通していない**ため、「python」は使えない。
##パスを通すとは
環境変数$PATHに、パスを追加することでコンピュータがプログラムをそのパスから探してきてくれる。
##環境変数の確認

```
# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
```
##pythonを探す
```haml
-# 「anaconda3」ディレクトリに移動
# cd anaconda3
-# 「bin」ディレクトリに移動
# cd bin
-# 「python」の起動
# ./python
-# パスの確認
# pwd
```
Pythonが起動したのが確認できる。つまりパスを通すとは「/opt/anaconda3/bin」を通す。
## パスを通す
```haml
-# pythonから出る。
>>> exit()
-# パスの追加(=の両隣に半角スペースは無し)
# Export PATH=/opt/anaconda3/bin:$PATH
-# パスの確認
# echo $PATH
-#/opt/anaconda3/binが追加されていることがわかる。
/opt/anaconda3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
-# 「opt」に移動
# cd /opt
-# pythonの起動確認
# python
```
パスを通したことにより、Pythonが「opt」ディレクトリでも起動したことがわかる。

##インストローラのオプションの確認
```haml
-# sh -x インストローラのファイル
# sh -x Anaconda3-2019.10-Linux-x86_64.sh
```
Anaconda2-2019.10-Linux-x86_64.shに使えるオプションが表示され今回は**-b**と**-p**を使う。
**-b**はバッチモードで起動。Dockerfileで使う場合に使用。インタラクティブな操作を回避する。
**-p**はデフォルトは**「/root/anaconda3」**で、指定することで任意の場所にインストールできる。
再度「anaconda3」を消してインストールできるか確認する。

```haml
-# anaconda3の削除
# rm -r anaconda3/
-# インストローラからダウンロード及びoptディレクトリ内にanaconda3の作成
# sh Anaconda3-2019.10-Linux-x86_64.sh -d -p /opt/anaconda3
```
異常なくダウンロードされたことが確認できる。

##Dockerfileの更新
```dockerfile:Dockerfile
FROM ubuntu:latest
RUN apt-get update && apt-get install -y \
    sudo \
    wget \
    vim
WORKDIR /opt
#------------ここから変更------------#
RUN wget https://repo.continuum.io/archive/Anaconda3-2019.10-Linux-x86_64.sh && \
# インストローラからダウンロード及びoptディレクトリ内にanaconda3の作成
    sh https://repo.continuum.io/archive/Anaconda3-2019.10-Linux-x86_64.sh -b -p /opt/anaconda3 && \
# インストローラーの削除
    rm -f Anaconda3-2019.10-Linux-x86_64.sh
# パスを通す$PATHは自己参照
ENV PATH /opt/anaconda3/bin:$PATH
# 「pip」はpythonのパッケージを管理するツール
RUN pip install --upgrade pip
CMD [ "jupyter","lab","--ip=0.0.0.0","--allow-root","--LabApp.token=''" ]
```
## Dockerfileでコンテナのビルド
```
% docker build .
% docker run -p 8888:8888 作成したコンテナID
```
これでコンテナにjupyterlabが立ち上がり、localhost:8888で接続できることが確認できる。

##ファイルシステムの共有
```haml
-# どこでもいいので共有するファイルを作成する
% mkdir ds_python
-# 共有するファイルのパスの確認
% pwd
-# コンテナの共有ファイルは今回は「work」ディレクトリとする。コンテナ名は「my-lab」
% docker run -p 8888:8888 -v 共有するファイルのパス:/work --name my-lab 作成したimage名
```
localhost:8888で確認し、「work」ディレクトリが作成されていることを確認する。
jupyterlabでworkディレクトリで何かしらファイルを作成し、ホスト側の「ds_python」ファイルの中身を確認し、jupyterlabで作成したファイルが存在していることを確認する。