# 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環境を構築する. .............(以下略) ```