Google Cloud の Compute Engine で、Container optimized-os を選ぶ。
コンソールから、CLOUD SHELL Terminal をクリックする。
承認をクリックする。
$ gcloud compute ssh --project <プロジェクト名> --zone asia-northeast1-b docker-test
鍵を作成するとの表示になったら、y を押下する。
docker バイナリを確認する。
$ which docker
/usr/bin/docker
docker イメージが存在しないことを確認する。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
現在のところイメージがないので、以下のコマンドで、docker hub から nginx イメージをダウンロードする。
$ docker image pull nginx
パラパラと表示が出る。
イメージを確認する。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 3f8a00f137a0 6 days ago 142MB
現在のところ、コンテナは存在しないことを確認する。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
nginxコンテナを起動する(-d:detach, -t:tty, -p:port)。
$ docker container run -dt -p 80:80 nginx
fe8d52bced5e983a1d3e06571653ac363ea8a7aca190667096220b66ee24b527
コンテナが起動していることを確認する。
$ 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番ポートをオープンする方法。
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 インスタンス に適用する方法。
インスタンスをクリックする。
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
$ 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 がわかったので、ブラウザから確認してみる。
http://<vm のグローバル IP>
Welcome to nginx! を確認する。
コンテナを停止してみる(funny_wu というのは、Dockerが自動的につけてくれた名前)。
$ docker container stop funny_wu
funny_wu
コンテナが確認できないことを確かめる。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
curl コマンドでも確認する。
$ curl -I <vm のグローバルIP>:80
curl: (28) Failed to connect to 35.200.126.110 port 80 after 131817 ms: 接続がタイムアウトしました
netstatコマンドで、80番ポートが開いていないことを確認する。
$ 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 となっていることを確認する。
$ 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
コンテナを立ち上げる。
$ docker container start funny_wu
funny_wu
コンテナが立ち上がったことを確認する。
$ 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 番ポートが開いていることを確認する。
$ 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 コマンドで確認してみる。
$ 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