Google Cloud RunにDockerコンテナをデプロイする方法

GCPに、Dockerコンテナをデプロイするのに、丸３日間以上、ハマりましたが、先程、デプロイできました。
自分が、どこで躓いたか？を含めて、共有しますね。

１．Dockerコンテナとは
PasSソリューションです。下記の記事が分かり易いと思います。

Docker入門（第一回）～Dockerとは何か、何が良いのか～
https://knowledge.sakura.ad.jp/13265/

あるいは、こっち。⇒　https://frontier.networld.co.jp/3179/
＞コンテナの特徴は、ハードウェア上に存在するOSが1つのみであり、その上で複数のコンテナが稼働している仕組みになっていることです。コンテナアプリはOSから分離しているため、OSに起因するオーバーヘッドがかからずにリソースを有効活用できます。一方で、一般的な仮想マシンではハードウェアのリソースを、ハイパーバイザーを介してLinuxやWindowsなど複数のOS環境に分けて、それぞれで仮想マシンが稼働します。仮想マシンごとにOSを用意するため、アプリに合わせてOSを選択できます。

これもあり。⇒　https://cn.teldevice.co.jp/column/10509/
＞いまや主要なOSやクラウドのほとんどがDockerに対応しつつあります。ハイパーバイザーと呼ばれる専用のソフトウェアを必要とする仮想サーバーと比べると、DockerはOSの基本機能として組み込まれていくため、ずっと気軽に利用できます。


２．Google CloudのCloud RunでDockerコンテナを動かす手順。
基本的に下記のステップになります。
1) ローカルでアプリケーションを作る。（ローカルで作成）
2) そのアプリと同じDirectoryに、Dockerfileを作る。（ローカルで作成）
3) gcloud コマンドを使って、Dockerfileを操作して、Google Cloud Registryにアップする。（gcloudコマンド一発で、この処理は全部完了。ローカルからGoogle Cloudにアップ）
4) Cloud RegistryからCloud Runへのデプロイ （Google Cloudでデプロイ）

詳しくは、こちらのサイト通りです。
https://cloud.google.com/run/docs/quickstarts/build-and-deploy

私の理解では、DockerImageと言うのは、仮想サーバのイメージの様なモノです。
仮想サーバをローカル側でイメージ化して、それをクラウド上にコピーして、インスタンスを立てていますが、それが、アプリレベルで可能になったと言う事と理解しております。
「コンテナの起動はシステム的には単なるプロセスの起動であるため、ハードウェアの初期化やカーネルのロードなど時間のかかるブート過程が存在しません。」＞　https://frontier.networld.co.jp/3179/

３．より詳しく（Dockerfileの作り方）
大まかな流れは上の通りです。
この流れを理解するのに、凄い時間が掛りました。
つまり、アプリケーションをコーディングして、Dockerfileを作成すれば、そこから先は、gcloudコマンドで簡単にデプロイまで持っていけます。

Dockerfile作成に関しては、下記記事が分かり易かったです。

Dockerfileの作り方（基礎）⇒　https://qiita.com/daisuke30x/items/a3ea62ff8fa582b2b065

>DockerfileはDockerImageの設計図のようなものです。
>Dockerfileを自身で作成することで構築したい環境のDocker imageを作成できます。

技術的に難度が高いのは、Dockerfile作成です。
ただ、私も、この部分はまだ勉強中ですので、近々、追記します。


＜番外編＞
１．
下記の記事では、「CentOSのDockerイメージをもとにTomcatが動くコンテナを構築」しております。
https://knowledge.sakura.ad.jp/14427/

はい。
Tomcatをローカルで動かすのは、成功しました。
こんな感じです。
![tomcat.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665829/381a57f2-db4f-47d6-2d59-bc9c3195d44e.jpeg)
ただ、Tomcatを設定するのは、初心者には煩雑です。（俺も、丸１日掛かりました。）

２．
尚、Tomcatとは何ぞや？と言う部分から、俺は始めました。
⇒https://wa3.i-3-i.info/word12843.html

＞Webサーバで動くJavaプログラムがあります。この「Webサーバ上で動くJavaプログラム」を「Java Servlet（サーブレット、Servlet）」と言います。さて、Java Servletさんですが、実は単独ではお仕事ができません。とあるソフトのお世話になって、はじめてお仕事ができます。
その「とあるソフト」を「サーブレットコンテナ」と言います。サーブレットコンテナさんが、Java Servletさんを、ちまちま動かしてくれるのです。サーブレットコンテナのひとつが「Apache Tomcat（アパッチ・トムキャット）」です。

３．
と言う訳で、Tomcatを動かすのは難しいので、まずローカルで、Ubuntuを立ててみましょう。（こっちの方が遥かに簡単です。）
手順はこちら。⇒　https://weblabo.oscasierra.net/docker-ubuntu1604/

```
C:\Users\user_xxx>docker pull ubuntu:latest
latest: Pulling from library/ubuntu
f3ef4ff62e0d: Pull complete
Digest: sha256:a0d9e826ab87bd665cfc640598a871b748b4b70a01a4f3d174d4fb02adad07a9
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest


C:\Users\user_xxx\Desktop\test1007\ubuntu>dir
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は 2E48-BBB4 です

 C:\Users\user_xxx\Desktop\test1007\ubuntu のディレクトリ

2021/10/09  00:04    <DIR>          .
2021/10/09  00:04    <DIR>          ..
               0 個のファイル                   0 バイト
               2 個のディレクトリ  47,020,986,368 バイトの空き領域

C:\Users\user_xxx\Desktop\test1007\ubuntu>mkdir logs

C:\Users\user_xxx\Desktop\test1007\ubuntu>docker run -it -d -p 18088:8080 -v /test1007/ubuntu/logs:/share/logs --name ubuntu2 ubuntu:latest
0c4116fadffb668957f92172be865bc6e021469983187cfad4fef1cf8033c1fd

C:\Users\user_xxx\Desktop\test1007\ubuntu>docker images
REPOSITORY                            TAG       IMAGE ID       CREATED         SIZE
tomcat-image                          latest    c8e1c9dafd3a   25 hours ago    596MB
ubuntu                                latest    597ce1600cf4   7 days ago      72.8MB
django                                latest    eb40dcf64078   4 years ago     436MB

C:\Users\user_xxx\Desktop\test1007\ubuntu>docker ps
CONTAINER ID   IMAGE           COMMAND   CREATED         STATUS         PORTS                                         NAMES
0c4116fadffb   ubuntu:latest   "bash"    8 minutes ago   Up 8 minutes   0.0.0.0:18088->8080/tcp, :::18088->8080/tcp   ubuntu2

C:\Users\user_xxx\Desktop\test1007\ubuntu>docker exec -it ubuntu2 /bin/bash
root@0c4116fadffb:/# pwd
/
root@0c4116fadffb:/# mkdir test
root@0c4116fadffb:/# ls
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  share  srv  sys  test  tmp  usr  var
```