Docker初心者がDockerfileを読んで、理解する(その1)

#Dockerとは?(簡単に)
Virtual Boxなどといった仮想マシーンと違い、仮想環境ごとにOSを作成する、起動する必要がないです。
アプリケーションを開発・実行環境から隔離し、アプリケーションを他の仮想マシーンより、素早く提供できることができます。

![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670396/0d1160b9-d403-3be8-cd55-88a20e9fb9dd.png)
ロゴの出典:https://www.docker.com/

#DokcerFileとは
Docker上で動作させるコンテナの構成情報を記述するためのファイルのことです。
**(つまり、ここを自分で書いたり、読んで理解しないとDockerを扱うことができない！)**

#前置き
学校で、Intel社のOpenVinoModelServerを使用したプロジェクトを行っているので、Intel社の社員の方の公式[github](https://github.com/openvinotoolkit/model_server/blob/master/Dockerfile "github")のOpenVinoModelServerのDockerFileを読んで、理解していきたいです

<details><summary>OpenVinoModelServerの公式DockerFile</summary><div>

```Dockerfile
FROM ubuntu:18.04
RUN apt-get update && apt-get install -y --no-install-recommends \
            ca-certificates \
            curl \
            libgomp1 \
            python3-dev \
            python3-pip \
            virtualenv \
            usbutils \
            gnupg2

RUN curl -o GPG-PUB-KEY-INTEL-OPENVINO-2020 https://apt.repos.intel.com/openvino/2020/GPG-PUB-KEY-INTEL-OPENVINO-2020
RUN apt-key add GPG-PUB-KEY-INTEL-OPENVINO-2020
RUN echo "deb https://apt.repos.intel.com/openvino/2020/ all main" > /etc/apt/sources.list.d/intel-openvino-2020.list

RUN apt-get update && apt-get install -y intel-openvino-dev-ubuntu18-2020.4.287

ENV DL_INSTALL_DIR=/opt/intel/openvino/deployment_tools
ENV PYTHONPATH="/opt/intel/openvino/python/python3.6"
ENV LD_LIBRARY_PATH="$DL_INSTALL_DIR/inference_engine/external/tbb/lib:$DL_INSTALL_DIR/inference_engine/external/mkltiny_lnx/lib:$DL_INSTALL_DIR/inference_engine/lib/intel64:$DL_INSTALL_DIR/ngraph/lib"

WORKDIR /ie-serving-py

COPY requirements.txt /ie-serving-py/
ENV WRAPT_INSTALL_EXTENSIONS=false
RUN virtualenv -p python3 .venv && \
    . .venv/bin/activate && pip3 install --upgrade pip==20.2.1 && \
    pip3 --no-cache-dir install -r requirements.txt --use-feature=2020-resolver

COPY start_server.sh setup.py version /ie-serving-py/
COPY ie_serving /ie-serving-py/ie_serving

RUN . .venv/bin/activate && pip3 install .
```
</div></details>

#このDockerfileで使用している命令群について
####・FROM  ... Docker Hubで公開されているベースイメージを利用
**書き方:**
FROM <イメージ>
FROM<イメージ>:<タグ>

**例:**
FROM centos
FROM ubuntu:18.04

####・RUN … コマンドを実行する
**書き方:**
RUN <コマンド>

**例：**
RUN chown -R mysql:root /var/lib/mysql/

####・COPY … ファイル又はディレクトリをコピーする
**書き方:**
COPY <ソース>  <送信先>

**例：**
COPY xxx.sh /usr/local/bin/xxx.sh

####・ENV … 環境変数設定
**書き方:**
ENV [key] = [value]

**例：**
ENV PYTHONPATH="/opt/intel/openvino/python/python3.6"

####・WORKDIR ... 作業ディレクトリ指定
**書き方:**
WORKDIR <ディレクトリパス>

#実際に読んでみる
**1行目** ... ubuntu0Sのimageを利用する
Linuxディストリビューションの1つであり、フリーソフトウェアとして提供されているubuntuの18.04は現在、最新に近くでかつ安定している　

**2~10行目**　... ubuntuのパッケージ(ca-certificates,curl,libgomp1,python3-dev,python3-pip,virtualenv,usbutils,gnupg2)をインストールする

コマンドのオプション **-y** は コマンドの途中で聞いてくる yes を自動入力されるためです
**--no-install-recommends**　は デフォルトの必須ではないパッケージもインストールさせない為です

**12行目**
Intelの公式リポジトリから、公開鍵ファイルを、**"GPG-PUB-KEY-INTEL-OPENVINO-2020"**というファイル名で、インストールする
curlはURLを使用してデータ転送するためのコマンドラインツールです
-oは、ファイル名を指定してダウンロードするときのcurlのオプションです
GPGは公開鍵暗号を手軽に利用することが出来るフリーソフトウェアです

**13行目**
公開鍵ファイル**"GPG-PUB-KEY-INTEL-OPENVINO-2020"**を信頼キーのリストに新しいキーとして追加する
Ubuntu公式以外からパッケージを取得するには、このコマンドで認証する鍵情報を取り込んでおく必要があります
apt-key は、apt が パッケージを認証するのに使用するキーの一覧を管理します

**14行目**
以下の相対パス"/etc/apt/sources.list.d"に、**intel-openvino-2020.list**を作成し、**"deb https\://apt.repos.intel.com/openvino/2020/ all main"**という文字列を出力する
echoコマンドは、文字列をファイルに出力する場合は、**>**で出力するファイル名を指定します

**15行目**
OpenVinoツールキットの開発者パッケージの**"intel-openvino-dev-ubuntu18-2020.4.287"**をダウンロードする


**19行目**
Pythonのimport文で標準ライブラリやpipでインストールしたパッケージ、自作のパッケージなどをインポートするときに探索されるパスを設定

**20行目**
共用ライブラリが格納されているパスを指定

**21行目**
作業ディレクトリを、**"/ie-serving-py"**と指定

**24行目**
"requirements.txt"というテキストファイルを"/ie-serving-py/"の直下に置く

**25行目**
wraptの拡張機能インストールをoffにします
**wrapt**とはラッパー記述を補助してくれるライブラリです
**ラッパー**とはラップされたオブジェクトを使用する「異なる」方法を提供するものです(ほかにも、さまざまな意味がほかのwebサイト、書籍にあるので、詳しく知りたい方はそちらを参考にしてください)

**26行目**
pythonの仮想環境を作成する
-p オプションを付けてバージョンを指定することでそのバージョンで仮想環境が作られます

**27行目**
仮想環境をacitvateし、pip20.2.1をインストールする

**28行目**
設定ファイルrequirements.txtに従ってパッケージが一括でインストールしている
**--use-feature=2020-resolver**というオプションで新しいリゾルバーを使えます
**--no-cache-dir**というオプションは、キャッシュは通常Dockerイメージでは役に立たないため、キャッシュを無効にすることでイメージサイズを縮小させています

**30行目**
**start_server.sh**を**version**にコピーする
**setup.py**を**/ie-serving-py/**以下にコピーする

**31行目**
**ie_serving**を**/ie-serving-py/ie_serving**にコピーする

**33行目**
仮想環境をactivateし、パッケージをインストールする