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


はじめに

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

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

やったこと

  • 前回の続き
  • 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_rsaid_rsa.pub に2つのファイルができる。
id_rsa.pub のほうが公開鍵なので、この中身を github の Deploy Key に登録することになる。
この公開鍵をコピーしておく。

cat ~/.ssh/id_rsa.pub

コピーした公開鍵をGithubに登録する

SSHキー登録ページで登録できる。

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

登録できたかをEC2から確認

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

git clone [email protected]:yourname/yourrepo.git

そして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

いろいろ調べた結果、何やら難しいことが起きている模様。

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

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

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