Docker の実験（その７：イメージの作成）

[その6：コンテナの自動削除](https://qiita.com/intrajp/items/110cb53df2bf13e9c889)のつづき。

Docker イメージを作成する基本的な方法。
Dockerfile を作成して、docker build でイメージが作成できる。
Google Cloud 上の vm インスタンス（その１を参照）で作業する。
（ファイル名：Dockerfile）

```bash
FROM ubuntu
RUN apt-get update
RUN apt-get -y install nginx
CMD ["nginx", "-g", "daemon off;"]
```

簡単なビルド方法。

```bash
$ docker build .
Sending build context to Docker daemon  12.29kB
Step 1/4 : FROM ubuntu
 ---> 58db3edaf2be
Step 2/4 : RUN apt-get update
 ---> Running in 5c39a3c138c0
 ...(snip)...
Step 3/4 : RUN apt-get -y install nginx
 ---> Running in 0ec5bdc68d3f
Reading package lists...
Building dependency tree...
Reading state information...
...(snip)...
Step 4/4 : CMD ["nginx", "-g", "daemon off;"]
 ---> Running in 05fcc709fd05
Removing intermediate container 05fcc709fd05
 ---> ede4075dc036
Successfully built ede4075dc036
```

```bash
$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED              SIZE
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
<none>       <none>    ede4075dc036   3 minutes ago   175MB
nginx        latest    3f8a00f137a0   9 days ago      142MB
ubuntu       latest    58db3edaf2be   3 weeks ago     77.8MB
```

Google Cloud で作成していた Firewall Rule で、ポートのところを修正する（その３参照）。

```bash
Protocols and ports:Specified protocols and ports:TCP:80,8080,8081
```
ポート番号を　8081 にして立ち上げてみる。

```bash
$ docker container run -d -p 8081:80 ede4075dc036
aa3715e9eca099dd12b233dee5085bbad5b63b0a81be81ab244756502b476dbb
```

curl コマンド、webからも確認する。
vm のグローバル IP の確認方法
（参考）
https://cloud.google.com/compute/docs/instances/view-ip-address?hl=ja#gcloud

```bash
$ gcloud compute instances list
$ gcloud compute instances describe <instance-name> --zone=asia-northeast1-b --format='get(networkInterfaces[0].accessConfigs[0].natIP)'
xxx.xxx.xxx.xxx
```

ちなみに、プロジェクトのデフォルトゾーンに存在しているインスタンスならば、ゾーンオプションは省略できる。

```bash
$ curl -I 127.0.0.1:8081
http:<vm のグローバルIP>:8081
```

ubuntu イメージから、オリジナルの inex.html を持った nginx イメージを作成する。
ファイルを作成して、Dockerfile でコピーして、docker build でイメージを作る。

```bash
$ mkdir demo
$ cd demo
$ vim index.nginx-debian.html
（以下、ファイルの内容）
Welcome to Nginx Container intrajp!
```

```bash
$ vim Dockerfile
（以下、ファイルの内容）
FROM ubuntu
RUN apt-get update
RUN apt-get install -y nginx
COPY index.nginx-debian.html /var/www/html
CMD nginx -g 'daemon off;'
```

ビルドする。

```bash
$ docker build .
Sending build context to Docker daemon  3.072kB
Step 1/5 : FROM ubuntu
 ---> 58db3edaf2be
Step 2/5 : RUN apt-get update
 ---> Using cache
 ---> 4b3e66e5edd1
Step 3/5 : RUN apt-get -y install nginx
 ---> Using cache
 ---> 60ea0cbe0bb1
Step 4/5 : COPY index.nginx-debian.html /var/www/html
 ---> f2b014774e62
Step 5/5 : CMD ["nginx", "-g", "daemon off;"]
 ---> Running in bc84395523f5
Removing intermediate container bc84395523f5
 ---> 5e443cc82858
Successfully built 5e443cc82858
```

イメージが出来たかどうか確認する。

```bash
$ docker iamges
REPOSITORY   TAG       IMAGE ID       CREATED              SIZE
<none>       <none>    5e443cc82858   About a minute ago   175MB
<none>       <none>    ede4075dc036   30 minutes ago       175MB
nginx        latest    3f8a00f137a0   9 days ago           142MB
ubuntu       latest    58db3edaf2be   3 weeks ago          77.8MB
```

出来ていた。

Google Cloud で作成していた Firewall Rule で、ポートのところを修正する（その３参照）。

```bash
Protocols and ports:Specified protocols and ports:TCP:80,8080,8081,8082
```

ポート番号を　8082 にして立ち上げてみる。

```bash
$ docker container run -d -p 8082:80 --name mycustomnginx 5e4
e6e93cd9f5c5f5b3bc68e5e6fd068d5eb49585d53d46190249e8b141f1408664

$ docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED              STATUS              PORTS                                   NAMES
e6e93cd9f5c5   5e4            "nginx -g 'daemon of…"   About a minute ago   Up About a minute   0.0.0.0:8082->80/tcp, :::8082->80/tcp   mycustomnginx
4348ace32de7   ubuntu         "/bin/bash"              17 minutes ago       Up 17 minutes       0.0.0.0:80->80/tcp, :::80->80/tcp       mynginx2
aa3715e9eca0   ede4075dc036   "nginx -g 'daemon of…"   29 minutes ago       Up 29 minutes       0.0.0.0:8081->80/tcp, :::8081->80/tcp   keen_lamarr
67df4d402280   nginx          "/docker-entrypoint.…"   44 hours ago         Up 44 hours         0.0.0.0:8080->80/tcp, :::8080->80/tcp   mynginx
```

確認する。
```
$ curl 127.0.0.1:8082
Welcome to Nginx container intrajp!
```

webからも確認できた。
vm のグローバル IP の確認方法
（参考）
https://cloud.google.com/compute/docs/instances/view-ip-address?hl=ja#gcloud

```bash
$ gcloud compute instances list
$ gcloud compute instances describe <instance-name> --zone=asia-northeast1-b --format='get(networkInterfaces[0].accessConfigs[0].natIP)'
xxx.xxx.xxx.xxx
```

ちなみに、プロジェクトのデフォルトゾーンに存在しているインスタンスならば、ゾーンオプションは省略できる。

```bash
http://<vm のグローバルIP>:8082
```

[その８：Dockerfile のオプション](https://qiita.com/intrajp/items/759ce67aa3580469a74e)につづく。