【Docker修行②】設定内容を記述するだけで、簡単に環境作成ができる「Dockerfile」を体験

- 1年にも満たないエンジニア生活のため、雲の上の存在だと思っていて距離を取っていた「Docker」の習得を目指す記事第二弾。
- 2回目にして「第何弾」という数字が、途方も無い数字になることを悟ってしまった瞬間、何故か喜々に満ち溢れる。
- 今回は、構成内容をテキストで記述するだけで、簡単に環境作成が行える「Dockerfile」「Docker Compose」を学習することにしよう。
- 概要や導入等含めた[第一弾はこちら](https://qiita.com/t_o_d/items/26a51ed8f19db5c3193c)

## 今回の目的やゴール
- 「Dockerfile」の概要を再度把握する。
- Dockerfileの記述方法を把握する。
- 簡単なDockerfileを作成して実行する。
- 「Docker Compose」の概要を把握する。
    - 今回は、「docker-compose」での環境作成は行わない。

## Dockerfile
### 概要
- コンテナーの構成や手順を記述することができるテキスト形式のファイル
- このファイルをビルド(変換)して、自動的に環境を作成することができる。
- コンテナ内で環境構築の作業をする必要がなくなる。
- このファイルを作成しておけば、誰でも簡単に共有して、同じ環境を作成することができる。

### 特徴
- 複数の作業を一括で行うことができる。
- 一度作成すれば、何回でも使い回せて、同じ環境が作りやすい。
- 構築内容や作成方法を記述しているため、構築手順書としても利用できる。
- ファイルとして実行するため、入力ミスが起こらない。
- テキスト形式のため、管理やメンテナンスがしやすい。

### チュートリアルファイル作成
- ターミナル(コマンドプロンプト)を開き、下記のコマンドをうち、作業フォルダの作成と移動を行う。

```bash
# 作業フォルダの作成
$ mkdir dockerwork
# 作業フォルダへの移動
$ cd dockerwork
```

- 下記のコマンドをうち、「dockerfile」フォルダの中に「Dockefile」を作成する。

```bash
$ touch Dockerfile
```

- 「Dockerfile」の中身を、下記のように編集して、保存する。

```dockerfile:dockerwork/Dockerfile
FROM ubuntu
MAINTAINER t_o_d
RUN apt-get update
RUN apt-get install -y nginx
CMD ["/usr/sbin/nginx", "-g", "daemon off;"]
```

- 保存後、ターミナル上へ戻り、作業フォルダの位置にいることを確認する。
- 確認後、下記のコマンドをうち、「Dockerfile」をビルド(変換)してイメージを作成する。

```bash
# docker build -t イメージ名:タグ名 作業フォルダ
$ docker build -t sample:latest .

--------------
Sending build context to Docker daemon  2.048kB
Step 1/5 : FROM ubuntu
--------------
Successfully tagged sample:latest
```

- 作成後、「Successfully」の文字が出たら、下記のコマンドをうち、イメージができているか確認する。

```bash
$ docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
sample              latest              XXXXXXXXXX        8 seconds ago       173MB
ubuntu              latest              XXXXXXXXXX        3 weeks ago         88.9MB
```

- イメージ確認後、下記のコマンドをうち、作成したコンテナ環境を起動する。

```bash
# docker run -d -p ポート番号 --name コンテナ名 イメージ名
$ docker run -d -p 80:80 --name sample-nginx sample

# コンテナIDが表示される。
XXXXXXXXXXXXXXXXXXXXXXX
```

- 下記のコマンドをうち、コンテナ環境が動作しているか確認する。

```bash
$ docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
XXXXXXXXXXXX        sample              "/usr/sbin/nginx -g …"   6 seconds ago       Up 4 seconds        0.0.0.0:80->80/tcp   sample-nginx
```

- 動作確認後、下記のコマンドをうち、nginxサーバーが起動しているか確認する。

```bash
$ curl localhost
```

- htmlが返ってきたら、完了。
- 念のため、ブラウザ上で`localhost:80`にアクセスして、「Welcome to nginx」が表示されたら完了。

![nginx](https://camo.qiitausercontent.com/1a703cf130a8faca5938558f23ea4af63d92309e/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3333363439392f38373437346662622d386437392d363739312d326334352d6433656333393835656333632e706e67)

- 下記のコマンドをうち、起動環境を終了する。

```bash
$ docker stop sample-nginx
# 動作していないか確認する。
$ docker ps
```

### ファイル基本記法
- Dockerfileの主な記述は、下記のような命令形式で行う。

| 命令形式 | 内容 |
|:-:|:-:|
| FROM | 元イメージの指定 |
| MAINTAINER | 管理者 |
| RUN | コマンド実行 |
| ADD | ローカルのものをDockerへコピー |
| CMD | バックグラウンドプロセス実行 |
| ENTRYPOINT | バックグラウンドプロセス実行 |
| WORKDIR | 作業ディレクトリ指定 |
| ENV | 環境変数の指定 |
| USER | ユーザー指定 |
| EXPOSE | ポート番号の指定 |
| VOLUME | ホストやコンテナからの外部接続ポイント |

## まとめ
- 今回はDockerfileの概要や環境作成ということで、「テキスト形式での環境作成」という夢見心地世界を体験しながら、記事を書く。
- 賢人技術者が口を揃える「シェルやバッチと似ているから理解しやすい」という意見に、身を潜めながら、静かに熱狂。
- 次回は、「docker-composeを利用した環境作成」を学習することにしよう。

## 参考サイト
- https://www.atmarkit.co.jp/ait/articles/1407/08/news031.html
→こちらの記事を参考にしました。大変お世話になりました。

- https://paiza.hatenablog.com/entry/docker_intro  
→こちらの記事を参考にしました。大変お世話になりました。

## 参考テキスト
- [Docker実戦活用ガイド](https://www.amazon.co.jp/exec/obidos/ASIN/4839959234/paiza07-22/)  
→こちらのテキストで学習しました。大変お世話になりました。