100日後にエンジニアになるキミ - 98日目 - 開発環境 - Docker について4

昨日までのはこちら

[100日後にエンジニアになるキミ - 95日目 - 開発環境 - Docker について](https://qiita.com/otupy/items/4569ffc8a1bd90bcd0b9)

[100日後にエンジニアになるキミ - 94日目 - 開発環境 - 仮想化について](https://qiita.com/otupy/items/0b8db399900a5517eb97)

[100日後にエンジニアになるキミ - 91日目 - 運用 - 監視について](https://qiita.com/otupy/items/532d0f78b103d3b39b2d)

[100日後にエンジニアになるキミ - 90日目 - 開発 - CIについて](https://qiita.com/otupy/items/25786feaaa1b1f4d203f)

[100日後にエンジニアになるキミ - 88日目 - データ - データ転送について](https://qiita.com/otupy/items/e720e175c83a84e101c9)

[100日後にエンジニアになるキミ - 86日目 - データベース - Hadoopについて](https://qiita.com/otupy/items/0016a1b9f496627619b6)

[100日後にエンジニアになるキミ - 76日目 - プログラミング - 機械学習について](https://qiita.com/otupy/items/6a4f960ba4df06e27050)

[100日後にエンジニアになるキミ - 70日目 - プログラミング - スクレイピングについて](https://qiita.com/otupy/items/f53e2e7d16adf80b5acf)

[100日後にエンジニアになるキミ - 66日目 - プログラミング - 自然言語処理について](https://qiita.com/otupy/items/5828ac7450c5ba8d6931)

[100日後にエンジニアになるキミ - 63日目 - プログラミング - 確率について1](https://qiita.com/otupy/items/0196897ae4d2134794fa)

[100日後にエンジニアになるキミ - 59日目 - プログラミング - アルゴリズムについて](https://qiita.com/otupy/items/f1a5e81633b868f3b5ed)

[100日後にエンジニアになるキミ - 53日目 - Git - Gitについて](https://qiita.com/otupy/items/0abaad82a7f3fea73f1f)

[100日後にエンジニアになるキミ - 42日目 - クラウド - クラウドサービスについて](https://qiita.com/otupy/items/d1765f1541a104ed6133)

[100日後にエンジニアになるキミ - 36日目 - データベース - データベースについて](https://qiita.com/otupy/items/7af17635d576677606dc)

[100日後にエンジニアになるキミ - 24日目 - Python - Python言語の基礎1](https://qiita.com/otupy/items/6d1e5453f530e07b7aec)

[100日後にエンジニアになるキミ - 18日目 - Javascript - JavaScriptの基礎1](https://qiita.com/otupy/items/2f71d5f9c754b29d9555)

[100日後にエンジニアになるキミ - 14日目 - CSS - CSSの基礎1](https://qiita.com/otupy/items/61a97863f6df14171994)

[100日後にエンジニアになるキミ - 6日目 - HTML - HTMLの基礎1](https://qiita.com/otupy/items/cd2315dcb38671cfded0)

本日は`Dockerfile`についてです。

## Dockerfile

Dockerイメージをビルドする方法の手順が含まれるテキストファイルです。
これはバッチスクリプトに似ていて必要なプログラムのインストールや
ファイルのコピーなどの記述が、目的環境になるまで続きます。

Dockerfileはアプリケーションの構成と
必要なリソースの詳細を記載します。

簡単に言うとDockerfileは
・Dockerイメージの設計書
・Dockerfileと言う名称のテキストファイル
です。

ここからはDockerfileの書き方を見ていきましょう。

### サンプル

サンプルとして`getting-started`のイメージ用の
Dockerfileを記載します。

こんな内容のファイルになっています。

```dockerfile
# Install the base requirements for the app.
# This stage is to support development.
FROM python:alpine AS base
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt

# Run tests to validate app
FROM node:12-alpine AS app-base
WORKDIR /app
COPY app/package.json app/yarn.lock ./
RUN yarn install
COPY app/spec ./spec
COPY app/src ./src
RUN yarn test

# Clear out the node_modules and create the zip
FROM app-base AS app-zip-creator
RUN rm -rf node_modules && \
    apk add zip && \
    zip -r /app.zip /app

# Dev-ready container - actual files will be mounted in
FROM base AS dev
CMD ["mkdocs", "serve", "-a", "0.0.0.0:8000"]

# Do the actual build of the mkdocs site
FROM base AS build
COPY . .
RUN mkdocs build

# Extract the static content from the build
# and use a nginx image to serve the content
FROM nginx:alpine
COPY --from=app-zip-creator /app.zip /usr/share/nginx/html/assets/app.zip
COPY --from=build /app/site /usr/share/nginx/html

```

### ファイルの命名規約

まずデフォルトのファイル名が`Dockerfile`になります。拡張子も無しです。

コンテナの構築手順を記述する`docker-compose.yml`ファイルは、
デフォルトのファイル名`docker-compose.yml`となっています。

イメージのビルドコマンドは
`docker build -t [イメージ名] -f [ファイル名] .`
となっているので名称を変えた際は、ファイル名などを指定して実行できます。

### コメント

Dockerfile内のコメントは先頭に「#」をつけます

```dockerfile
# コメント
命令 引数    #　コメント
```

### 基本構文

`命令(INSTRUCTION) 引数(arguments)`

「命令」は慣例的に大文字で書くようです、小文字でも問題は無いようです。

### FROM

生成するイメージの元となるDockerイメージを記述します。
`FROM 命令 : ベースイメージ`

```dockerfile
FROM python:alpine AS base
```

FROMに指定するものはなるべく小さいイメージが良いようです。
初めのうちは`ubuntu`や`alpine`などが良さそうです。

### RUN

ベースイメージに対して、何らかのコマンドを実行するときにはRUNを使用します。
`RUN [実行したいコマンド]`

```dockerfile
RUN pip install -r requirements.txt
```

dockerはRUNごとにイメージレイヤーと言うものを作っています。
RUN毎にレイヤーが重なっていくのをイメージして貰えば良いかと思います。

そのためRUNをたくさん使用するとDockerイメージが肥大化していくようなので
RUNをなるべく少なくした方が良さそうです。

Dockerのレイヤーを作るのは`RUN`,`COPY`,`ADD`になるようです。
これをうまく調整してやることで、レイヤーの数を抑えることができます。

`&&`でコマンドを繋いだり、`\`で改行を入れたりしてRUNが少なくなるようにします。

Linuxでコマンドでインストールを実行するときはインタラクティブなアクションを求められたりします。
そんな時はYesを打ち込めないのでオプション`-y`を付けて対応します。

```dockerfile
RUN apt-get update && RUN apt-get install -y curl
```


### ADD

イメージにホスト上のファイルやディレクトリを追加します。
`ADD ホストのファイルパス Dockerイメージのファイルパス`

```dockerfile
ADD add.txt.gz /tmp
```

### COPY

イメージにホスト上のファイルをコピーします。
`COPY ホストのファイルパス Dockerイメージのファイルパス`

```dockerfile
COPY app/package.json app/yarn.lock ./
```


### CMD

Dockerファイルで生成したイメージから起動したコンテナ内で
コマンドを実行するときに使います。

Dockerfile内では1つだけ記述することができ
複数記述した場合は最後のCMDのみが有効になります。

`CMD [実行したいコマンド]`

```dockerfile
CMD ["mkdocs", "serve", "-a", "0.0.0.0:8000"]
```

Dockerファイルを作ったら、ビルドテストをして
うまくイメージができていたら成功です。

## まとめ

Dockerの話はここで終わりです。
Dockerに関してを全て抑えるには誌面が足りません。

ここからはDockerについては、ご自身で少しづつ学習して行ってください。

君がエンジニアになるまであと02日

## 作者の情報
乙pyのHP：
http://www.otupy.net/

Youtube：
https://www.youtube.com/channel/UCaT7xpeq8n1G_HcJKKSOXMw

Twitter：
https://twitter.com/otupython