Dockerの実験（その１：コンテナの作成）

Google Cloud の Compute Engine で、[Container optimized-os](https://cloud.google.com/container-optimized-os/docs/how-to?hl=ja) を選ぶ。
コンソールから、CLOUD SHELL Terminal をクリックする。
承認をクリックする。

```bash
$ gcloud compute ssh --project <プロジェクト名> --zone asia-northeast1-b docker-test
```

鍵を作成するとの表示になったら、y　を押下する。

docker バイナリを確認する。

```bash
$ which docker
/usr/bin/docker
```

docker イメージが存在しないことを確認する。

```bash
$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
```

現在のところイメージがないので、以下のコマンドで、docker hub から nginx イメージをダウンロードする。

```bash
$ docker image pull nginx
```

パラパラと表示が出る。
イメージを確認する。

```bash
$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
nginx        latest    3f8a00f137a0   6 days ago   142MB
```

現在のところ、コンテナは存在しないことを確認する。

```bash
$ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
```

nginxコンテナを起動する(-d:detach, -t:tty, -p:port)。

```bash
$ docker container run -dt -p 80:80 nginx
fe8d52bced5e983a1d3e06571653ac363ea8a7aca190667096220b66ee24b527
```

コンテナが起動していることを確認する。

```bash
$ docker container ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                               NAMES
fe8d52bced5e   nginx     "/docker-entrypoint.…"   4 minutes ago   Up 4 minutes   0.0.0.0:80->80/tcp, :::80->80/tcp   funny_wu
```

webブラウザからこのインスタンスのグローバルIPを確認して、ブラウザに入れても、到達できないことを確認する。

Google Cloud のこのインスタンスのみに、80番ポートをオープンする方法。

(参考)
https://stackoverflow.com/questions/21065922/how-to-open-a-specific-port-such-as-9090-in-google-compute-engine

```bash
NETWORKING->VPC network->Firewall->Create a firewall rule
Name:http-for-docker
Description:http-for-docker
Logs:off
Network:default
Priority:1000
Direction of traffic:Ingres
Action on match:Allow
Tagets:Specified target tags
Target tags:docker-test
Source filter:IPv4 ranges
Source IPv4 ranges:<MYIP>/32
Second source filter:None
Protocols and ports:Specified protocols and ports:TCP:80
```

CREATEをクリックする。

Google Cloud で作成した Firewall rule を特定の　 vm インスタンス に適用する方法。

```bash
インスタンスをクリックする。
EDITアイコンをクリックする。
Network interfaces に行って、Network tags に、docker-test（設定したアドレスからのみアクセス可能） と入れる。
なお、Allow HTTP traffic にチェックを入れると、全世界からアクセス可能となるが、今回は、作成した Firewall Rule で、自分だけがアクセスできるようにしておく。
```

SAVEをクリックする。

ブラウザから確認する。
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
```

ちなみに、プロジェクトのデフォルトゾーンに存在しているインスタンスならば、ゾーンオプションは省略できる。
上記コマンドにより、vm のグローバル IP がわかったので、ブラウザから確認してみる。

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

Welcome to nginx! を確認する。

コンテナを停止してみる（funny_wu というのは、Dockerが自動的につけてくれた名前）。

```bash
$ docker container stop funny_wu
funny_wu
```

コンテナが確認できないことを確かめる。

```bash
$ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
```

curl コマンドでも確認する。

```bash
$ curl -I <vm のグローバルIP>:80
curl: (28) Failed to connect to 35.200.126.110 port 80 after 131817 ms: 接続がタイムアウトしました
```

netstatコマンドで、80番ポートが開いていないことを確認する。

```bash
$ netstat -ntlp
(No info could be read for "-p": geteuid()=20163 but you should be root.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      -
tcp        0      0 127.0.0.1:33905         0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -
tcp6       0      0 :::22                   :::*                    LISTEN      -
```

コンテナの STATUS が、Exited となっていることを確認する。

```bash
$ docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED        STATUS                     PORTS     NAMES
fe8d52bced5e   nginx     "/docker-entrypoint.…"   10 hours ago   Exited (0) 5 minutes ago             funny_wu
```

コンテナを立ち上げる。

```bash
$ docker container start funny_wu
funny_wu
```

コンテナが立ち上がったことを確認する。

```bash
$ docker container ps
CONTAINER ID   IMAGE     COMMAND                  CREATED        STATUS          PORTS                               NAMES
fe8d52bced5e   nginx     "/docker-entrypoint.…"   10 hours ago   Up 13 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   funny_wu
```

netstat コマンドで 80 番ポートが開いていることを確認する。

```bash
$ netstat -ntlp
(No info could be read for "-p": geteuid()=20163 but you should be root.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      -
tcp        0      0 127.0.0.1:33905         0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      -
tcp6       0      0 :::22                   :::*                    LISTEN      -
tcp6       0      0 :::80                   :::*                    LISTEN      -
```

curl コマンドで確認してみる。

```bash
$ curl -I <vm のグローバル IP>:80
HTTP/1.1 200 OK
Server: nginx/1.23.3
Date: Thu, 16 Feb 2023 09:23:33 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Tue, 13 Dec 2022 15:53:53 GMT
Connection: keep-alive
ETag: "6398a011-267"
Accept-Ranges: bytes
```

[その２：コンテナの調査](https://qiita.com/intrajp/items/10783090fa9b5501ec7c)