初学者によるDocker理解まとめ⑤　〜EC2インスタンスにdockerコンテナをデプロイするまで〜

# はじめに
ようやくDockerを学び始めたので自分の理解をまとめておく。

前回 => https://qiita.com/theFirstPenguin/items/b5f6ed253bed95fbec5a
次回 => https://qiita.com/theFirstPenguin/items/01d0eff8bba7ca7c2d8e

# やったこと
* [前回](https://qiita.com/theFirstPenguin/items/b5f6ed253bed95fbec5a)の続き
* githubを介して、EC2にローカルPCのコードをアップロード
* そして`docker-compose up`!

# Githubを介して、EC2にローカルPCのコードをアップロード

####まずはEC2インスタンスにログイン
ローカルPCの`~/.ssh`にキーペアがあるとして、

```
cd ~/.ssh
ssh -i "ec2-key.pem" ec2-user@<public-ip>
```

####EC2インスタンス上で鍵を作る
```
ssh-keygen -t rsa
```
パスフレーズを聞かれるので、必要に応じてパスフレーズを入力する。
正しく鍵が作成されていると `~/.ssh` 以下に、`id_rsa` と `id_rsa.pub` に２つのファイルができる。
`id_rsa.pub` のほうが公開鍵なので、この中身を github の Deploy Key に登録することになる。
この公開鍵をコピーしておく。

```
cat ~/.ssh/id_rsa.pub
```


####コピーした公開鍵をGithubに登録する
[SSHキー登録ページ](https://github.com/settings/keys)で登録できる。
![スクリーンショット 2020-10-24 12.42.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572098/e3952432-3b6c-e939-a2ec-06acf948f49b.png)

Titleはキーの内容がわかる文面を記入し、Keyに先ほどコピーした公開鍵を貼り付ける。


####登録できたかをEC2から確認
```
ssh -T git@github.com
```

####EC2からgithubのレポジトリをクローンして終わり！

```
git clone git@github.com:yourname/yourrepo.git
```
![スクリーンショット 2020-10-24 12.50.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572098/b5984493-5767-9908-2510-10616f8f305e.png)

# そして`docker-compose up`!
その前に、一応おまじない。

```
sudo service docker start
```

そして

```
docker-compose up
```
あれ、なぜかエラー。。。
`Error: Cannot find module 'express'`ってなんで？ ちゃんと`package.json`に書いてあるじゃないですか。。。

```
Creating express-app ... done
Creating nginx-web   ... done
Attaching to express-app, nginx-web
express-app | node:internal/modules/cjs/loader:903
express-app |   throw err;
express-app |   ^
express-app | 
express-app | Error: Cannot find module 'express'
express-app | Require stack:
express-app | - /usr/src/app/index.js
express-app |     at Function.Module._resolveFilename (node:internal/modules/cjs/loader:900:15)
express-app |     at Function.Module._load (node:internal/modules/cjs/loader:745:27)
express-app |     at Module.require (node:internal/modules/cjs/loader:972:19)
express-app |     at require (node:internal/modules/cjs/helpers:88:18)
express-app |     at Object.<anonymous> (/usr/src/app/index.js:1:17)
express-app |     at Module._compile (node:internal/modules/cjs/loader:1083:30)
express-app |     at Object.Module._extensions..js (node:internal/modules/cjs/loader:1112:10)
express-app |     at Module.load (node:internal/modules/cjs/loader:948:32)
express-app |     at Function.Module._load (node:internal/modules/cjs/loader:789:14)
express-app |     at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:72:12) {
express-app |   code: 'MODULE_NOT_FOUND',
express-app |   requireStack: [ '/usr/src/app/index.js' ]
express-app | }
nginx-web | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
nginx-web | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
nginx-web | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
nginx-web | 10-listen-on-ipv6-by-default.sh: Getting the checksum of /etc/nginx/conf.d/default.conf
express-app exited with code 1
nginx-web | 10-listen-on-ipv6-by-default.sh: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
nginx-web | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
nginx-web | /docker-entrypoint.sh: Configuration complete; ready for start up
nginx-web | 2020/10/24 02:42:13 [emerg] 1#1: host not found in upstream "app" in /etc/nginx/nginx.conf:18
nginx-web | nginx: [emerg] host not found in upstream "app" in /etc/nginx/nginx.conf:18
nginx-web exited with code 1
```

[いろいろ調べた結果、何やら難しいことが起きている模様。](https://castaneai.hatenablog.com/entry/2019/01/29/151257)

アドバイスに従い、`docker-compose.yml`を修正。

```docker-compose.yml
     volumes:
      - './app:/usr/src/app'
      - usr/src/app/node_modules #追記
```

これでなんとかなりました！