Dockerfile からイメージを構築してみる


## Dockerfile を書いてみる
[前回](https://qiita.com/ysomei/items/343edcb3da9b240ceff7)はコンテナに入ってごにょごにょしながらイメージを作成しました。
まあそれでもいいかもしれませんが、何をどうしたのかが後で追えなくなるかもしれないということで、Dockerfile にしてそこから作成する方法を試してみます。

今回も nginx が起動するイメージでやってみます (^_^)

とりあえず、どこか一時フォルダを作ってそこで作業します。

```
$ mkdir tmp
$ cd tmp
$ vi Dockerfile
```

```bash:Dockerfile
# Dockerfile
# install and running nginx container
FROM debian:8.7

MAINTAINER ysomei
LABEL version="1.0"
LABEL description="running nginx!"

RUN apt-get update
RUN apt-get install -y nginx

ADD index.html /var/www/html/index.html

EXPOSE 80
ENTRYPOINT /etc/init.d/nginx start && tail -f /dev/null
```

FROM はこれから作成するイメージの元となるイメージをどれにするのかを示します。
今回は debian 8.7 をベースイメージとして、その上に nginx をインストールしていきます。
＃FROM は Dockerfile の先頭に記述しないと怒られます。。。

MAINTAINER はこのファイルの保守者です。

LABEL はなんかその他情報です。
とりあえず、 version と description を書いておきます。

RUN はコンテナに入ってごにょごにょするコマンドです。
ここでは `apt-get update` して、`apt-get install nginx` しています。
ポイントは、対話式だと自動化できないので、`-y` で止まらないようにします。

前回は標準のページでしたので、今回はちょっと
適当に
試験用に書いたページを表示するようにしてみます。

ADD は指定したファイルをコンテナ内に配置するコマンドです。
今回は試験用に書いた index.html をコンテナ内の /var/www/html/ 以下に追加します。

```html:index.html
<html>
<head>
  <title>Dockerfile Test</title>
</head>
<body>
  <h1>Hello, world!</h1>
</body>
```

EXPOSE は外部に出すポート番号を指定します。
ここで書かれたポート番号が `docker run -p xxxx:80` として対応付けられます。


ENTRYPOINT は `docker run` 時に実行するコマンドです。
今回は nginx を起動させて、終わらないように 空ファイルを表示するコマンドを書いておきます。

以上でファイルができました。

## イメージの作成
イメージの作成は `docker build` で行います。
先ほどの作業フォルダで、

```
$ docker build -t ysomei/nginx_file:1.0 ./
```
とすると

```
Sending build context to Docker daemon  232.6MB
Step 1/9 : FROM debian:8.7
 ---> 054abe38b1e6
Step 2/9 : MAINTAINER ysomei
 ---> Running in 496c000d03a5
 ---> 28521fde5c0e
Removing intermediate container 496c000d03a5
Step 3/9 : LABEL version "1.0"
 ---> Running in 7241c84a3999
 ---> d00c27e141eb
Removing intermediate container 7241c84a3999
Step 4/9 : LABEL description "running nginx!"
 ---> Running in 925552e5ad39
 ---> b50f92009932
Removing intermediate container 925552e5ad39
Step 5/9 : RUN apt-get update
 ---> Running in 17735090be7b
Get:1 http://security.debian.org jessie/updates InRelease [63.1 kB]

...

Step 7/9 : ADD index.html /var/www/html/index.html
 ---> 65117dfa92fd
Step 8/9 : EXPOSE 80
 ---> Running in 82573ac85883
 ---> da07be9e16cc
Removing intermediate container 82573ac85883
Step 9/9 : ENTRYPOINT /etc/init.d/nginx start && tail -f /dev/null
 ---> Running in 382bf67da477
 ---> 15a539b7c85b
Removing intermediate container 382bf67da477
Successfully built 15a539b7c85b
Successfully tagged ysomei/nginx_file:1.0
```
ってな感じで完了です。
イメージができているか確認しましょう。

```
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
ysomei/nginx_file   1.0                 c4792cfe9f47        About a minute ago   200MB
```
できてますね。
では走らせてみましょう。

```
$ docker run -d -p 8086:80 --name nginx2 ysomei/nginx_file:1.0
be121225535502ff3b92a84facebf9e69ab6d69864704c5c9e5630a9a9871285

$ curl http://localhost:8086
<html>
<head>
  <title>Dockerfile Test</title>
</head>
<body>
<h1>Hello, world!</h1>
</body>
```
ちゃんとできましたね。
以上です。

ファイルに残しておくと、後で少し変更とかなんか改造したいときとか確認したいときにとても助かります。なので Dockerfile からイメージを作成すると良いかもですね。
でも、これ nginx をインストールするだけなので簡単ですが、もっと複雑なことをする場合は延々と書き続けなければならないので、その辺りはバランスが大事ですかね。
＃複雑なことを延々としないように簡潔にすればいいのですね。。。