JavaScript >> Javascript 文檔 >  >> Node.js

使用 Docker 將 Node.js 應用程序部署到 AWS EC2

簡介

一旦您編寫了一個 Web 應用程序,就會有許多產品可以讓您的應用程序在線並可供其他人使用。一個眾所周知的產品是 Amazon Web Services (AWS) 平台的一部分 - 彈性計算雲 (EC2)。

EC2 是 AWS 的核心部分,AWS 的許多其他服務都建立在它之上——因此了解 EC2 是什麼以及如何部署到它是很好的。

在本教程中,我們將使用 Docker 創建一個基本的 Node.js 應用程序,啟動和配置一個 EC2 實例,並將我們的應用程序部署到它。在本教程結束時,您將在 AWS 上運行 Node 應用程序,並更好地了解如何與核心 AWS 服務交互。

先決條件

AWS 賬戶

Amazon Web Services (AWS) 是一組用於在雲中構建應用程序的工具。由於 EC2 是 AWS 服務,我們需要設置一個 AWS 賬戶。

AWS 為很多很棒的東西提供免費套餐,EC2 也不例外 - 您可以在免費套餐中每月免費使用 750 小時(31 天)的 EC2,一整年。

泊塢窗

Docker 允許我們將我們的應用程序捆綁成小型、易於部署的單元,這些單元可以在任何地方運行 安裝 Docker 的位置。這意味著不再是“但它可以在我的機器上運行!”

本文將假定您對 Docker 有基本的了解,並且不會對其進行深入探討 - 但是,如果您想進行更深入的研究,請查看使用 Docker 將 Node.js 應用程序部署到 DigitalOcean Droplet。

節點應用

讓我們創建一個響應請求的非常簡單的 Node 應用程序。為此,我們將打開一個終端並運行:

$ mkdir node-ec2
$ cd node-ec2
$ npm init

這將創建一個新文件夾,移動到該文件夾,然後初始化一個新的 Node 應用程序。

現在讓我們堅持使用 NPM 默認值 - 本文假設您將入口點設置為 index.js .這將生成我們的 package.json 文件,它本質上是我們應用的配置文件。

一旦 package.json 創建文件,打開它並將以下行添加到 scripts 的開頭 部分:

"start": "node index.js",

通過這樣做,而不是運行 node index.js ,我們將使用 npm start ,它將運行我們腳本中的所有內容。在這種特定情況下,它只運行 node index.js ,但實際上,它可能遠不止於此。例如,如果我們可以在命令中添加標誌而不必每次都輸入,或者我們可以設置一些環境變量,如 NODE_ENV=production node index.js .

為了滿足我們的要求,我們將使用 Express 框架 - 它簡約且易於上手:

$ npm install express --save

我們的 package.json 現在應該看起來像這樣:

{
  "name": "app",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "node index.js"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.17.1"
  }
}

等待安裝,然後我們將打開首選代碼編輯器,在同一位置創建另一個名為 index.js 的新文件 .

該文件將設置 Express 並定義一個請求處理程序:

const express = require('express');
const app = express();
const port = 3000;

app.get('/status', (req, res) => res.send({status: "I'm alive!"}));

app.listen(port, () => console.log(`Example app listening on port ${port}!`));

此應用將在端口 3000 上啟動 ,並將在 /status 處為端點提供服務 .我們可以通過運行來驗證它是否有效:

$ npm start
Example app listening on port 3000!

前往http://localhost:3000/status - 我們應該用 {status: "I'm alive!"} 得到響應 .一旦成功,請確保使用 CTRL 停止服務器 +C .

準備好簡單的 Node 應用程序後,讓我們將其轉換為 Docker 映像,然後部署到 EC2。

Docker 化節點應用程序

在與 Node 應用程序相同的目錄中創建一個名為 Dockerfile 的新文件 :

FROM node:13-alpine

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install

COPY . .

EXPOSE 3000
CMD [ "node", "index.js" ]

這是一個基本的 Dockerfile,可用於大多數簡單的 Node 應用程序。接下來,讓我們構建 Docker 鏡像,然後運行它來驗證它是否正常工作:

