2. Dockerイメージの作成とRegistry登録

# はじめに
本記事は以下1の続きです。
1. [Google Kubernetes Engine（GKE）でJavaのWebモジュールをサッと動かしてみる](https://qiita.com/Turtle-child-No2/items/a5260ed94f01ccd5cfec)
2. [Dockerイメージの作成とRegistry登録](https://qiita.com/Turtle-child-No2/items/b8c307eb652e42420f7a)
3. [Webモジュールからアクセスするデータベースを作成](https://qiita.com/Turtle-child-No2/items/0fd09117beb74e848146)
4. [マニフェストの作成とWebモジュールの実行](https://qiita.com/Turtle-child-No2/items/23982059d188e44618df)
## 2-1. dockerfileの作成
### 手順2-1.1
GKEはContainer Registryに登録されたDockerイメージを取得し、1（前の記事）で作成したノードで実行（Webモジュールが動く）させます。
本記事ではGithubから取得したWebモジュールをtomcatに展開したDockerイメージを作成します。Dockerイメージはdockerfileを元にイメージがビルドされます。
それでは早速dockerfileを作成し、dockerイメージをビルドしてみましょう。

まずKubernetesクラスタに接続します。
![014.png](https://qiita-image-store.s3.amazonaws.com/0/263269/db3b5db6-f686-361f-f649-1efe30d64863.png)
### 手順2-1.2
詳細画面が表示されますので右上の四角をクリックしてコマンドをクリップボードにコピーします。その後に「Cloud Shellで実行」をクリックします。
![015.png](https://qiita-image-store.s3.amazonaws.com/0/263269/590f77df-7bc4-c09a-0d41-6e777af7ff67.png)
### 手順2-1.3
初めての実行だと以下のような画面がでるかもしれません。その際は「CLOUD SHELLの起動」をクリックしてください。
![016.png](https://qiita-image-store.s3.amazonaws.com/0/263269/c3f4ed29-5a66-ccce-5e14-cacd5f2c30d0.png)
Google Cloud Shellは、Google Cloud Platformでホストされているコンピューティングリソースへのコマンドラインアクセスを提供するツールです。
Cloud Shellのセッションを閉じるか、もしくは1時間以上何もしなかった場合にterminateされますが、ホームディレクトリは永続化されていますので次に Cloud Shellを立ち上げた時には作業の内容が残ります。
### 手順2-1.4
下記の画面が表示されたら「Enter」キーを一度押下し、既に入力されているコマンド（Kubernetesクラスタと相互作用するために必要な認証情報を取得する命令）を実行します。
![017.png](https://qiita-image-store.s3.amazonaws.com/0/263269/530cda7f-e9a4-12b6-228d-6e940064f0b3.png)

コマンドが実行され、以下のような状態になります。

```
Welcome to Cloud Shell! Type "help" to get started.
Your Cloud Platform project in this session is set to [project_id].
Use “gcloud config set project [project_id]” to change to a different project.
[userid]@cloudshell:~ ([projectid])$ gcloud beta container clusters get-credentials standard-cluster-1 --region us-central1 --project [project_id]
Fetching cluster endpoint and auth data.
kubeconfig entry generated for standard-cluster-1.
[userid]@cloudshell:~ ([project_id])$
```
### 手順2-1.5
続いてviを起動し、以下の内容でdockerfileを作成します。

```
[userid]@cloudshell:~ ([project_id])$ vi dockerfile
```

```
FROM centos:7
EXPOSE 8080
RUN yum install -y git
RUN yum install -y install unzip
WORKDIR /work
RUN git clone https://github.com/Turtle-child-No2/k8s.git
ADD openjdk-11.0.2_linux-x64_bin.tar.gz /usr/local
ENV JAVA_HOME /usr/local/jdk-11.0.2
ENV PATH=$PATH:$JAVA_HOME/bin
ADD gradle-5.2.1-bin.tar.gz /usr/local
ENV GRADLE_HOME=/usr/local/gradle-5.2.1
ENV PATH=$GRADLE_HOME/bin:$PATH
RUN mv -T ./k8s/ ./sample-app/
WORKDIR ./sample-app
RUN gradle build --stacktrace
ADD apache-tomcat-9.0.17.tar.gz /opt/
RUN rm -Rf /opt/apache-tomcat-9.0.17/webapps/ROOT/
RUN rm -Rf /opt/apache-tomcat-9.0.17/webapps/docs/
RUN rm -Rf /opt/apache-tomcat-9.0.17/webapps/examples/
RUN rm -Rf /opt/apache-tomcat-9.0.17/webapps/host-manager/
RUN rm -Rf /opt/apache-tomcat-9.0.17/webapps/manager/
RUN mkdir -m 750 /opt/apache-tomcat-9.0.17/webapps/sample-app
RUN unzip -d /opt/apache-tomcat-9.0.17/webapps/sample-app/ /work/sample-app/build/libs/sample-app.war
RUN find /opt/apache-tomcat-9.0.17/webapps/sample-app/ -type d -exec chmod 750 \{\} \;
RUN find /opt/apache-tomcat-9.0.17/webapps/sample-app/ -type f -exec chmod 640 \{\} \;
CMD ["/opt/apache-tomcat-9.0.17/bin/catalina.sh", "run"]
```

dockerfileの内容を簡単に説明すると、まずベースイメージとしてcentos7を指定しています。
続いてコンテナ起動時にListenするポート番号と、javaソースの取得やコンパイルに必要なパッケージをインストールします。
次にgithubからjavaソースを取得し、gradleでコンパイルします。
最後にtomcatを展開し不要なファイルの削除とフォルダの権限を変更し、tomcat起動して終わりです。
### 手順2-1.6
次にDockerイメージをビルドするために必要な以下3つのファイルを準備します。

- openjdk-11.0.2_linux-x64_bin.tar.gz
- apache-tomcat-9.0.17.tar.gz
- gradle-5.2.1-bin.tar.gz

### 手順2-1.7
openjdk-11.0.2_linux-x64_bin.tar.gzをダウンロードします。

```
[userid]@cloudshell:~ ([project_id])$ curl -O https://download.java.net/java/GA/jdk11/9/GPL/openjdk-11.0.2_linux-x64_bin.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  178M  100  178M    0     0  9686k      0  0:00:18  0:00:18 --:--:-- 9827k
```

### 手順2-1.8
apache-tomcat-9.0.17.tar.gzをダウンロードします。

```
[userid]@cloudshell:~ ([project_id])$ curl -O http://ftp.jaist.ac.jp/pub/apache/tomcat/tomcat-9/v9.0.17/bin/apache-tomcat-9.0.17.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 10.2M  100 10.2M    0     0  2726k      0  0:00:03  0:00:03 --:--:-- 2727k
```

### 手順2-1.9
gradle-5.2.1-bin.tar.gzは、DockerのADDコマンドを使用するためgradle-5.2.1-bin.zipをダウンロードして、展開してからtar.gzにアーカイブします。

```
[userid]@cloudshell:~ ([project_id])$ curl -OL https://services.gradle.org/distributions/gradle-5.2.1-bin.zip
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100 83.3M  100 83.3M    0     0  81.6M      0  0:00:01  0:00:01 --:--:--  105M
[userid]@cloudshell:~ ([project_id])$ unzip gradle-5.2.1-bin.zip
   creating: gradle-5.2.1/
  inflating: gradle-5.2.1/getting-started.html
  inflating: gradle-5.2.1/LICENSE
   creating: gradle-5.2.1/media/
  inflating: gradle-5.2.1/media/gradle-icon-16x16.png
        ・
        ・
        ・  
  inflating: gradle-5.2.1/lib/plugins/junit-platform-commons-1.3.1.jar
  inflating: gradle-5.2.1/lib/plugins/apiguardian-api-1.0.0.jar
  inflating: gradle-5.2.1/lib/plugins/opentest4j-1.1.1.jar
[userid]@cloudshell:~ ([project_id])$ tar -zcvf gradle-5.2.1-bin.tar.gz gradle-5.2.1
gradle-5.2.1/
gradle-5.2.1/NOTICE
gradle-5.2.1/bin/
gradle-5.2.1/bin/gradle.bat
        ・
        ・
        ・  
gradle-5.2.1/media/gradle-icon-64x64.png
gradle-5.2.1/media/gradle-icon-128x128.png
gradle-5.2.1/init.d/
gradle-5.2.1/init.d/readme.txt
gradle-5.2.1/getting-started.html
```

### 手順2-1.10
lsコマンドで以下4つのファイルがちゃんと作られているか確認しましょう。

- dockerfile
- openjdk-11.0.2_linux-x64_bin.tar.gz
- apache-tomcat-9.0.17.tar.gz
- gradle-5.2.1-bin.tar.gz

```
[userid]@cloudshell:~ ([project_id])$ ls -Fal
total 364340
drwxr-xr-x 7 [userid] [userid]      4096 Mar  9 17:50 ./
drwxr-xr-x 4 root    root         4096 Mar  9 14:38 ../
-rw-r--r-- 1 [userid] [userid]  10783080 Mar  9 17:36 apache-tomcat-9.0.17.tar.gz
-rw------- 1 [userid] [userid]       489 Mar  9 17:51 .bash_history
-rw-r--r-- 1 [userid] [userid]       220 May 16  2017 .bash_logout
-rw-r--r-- 1 [userid] [userid]      3706 Mar  9 14:38 .bashrc
drwxr-xr-x 3 [userid] [userid]      4096 Mar  9 14:38 .config/
drwx------ 2 [userid] [userid]      4096 Mar  9 14:38 .docker/
-rw-r--r-- 1 [userid] [userid]      1168 Mar  9 16:21 dockerfile
drwxr-xr-x 6 [userid] [userid]      4096 Feb  8 20:03 gradle-5.2.1/
-rw-r--r-- 1 [userid] [userid]  87295238 Mar  9 17:51 gradle-5.2.1-bin.tar.gz
-rw-r--r-- 1 [userid] [userid]  87430521 Mar  9 17:39 gradle-5.2.1-bin.zip
drwxr-xr-x 2 [userid] [userid]      4096 Mar  9 14:44 .kube/
-rw-r--r-- 1 [userid] [userid] 187513052 Mar  9 17:33 openjdk-11.0.2_linux-x64_bin.tar.gz
-rw-r--r-- 1 [userid] [userid]       675 May 16  2017 .profile
lrwxrwxrwx 1 [userid] [userid]        38 Mar  9 14:38 README-cloudshell.txt -> /google/devshell/README-cloudshell.txt
drwxr-xr-x 2 [userid] root         4096 Mar  9 14:38 .theia/
-rw------- 1 [userid] [userid]      1006 Mar  9 16:21 .viminfo
```

## 2-2. dockerイメージのビルド
### 手順2-2.1
先ほど作成した4つのファイルがあるディレクトリで以下のコマンドを実行しDockerイメージを作成しますが、その前にプロジェクトIDを環境変数に設定します。

```
[userid]@cloudshell:~ ([project_id])$ export PROJECT_ID="$(gcloud config get-value project -q)"
Your active configuration is: [cloudshell-21915]
```

### 手順2-2.2
Dockerイメージをビルドします。
※カレントディレクトリにあるdockerfileが参照されます。

```
[userid]@cloudshell:~ ([project_id])$ docker build --no-cache --rm -t gcr.io/${PROJECT_ID}/sample-app:latest .
Sending build context to Docker daemon  473.3MB
        ・
        ・
        ・ 
Step 26/26 : CMD ["/opt/apache-tomcat-9.0.17/bin/catalina.sh", "run"]
 ---> Running in 6b1c1d3d8d1f
Removing intermediate container 6b1c1d3d8d1f
 ---> 69ff4ed40a45
Successfully built 69ff4ed40a45
Successfully tagged gcr.io/[project_id]/sample-app:latest
```

### 手順2-2.3
以下のコマンドで作成したDockerイメージを確認します。

```
[userid]@cloudshell:~ ([project_id])$ docker images
REPOSITORY                                 TAG                 IMAGE ID            CREATED             SIZE
gcr.io/[project_id]/sample-app   latest              69ff4ed40a45        32 minutes ago      865MB
```


## 2-3. DockerイメージのRegistry登録
### 手順2-3.1
GKEはContainer Registryに登録されたDockerイメージを取得します。
先ほど作成したDockerイメージをContainer Registryに登録します。

```
[userid]@cloudshell:~ ([project_id])$ gcloud docker -- push gcr.io/${PROJECT_ID}/sample-app:latest
WARNING: `gcloud docker` will not be supported for Docker client versions above 18.03.

As an alternative, use `gcloud auth configure-docker` to configure `docker` to
use `gcloud` as a credential helper, then use `docker` as you would for non-GCR
registries, e.g. `docker pull gcr.io/project-id/my-image`. Add
`--verbosity=error` to silence this warning: `gcloud docker
--verbosity=error -- pull gcr.io/project-id/my-image`.

See: https://cloud.google.com/container-registry/docs/support/deprecation-notices#gcloud-docker

The push refers to repository [gcr.io/[project_id]/sample-app]
165d18932f79: Pushed
3903f8c5dac4: Pushed
        ・
        ・
        ・ 
8294101b3641: Pushed
be99d3b0a3bf: Pushed
0e4c9a7eac59: Pushed
99a6cf5e838e: Pushed
5309f6df6f0b: Pushed
071d8bd76517: Layer already exists
latest: digest: sha256:082443b29ff78220569c1f558442346465fa700ac938f4754e8e506457eacd09 size: 4302
```

### 手順2-3.2
Container Registryに登録されているか確認しましょう。
![018.png](https://qiita-image-store.s3.amazonaws.com/0/263269/9bcbe22b-85c0-18dc-e264-f7497367ad67.png)
![019.png](https://qiita-image-store.s3.amazonaws.com/0/263269/c3e58bbd-8eb3-90fb-ac2a-8579b2ac13fc.png)
以上