---
# System prepended metadata

title: Case Study(docker)

---


# Case Study(docker)

#### Pythonの環境を用意して、必要なライブラリもインストールする.
ここでは、以下の環境をdockerで用意します.
- Python3.8をUbuntu上に用意.
- 必要なライブラリ（numpy, scipy, etc)を用意.

##### 用意するもの.
- Dockerfile
- requirements.txt(pythonのライブラリインストールのため)

Dockerfileについて.
[Docker Hub](https://hub.docker.com/_/python)からベースのimageを取得.
```Dockerfile:Dockerfile
FROM  python:3.8
USER root

RUN apt-get update
RUN apt-get -y install locales && \
    localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8
ENV TZ JST-9
ENV TERM xterm

COPY requirements.txt ${PWD}  

RUN apt-get install -y vim less
RUN pip install --upgrade pip
RUN pip install --upgrade setuptools
RUN pip install -r requirements.txt
```

requirements.txtは
```txt:requirements.txt
numpy==1.18.5
```


以上で、準備は整いました.

では、まずimageを作りましょう.
```
$ docker build --rm -t python3_env .
```
すると、
```
$ docker images 
REPOSITORY                                            TAG                 IMAGE ID            CREATED             SIZE
python3_env                                           latest              dd150cb7e12c        18 seconds ago      1.07GB
```
`python3_env`というimageが作成されていることが確認できます.

次に、今作成したimageを用いて、containerを作ります.
```
docker run -it -v $PWD:/root/opt --name python3 python3_env:latest /bin/bash
```
- `-i` :ホストマシンとコンテナの双方向に接続できるようにします.
- `-t` :コンテナ内に擬似的なターミナルを割り当てします.
- `-name` :コンテナに名前をつけます.
- `-v` :ホストにあるファイルをコンテナ内にマウントします. {ホストのパス}:{コンテナのパス}

オプションの詳細は、[公式のページ](https://docs.docker.com/engine/reference/commandline/run/)を参考にしてください.

これでcontainerが作成されました. 確認してみましょう.
```
$ docker ps -a
CONTAINER ID        IMAGE                                                        COMMAND                  CREATED             STATUS                      PORTS                                                                    NAMES
5dbc62a11213        python3:latest                                               "/bin/bash"              7 seconds ago       Exited (0) 6 seconds ago                                                                             python3
```
ちゃんとできています. まだ作っただけなので、動かしてみましょう.
```
docker start -i python3
```
or
```
docker start -i 5dbc62a11213
```
すると、
```
root@5dbc62a11213:/# 
```
できました. これでインターラクティブにやり取りできます.

#### `docker-compose.yaml`に書こう.
上記のdockerコマンドの引数が非常に長くなってしまい、見にくいだけではなく何度も実行するのは面倒です. また複数のcontainerをまとめて動かしたいこともあります. そんな時にはdocker-compose.

先ほどのコマンドを`docker-compose.yml`に以下のように書くことができます.

その後、以下のコマンドを打つだけで、全く同じことをできます.
```
$ ls 
Dockerfile		docker-compose.yml	requirements.txt
$ docker-compose up -d --build
```
- `-d`: バックグラウンドで実行することができます.
- `--build`: コンテナを開始前にイメージを構築します.
詳しくは、[日本語の公式ページ](https://docs.docker.jp/compose/reference/up.html)を参考にしてください.

すると、
```
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
82c38bb0a102        python38_python3    "python3"           15 seconds ago      Up 9 seconds                            python3
```
となり、containerができているのが確認できます.
containerに接続するには、
```
$ docker-compose exec python3 bash
root@82c38bb0a102:~# pwd
/root
root@82c38bb0a102:~# ls
opt
root@82c38bb0a102:~# cd opt/
root@82c38bb0a102:~/opt# ls
Dockerfile  docker-compose.yml
root@82c38bb0a102:~# python
Python 3.8.6 (default, Oct 13 2020, 20:37:26) 
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> quit()
```
となり、実際にcontainerの`/root/opt/`にホストOSのdirectoryがマウントされているのが確認できます.
終了するためには、
```
$ docker-compose down
```
## Juliaの場合.
[Docker Hub](https://hub.docker.com/_/julia)

## 色々詰め込んだもの.
[Docker Hub](https://hub.docker.com/r/jupyter/datascience-notebook)

## 実際に研究で使ってみる.
```
Dockerとnvidia-container-toolkitによるGPU環境構築
[Takaaki Saeki]
自由に加筆・修正してください．
[** はじめに]
[githubの音声合成実装]などを動かそうとすると，実装ごとに異なるversionのtensorflowやpytorchを使う必要があるが，一般にcuda+cuDNNのバージョンに強く依存する ([tensorflow https://www.tensorflow.org/install/source], [pytorch https://pytorch.org/get-started/previous-versions/])．そのため，毎回異なるバージョンのcudaやcuDNNを再インストールする必要があり，面倒．
そこで，dockerとnvidia-container-toolkitを用いて，コンテナごとにcuda+cuDNN環境を構築する．
.............(以下略)
```