$ docker build . -t ec2-app
$ docker run -p 3000:3000 ec2-app

如果您導航到 http://localhost:3000/status 同樣,您應該會看到與之前相同的狀態響應。使用 CTRL 退出進程 +C 再次。

最後,將我們的 Docker 鏡像推送到 Docker Hub:

$ docker login # Use your Docker Hub credentials here
$ docker tag ec2-app <YOUR_DOCKER_USERNAME>/ec2-app
$ docker push <YOUR_DOCKER_USERNAME>/ec2-app

設置 EC2

使用我們的應用程序“dockerized”,我們需要設置一個 EC2 實例來運行它。

前往 AWS 並登錄。

點擊“服務” 頁面頂部的下拉菜單,然後搜索 'EC2' . AWS 目前正在試驗他們的界面,因此您應該會看到一個類似於下圖的頁面,但頁面的中心可能看起來略有不同。

點擊“實例” 鏈接在左邊。

在下一個視圖中,單擊“啟動實例” 按鈕。您將看到如下所示的頁面:

AMI

這是我們選擇Amazon Machine Image的地方 - 或 AMI 簡而言之。 AMI 是“開箱即用”的服務器,可以有多種配置。

例如,我們可以選擇 Quick Start AMIs 之一 有 Amazon Linux 2 在它們上,或者如果你向下滾動,有運行 Ubuntu 的實例,等等。

每個 AMI 都是具有操作系統的機器的凍結映像,並且可能安裝了一些額外的軟件。

免費電子書:Git Essentials

查看我們的 Git 學習實踐指南,其中包含最佳實踐、行業認可的標準以及隨附的備忘單。停止谷歌搜索 Git 命令並真正學習 它!

為方便起見,我們可以使用它來構建一個已經為我們配置了 Docker 的 EC2 實例!

為此,我們需要選擇 'AWS Marketplace' 在左側,然後在我們要輸入的搜索框中輸入 'ECS' .我們應該得到一些結果,但我們想要 'ECS Optimized Amazon Linux 2' 圖片。

此映像隨 Docker 一起提供,並針對運行容器進行了優化。點擊'選擇' 在所選圖像上,我們將繼續到下一頁:

實例類型

在下一個視圖中,我們選擇我們想要的實例類型。通常,這決定了我們正在啟動的服務器可用的資源,並為更高性能的機器擴展成本。

t2.micro 實例類型符合免費套餐條件,因此建議使用:

選擇相應的複選框,然後單擊“查看並啟動” 在右下角。點擊“啟動” 在下一頁的同一個地方,您會得到一個彈出窗口來選擇或創建一個密鑰對。

選擇第一個下拉菜單,然後選擇 'Create a new key pair' .在 “密鑰對名稱”下 , 輸入您要調用的密鑰對。

確保“下載密鑰對” 在右側 - 這是我們將用來訪問我們的 EC2 實例的內容。

通過選擇“啟動實例” 再次,您的 EC2 實例應該會啟動:

單擊突出顯示的鏈接將轉到實例詳細信息頁面。

安全組

在我們嘗試運行我們的應用程序之前,我們需要確保我們能夠訪問該應用程序。

大多數 AWS 資源在“安全組”下運行 - 這些組規定瞭如何訪問資源、在哪個端口以及從哪個 IP 地址訪問資源。

單擊此處突出顯示的安全組:

從這裡,您將能夠查看有關安全組的詳細信息,包括它在各個選項卡中的入站和出站規則。在入站選項卡下,您可能會看到以下內容:

這意味著通過端口 22 進入的流量 ,使用 TCP 協議,可以從任何地方(0.0.0.0/0 意思是任何地方 )。我們需要添加另一個規則以允許任何人在端口 3000 訪問我們的應用程序 .

在頁面頂部,單擊“操作” 然後點擊“編輯入站規則” .在打開的對話框中,單擊“添加規則” .

設置規則的端口範圍為3000 ,然後在 Source 下單擊下拉菜單並選擇 'Anywhere' .其餘部分應自動填充。

最終,您應該得到如下結果:

