GCPでDockerを立てるときの流れ

#目的
最近GCP(Google cloud Platform)にインスタンスを立てるのを失敗しまくっていて、何回もやり直しているので手順をまとめておきたい。初めてGCPをする人も追走しやすいように書く。
※ここではcontainer optimized OSは使用していない。理由はSSH接続のポート番号の変更の仕方がどうしてもわからないから(原因はOSログインをその時使っていたからかもしれない。いまだにOSログインの仕組みがよくわかっていない)。

なお、初めてなら以下の記事は参考になるのでチェックしてみてほしい。

https://qiita.com/Brutus/items/22dfd31a681b67837a74

#構造
1.GCPにインスタンスを立てたらまずすること
　-インスタンスの設定（すでに作っている人は省略可）
　-SSH鍵を作る
　　-SSH接続するポート番号を変更
　-ファイアウォールの設定を変更する
2.Dockerを使えるようにする
　-Dockerをインストールする
   -container optimizedを使用している場合
　-Docker利用のtips（GCEとは特に関係ない）


#GCPにインスタンスを立てたらまずすること
##インスタンスの設定（すでに作っている人は省略可）
GCPのGoogle Compute EngineにてVMインスタンスを作成する。
インスタンスの無料枠は2021年10月現在、E2-micro、30GB、リージョンは米国の一部となっている。この無料枠はお試し期間が終わってもAlways Freeで利用できる。

https://cloud.google.com/free/docs/gcp-free-tier/?hl=ja

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2125283/f5ca65e9-4feb-5579-f2eb-62be4000e975.png)

そんなわけで、インスタンスはE2-micro、30GB、リージョンは日本に一番近いらしいオレゴン、OSは標準で選択されていたDebianを使用する。

##SSH鍵を作る

SSH鍵を生成する。

```sh:
$ ssh-keygen -t rsa 
```

このコマンドを実行した後に三回質問されることになる。一回目はユーザー名を何にするか、二回目は鍵のパスフレーズの設定、三回目は二回目で設定したパスフレーズの確認（二回目と三回目の入力内容が異なるともう一度尋ねられる）。全部Enterを押したらスキップできる。
鍵の名前は指定しなければ、id_rsaになる。
※すでにid_rsaが存在していた場合は上書きされるので注意。

鍵を生成するときにオプションで鍵の名前も付けていると、一回目の質問はない。

次に公開鍵を表示する。

```sh:
$ cat ~/.ssh/id_rsa.pub
```
表示された公開鍵はCtr+Cでコピペしてインスタンスの編集画面から貼り付けておく（画面下部のほうに入力画面がある）。
※ターミナルで改行されている部分はそのまま改行されたままなので、貼り付けた後は改行をきちんと消しておこう。

最後に、秘密鍵を読み取り専用にする。

```
$ chmod 400 ~/.ssh/id_rsa
```

###SSH接続するポート番号を変更

標準の設定（ポート22）のままだと不正アタックの標的にされる。無料枠で使いたいならそれこそ番号の変更は必要。
以下のコマンドを実行して設定をバックアップする。

```
$ sudo cp -p /etc/ssh/sshd_config /etc/ssh/sshd_config.org
```
以下のコマンドを実行して、ポート番号を変更する。

```
$ sudo sed -i -e "s/#Port 22/Port 変更したいポート番号/g" /etc/ssh/sshd_config
```

あるいは以下の方法でもいい。

まずSSH設定ファイルにアクセスする。

```
$ sudo vi /etc/ssh/sshd_config
```
```
Port 任意のポート番号
```
標準ではおそらく、#Port　22　のような表記となっている。#はコメントアウトの意味なので、その下あたりに自分の作りたいポート番号を書いておくと分かりやすい。
ちなみに、ここではエディタの一種であるvimを使っている。そのため、初めてvimを見る人はvimの操作方法についてググるといい。

設定を読み込むためにSSHサービスを再起動する。

```sh:
 $ sudo systemctl restart sshd.service
```
###ファイアウォールの設定を変更する

ポート番号を変えたら、ファイアウォールの設定を変えないとそのインスタンスに入れなくなる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2125283/3327573b-edb7-1674-8ff1-ac6635940bec.png)

GCPメニューのVPCネットワークからファイアウォールを選択。それからファイアウォールの設定を新たに作るか、元々あるdefault-allow-sshの設定を変えて接続できるポート番号を変更する。

※ポート22の接続を拒否したい場合は、default-allow-sshからtcp:22を消すか、新たに設定を作って、ポート22を拒否するルールを作る。

####※Dockerのポート番号と連動させる

Dockerに設定としてポート番号が設定されている場合、ファイアウォールの設定をそのポート番号に合わせて追加しておく。デフォルトではdefault-allow-httpで80番が許可されている。

##Dockerを使えるようにする
###Dockerをインストールする
以下のコマンドを実行する。

```sh:dockerをインストール
$ sudo apt-get install docker
```

```sh:docker-composeをインストール
$ sudo apt-get install docker-compose
```

後は、任意のコンテナを立てたいディレクトリに移動してdocker-compose up -dする。

```
$ cd ディレクトリ名
$ docker-compose up -d
```

####container optimizedを使用している場合
container optimizedは最初からDockerがインストールされている。ただし、docker composeはインストールされていないので、コマンドを実行する必要がある。

```sh:
$ docker run docker/compose:1.29.2 version
```

1.29.2は現在でのバージョン。最新版を手に入れるには[Dockerのサイトからタグを入手](https://hub.docker.com/r/docker/compose/tags/)する。

任意のディレクトリに移動して、Docker-composeを行う。docker-compose up -d は使うことができないのに注意する。

```:コンテナを立てたいディレクトリに移動
$ cd ディレクトリ名
```

```sh:DockerComposeを行うコマンド
$ docker run --rm \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v "$PWD:/rootfs/$PWD" \
    -w="/rootfs/$PWD" \
    docker/compose:1.29.2 up
```
こんなコマンドいちいち打つのは嫌だ。docker-compose up -dでやりたいよ、という人はこちらの記事を参考に設定してください。

https://qiita.com/gorohash/items/608da9050b32db581802


##Docker利用のtips（GCEとは特に関係ない）

GCEとは特に関係ないが、覚えておくと便利なコマンドをまとめておく。

Dockerの中に入って作業を行うときのコマンド。このコマンドを使うことによって、中身のファイルを実行することができる状態になる。

```
$ docker exec -it コンテナ名 /bin/bash
```
コンテナ名を度忘れした場合は、

```
$ docker container ls
```
でコンテナの一覧を入手できる。


##参考資料
https://qiita.com/na59ri/items/c540d9d16a1fc1c5a9c4

https://eightyfivelife.com/2019/07/google-cloud-platform-gce-ssh/

https://blog.hashihei.com/2018/10/21/gcp%E3%81%A7vm%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%81%AEssh%E3%83%9D%E3%83%BC%E3%83%88%E7%95%AA%E5%8F%B7%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B/

https://kuttsun.blogspot.com/2020/07/gcp-docker.html

https://www.lisz-works.com/entry/gcp-ssh#SSH%E6%8E%A5%E7%B6%9A%E3%81%AE%E3%83%9D%E3%83%BC%E3%83%88%E5%A4%89%E6%9B%B4

https://qiita.com/gorohash/items/608da9050b32db581802

https://scrapbox.io/gyarasu/GCE%E3%81%AEContainer-Optimized_OS%E3%81%A7%E3%83%9D%E3%83%BC%E3%83%88%E3%83%95%E3%82%A9%E3%83%AF%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0