Docker勉強メモ② Dockerイメージ作ってみる


## はじめに

Docker勉強メモ
- [Docker勉強メモ① DockerインストールからHelloWorld](https://qiita.com/zgw426/items/c0687bdfd3c58eaaac33)
- [Docker勉強メモ② Dockerイメージ作ってみる](https://qiita.com/zgw426/items/b480ae298e1f92cf1418) **←ココ**
- [Docker勉強メモ③ Dockerfileを作ってDockerイメージ作成からコンテナ起動までやってみる](https://qiita.com/zgw426/items/bea786da9128af30937f)
- [Docker勉強メモ④ コンテナ間通信](https://qiita.com/zgw426/items/bb42f6bd17707de354b9)
- [Docker勉強メモ⑤ ネットワーク通信](https://qiita.com/zgw426/items/9a76f48edb6f7e34dffe)

## やること

前回はDocker HubにあるDockerイメージをそのまま使った
今度はDockerイメージを作る

※参考※
[Docker入門（第三回）～各種dockerコマンドとDockerイメージ作成について～](https://knowledge.sakura.ad.jp/14427/)

## 1.Dockerイメージを作る

#### 1-1.CentOSコンテナ起動

Docker HubからCentOSのDockerイメージを取得し、CentOSコンテナを起動する

```console:ホスト
$ docker pull centos:7
$ mkdir -p /root/tomcat-container/logs
$ docker run -it -d -p 18080:8080 -v /root/tomcat-container/logs:/share/logs --name tomcat centos:7
```

 ※「/root/tomcat-container/logs」は任意のディレクトリ

オプションの意味
　-it : コンソールに結果を出力
　-d : バックグラウンド実行
　-p : ポートフォワーディング
　-v : ディレクトリ共有
　--name : コンテナ名

#### 1-2.CentOSコンテナにTomcatインストール

起動したCentOSコンテナにTomcatをインストールする

流れの概要はこんな感じ
ホストでtomcatのtar.gzを取得
ホスト→コンテナにtar.gzをコピー
CentOSコンテナにログイン
CentOSコンテナ内でTomcatインストール


###### 1-2-1.ホストでtomgatのtar.gzを取得

wgetをインストール

```console:ホスト
$ yum -y install wget
```

tomcatのtar.gz のURLを確認
http://www-eu.apache.org/dist/tomcat/ 開き、使うバージョンのtar.gzを探す
→今回：http://ftp.riken.jp/net/apache/tomcat/tomcat-9/v9.0.31/bin/apache-tomcat-9.0.31.tar.gz


tomcatのtar.gzを取得

```console:ホスト
wget http://ftp.riken.jp/net/apache/tomcat/tomcat-9/v9.0.31/bin/apache-tomcat-9.0.31.tar.gz
```



###### 1-2-2.ホスト→コンテナにtar.gzをコピー

ホスト側からコンテナ内にファイルをコピー　

```console:ホスト
[centos@ip-172-31-3-246 ~]$ pwd
/home/centos
[centos@ip-172-31-3-246 ~]$ ls
apache-tomcat-9.0.31.tar.gz
[centos@ip-172-31-3-246 ~]$ sudo docker cp /home/centos/apache-tomcat-9.0.31.tar.gz tomcat:opt/
```

※ no such file と出たのでフルパス指定で回避


###### 1-2-3.CentOSコンテナにログイン



```console:ホスト
$ docker exec -it tomcat bash
```

```console:tomcatコンテナ
[centos@ip-172-31-5-50 ~]$ sudo docker exec -it tomcat bash
[root@00d08555ba6b /]# 
```


###### 1-2-4.CentOSコンテナ内でTomcatインストール

```console:tomcatコンテナ
yum install -y java
cd /opt/
tar zxf apache-tomcat-9.0.31.tar.gz
cd apache-tomcat-9.0.31
./bin/startup.sh
```

これでTomcatが動いた

コンテナから出て(exit)、Webサイトが開くか確認する


curl http://localhost:18080/
curl http://172.31.5.50:18080/

## 2.ホストとディレクトリ共有

Dockerコンテナを削除してもDockerコンテナ上のログは残したい、みたいなときに使う

#### 2-1.Tomcatログ設定変更

Tomcatログはデフォルトのディレクトリ（/opt/apache-tomcat-9.0.31/logs）に出力されているので、コンテナにログインして、ログ出力先を変える

CentOSコンテナにログイン

```console:ホスト
$ sudo docker exec -it tomcat bash
```

Tomcatのログ設定を変更しTomcatサービス再起動

```console:tomcatコンテナ
# cd /opt/apache-tomcat-9.0.31/
# sed -i -e "s/\${catalina.base}\/logs/\/share\/logs/g" ./conf/logging.properties
# ./bin/shutdown.sh
# ./bin/startup.sh
# ls -la /share/logs/
```

ホストに戻って、以下コマンドでログが表示されたら成功

```console:ホスト
$ ls -la /root/tomcat-container/logs/
$ cat /root/tomcat-container/logs/catalina.2020-03-08.log
```

#### 2-2.Dockerコンテナ停止後もTomcatログ見れるか確認

CentOSコンテナを停止

```console:ホスト
$ docker ps -a
$ docker stop tomcat
$ docker ps -a
```

※実行時の出力

```console:ホスト
[centos@ip-172-31-5-50 ~]$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
04d08555aa6b        centos:7            "/bin/bash"         35 minutes ago      Up 35 minutes       0.0.0.0:18080->8080/tcp   tomcat
[centos@ip-172-31-5-50 ~]$ sudo docker stop tomcat
tomcat
[centos@ip-172-31-5-50 ~]$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                       PORTS               NAMES
04d08555aa6b        centos:7            "/bin/bash"         35 minutes ago      Exited (137) 6 seconds ago                       tomcat
```

STATUSが UP -> Exited に変わたことを確認する


ログ残っていてログの中身が見れたら成功

```console:ホスト
$ ls -la /root/tomcat-container/logs/
```


## 3.CentOSコンテナからDockerイメージ作る

コンテナからイメージをつくることができる
今のDockerコンテナとDockerイメージはこーいう状態

```console:ホスト
[centos@ip-172-31-5-50 cent-tomact]$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
04d08555aa6b        centos:7            "/bin/bash"         3 hours ago         Exited (137) 3 hours ago                       tomcat
[centos@ip-172-31-5-50 cent-tomact]$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              7                   5e35e350aded        3 months ago        203MB
```

では、Dockerイメージを作成する
コンテナを起動してたら停止する

```console:ホスト
$ docker stop tomcat
```

Dockerイメージにする対象のコンテナ名を指定し、Dockerイメージを作成


```console:ホスト
$ docker commit tomact tomcat-image
```

※ 既存のDockerイメージ tomcat から tomcat-image を新規作成してる


これでDockerコンテナとDockerイメージはこーいう状態
tomcat-image というDockerイメージができてる

```console:ホスト
[centos@ip-172-31-5-50 cent-tomact]$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
04d08555aa6b        centos:7            "/bin/bash"         3 hours ago         Exited (137) 3 hours ago                       tomcat
[centos@ip-172-31-5-50 cent-tomact]$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
tomcat-image        latest              173543bffdb6        16 seconds ago      529MB
centos              7                   5e35e350aded        3 months ago        203MB
```


## 4.作成したDockerイメージを使用してコンテナ起動

ちゃんと動くか試す


```console:ホスト
$ sudo mkdir -p /root/tomcat-container/logs2
$ docker run -it -d -p 18082:8080 -v /root/tomcat-container/logs2:/share/logs --name tomcat2 tomcat-image
```

tomcat2 というDockerコンテナが起動してたら成功

```console:ホスト
[centos@ip-172-31-5-50 ~]$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                     PORTS                     NAMES
7f9xxx5dcf85        tomcat-image        "/bin/bash"         About a minute ago   Up About a minute          0.0.0.0:18082->8080/tcp   tomcat2
04dxxx95aa6b        centos:7            "/bin/bash"         3 hours ago          Exited (137) 3 hours ago                             tomcat
```

tomcat2コンテナに入りTomcatを起動してみる

tomcat2コンテナに入る

```console:ホスト
$ docker exec -it tomcat2 bash
```

```console:tomcat2コンテナ
# cd /opt/apache-tomcat-9.0.31
# ./bin/startup.sh 
```

※ Dockerコンテナなら抜けるときは exit


ホストからWebサイトにアクセスできたら成功

http://localhost:18082/


## 5.後片付け

※注意※ [Docker勉強メモ③]()に進むならこの作業はしない

作ったDockerイメージを削除します。
（AWS利用料を抑えるには、EC2インスタンスの削除が必要）

- Dockerコンテナ確認 `docker ps -a`
- Dockerコンテナ停止 `docker stop`
- Dockerコンテナ削除 `docker rm`
- Dockerイメージ確認 `docker images`
- Dockerイメージ削除 `docker rmi`


Dockerコンテナ停止

```
$ docker stop tomcat2
```

Dockerコンテナ削除

```
$ docker rm tomcat2
$ docker rm tomcat
```

Dockerイメージ削除

```
sudo docker rmi <REPOSITORY>
sudo docker rmi <centosのIMAGE ID>
sudo docker rmi <REPOSITORY>:<TAG>
```