連接到您的 EC2 實例

回到'Instances' 頁面(單擊左側的鏈接)並選擇您之前創建的實例。您的 EC2 實例的地址位於 'Public DNS' 下的安全組鏈接上方 字段。

返回終端,然後導航到您之前下載的密鑰對所在的文件夾。它將被命名為您為密鑰對名稱輸入的任何內容,並帶有 .pem 作為它的擴展。

讓我們更改密鑰的權限,然後 SSH 進入 EC2 實例:

$ chmod 400 <NAME_OF_KEYPAIR_FILE>
$ ssh -i <NAME_OF_KEYPAIR_FILE>[email protected]<PUBLIC_DNS>

從這裡,我們只需要通過 Docker 啟動我們的應用程序:

$ docker run -p 3000:3000 <YOUR_DOCKER_USERNAME>/ec2-app

您將能夠使用您用於通過 SSH 連接到實例的相同地址訪問該實例。只需在瀏覽器中導航到:

<PUBLIC_DNS>:3000/status

您的應用程序應該向您返回我們之前看到的狀態端點。恭喜,您剛剛在 EC2 上運行了您的第一個應用程序!

下一步是什麼?

無頭運行您的應用

然而,一個快速的勝利是“無頭”運行應用程序。到目前為止,您的應用程序當前正在您的 shell 會話中運行 - 一旦您關閉該會話,應用程序就會終止!

要以在後台繼續運行的方式啟動應用程序,請使用附加的 -d 運行應用程序 標誌:

$ docker run -d -p 3000:3000 <YOUR_DOCKER_USERNAME>/ec2-app

安全

您可能希望返回並使用不同的配置加強實例/實驗的安全性 - 例如將其配置為只有 我們 比如可以訪問SSH端口。

更改“來源” “我的 IP” 的第一條規則字段 - AWS 會自動找出你從哪裡訪問它。

注意: 如果您在移動中運行本教程,或者稍後再返回,您的計算機的 IP 可能與您最初設置 'My IP' 時的 IP 不同 .如果您以後遇到任何困難,請務必返回此處並選擇“我的 IP” 又來了!

其他 AMI

有數百種不同的 AMI,其中很多來自不同的社區,並且已經預先安裝了應用程序 - 值得一看,看看是否有一種簡單的方法來設置您想要使用的東西!

添加域

現在您已經在服務器上運行了一個應用程序,您可能需要設置一個域名並將其指向您的應用程序。

結論

EC2 確實是許多 AWS 服務的骨幹——例如,RDS(AWS 的數據庫服務)實際上只是經過高度優化的 EC2 實例,具有漂亮的儀表板。

了解 AWS 庫中的這一核心產品必將為實現想法的新方法打開大門。

在本教程中,我們在 Express 的幫助下創建了一個簡單的 Node.js 應用程序,將其 docker 化,設置 EC2 以進行部署,最後 - 將其部署到 EC2 實例。


Tutorial JavaScript 教程
  1. 專業人士如何擺脫相對進口

  2. 通過緩存 Auth0 M2M 令牌節省 $$$

  3. TypeError:fs.​​existsSync 不是函數

  4. React SVG 動畫(使用 React Spring)#3

  5. 掌握角度所需的頂級技能👨‍💻

  6. 了解 JavaScript 中的閉包(與美味的墨西哥食物)

  7. 使用 JavaScript 將文本框值保存到文件

  1. React Tricks Miniseries 7:如何為不同的數據類型設置狀態

  2. Twitter Bootstrap 選項卡:在頁面重新加載或超鏈接時轉到特定選項卡

  3. 在您的 Javascript 項目中使用調解器來提高生產力

  4. Node.js 中的服務器端源映射

  5. 服務器發送的事件

  6. 單元測試(React + Typescript)

  7. 使用 React 和 Webpack 教程

  1. 數據結構 + 算法簡介 [第 1 部分]

  2. JavaScript 面試問題 #17:兩個空數組之和

  3. 社論:基準,還是不基準?

  4. 選擇正確的 Node.js 框架:Express、Koa 還是 Hapi?