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

使用 Docker 將 Node.js 應用程序部署到 DigitalOcean Droplet

簡介

多年來,JavaScript 已經取得了長足的進步,我們現在可以非常輕鬆地編寫和部署 Web 應用程序。 Express、Sails 和 Meteor 等框架讓這一切變得更容易。

遵循互聯網上的大多數教程意味著您將使用本地項目在本地計算機上工作。但是,如果我們想與全世界或我們的朋友分享這個項目怎麼辦?今天我們將研究如何將 Node.js 應用程序部署到 DigitalOcean Droplet,以便互聯網上的任何人都可以與之交互。

先決條件

泊塢窗

我們將使用 Docker 將我們的應用程序容器化為一個易於部署的小型單元。這個單元可以部署在任何地方 安裝 Docker 的位置。

使用 Docker Hub 創建一個帳戶,並下載社區/桌面版。我們稍後會使用此帳戶!

DigitalOcean

DigitalOcean 是一項付費託管服務 - 我們將使用他們每月 5 美元的服務,我們可以在完成後立即將其關閉以最大程度地降低成本,但您需要在使用之前向 DigitalOcean 提供付款方式.

節點應用

為此,我們將創建一個簡單的 Express 應用程序,它為我們提供一個狀態端點,以便我們點擊並了解我們的應用程序是否正在運行。在命令行中,我們創建一個目錄:

$ mkdir digital-ocean

然後進入目錄並初始化我們的應用程序:

$ cd digital-ocean
$ npm init

隨意點擊ENTER 跳過/設置以下所有問題的默認答案,或者如果您願意,可以添加包名稱/描述。

出於本教程的目的,我們假設“入口點”保留為 index.js .你最終應該得到如下所示的東西:

package name: (digital-ocean)
version: (1.0.0)
description:
entry point: (index.js)
test command:
git repository:
keywords:
author:
license: (ISC)

{
  "name": "digital-ocean",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}


Is this OK? (yes)

如果您現在查看目錄(ls 在命令行上),你會看到一個孤獨的 package.json 文件。這包含我們應用程序的配置。讓我們跳進去,在“腳本”塊中添加一行:

{
  "name": "digital-ocean",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "node index.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

這允許我們通過運行 npm start 來啟動我們的應用程序 .腳本對於設置您將在應用程序中經常執行的任務非常有用,例如測試或各種構建過程。

接下來,我們要安裝 Express:

$ npm install express

最後,讓我們編寫為我們的 /status 服務的代碼 端點。在與我們的 package.json 相同的目錄中 文件,創建一個名為 index.js 的文件 :

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}!`))

最後,讓我們通過運行來測試我們的應用程序:

$ npm start

打開網絡瀏覽器並導航到 http://localhost:3000/status - 你應該得到這樣的問候:

{"status":"I'm alive!"}

我們現在有一個可以工作的 Express 應用程序,我們現在可以使用 Docker 和 Droplet 服務器捆綁和部署它。

Dockerizing 一個 Node.js 應用程序

我們現在有一個工作應用程序,但我們希望能夠部署它。我們可以創建一個服務器,然後將其設置為與我們當前的機器具有完全相同的配置,但這可能很繁瑣。相反,讓我們使用 Docker 打包它。

Docker 工作原理

Docker 允許我們定義一組指令來創建所謂的 layers .如果你想想像一個層是什麼樣子,想像你的文件系統在某個時刻凍結了。每個新層都是對該文件系統的修改或添加,然後再次凍結。

這些相互疊加的圖層組合形成了所謂的圖像 ,它本質上是一個盒子裡的文件系統,準備好了。

此圖像可用於創建容器 ,它們是該文件系統的實時版本,準備運行我們為其定義的任務。

另一個有用的方面是我們可以使用預製圖像作為我們自己圖像的第一層,通過避免樣板配置為我們提供了一個快速啟動。

構建 Docker 鏡像

我們要做的第一件事是創建一個 Dockerfile .該文件是 Docker 解釋的一組指令,以便準確了解如何將您的應用程序打包為映像。

在您的項目文件夾中,創建一個名為 Dockerfile 的文件 ,然後輸入以下命令:

FROM node:13-alpine

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install

COPY . .

EXPOSE 3000
CMD [ "npm", "start" ]

這裡有幾個組件,讓我們逐行看一下:

  • FROM node:10 :告訴 Docker 在我們的 Dockerfile 中使用另一個鏡像作為基礎層——在這種情況下,我們得到一個安裝了 Node.js 的鏡像,版本 10。

  • WORKDIR /usr/src/app :告訴 Docker 應該在其中執行以下命令的文件夾。

  • COPY package*.json ./ :告訴 Docker 只複製 package.json &package-lock.json 進入 Docker 鏡像。我們這樣做是因為 Docker 可以緩存 層的組合 - 這意味著如果我們的 package.json 沒有任何變化 ,我們可以只提取我們之前已經構建的層的組合。

  • RUN npm install :按照罐頭上說的做,然後運行 npm install 命令來創建一個安裝了我們所有模塊的圖像的新層。同樣,如果我們的 package.json 沒有任何變化 ,這將拉取一個預構建的版本。

  • COPY . . :將應用程序的其餘部分複製到文件系統中。由於應用程序可能會更頻繁地更改(即每次您進行代碼更改時),因此將其設置為用於緩存目的的最後一層是有意義的。

  • EXPOSE 3000 :告訴 Docker 在容器運行時打開容器上的 3000 端口。

  • CMD [ "npm", "start" ] :運行 npm start 在容器的實例化上,並在其中運行我們的應用程序。

運行我們的 Docker 構建

現在我們已經編寫了說明,讓我們實際構建我們的圖像!在與 Dockerfile 相同的目錄中,運行:

$ docker build . -t digital-ocean-app

這會構建一個圖像,然後給它一個特定的名稱或“標籤”——在本例中,它是 digital-ocean-app .為了測試我們的應用程序是否正常工作,讓我們在本地運行它:

$ docker run -p 3000:3000 digital-ocean-app

這會將我們的 Docker 鏡像作為容器運行,並執行 CMD 我們的 Dockerfile 的一部分。

-p 3000:3000 部分執行所謂的端口映射。冒號前面的數字是我們要映射的本地機器上的端口,後面的數字是我們希望路由通過的容器內的端口。

這意味著端口 3000 在我們的機器上現在將連接到端口 3000 在我們的應用程序正在運行的 Docker 容器中。

要對此進行測試,請打開瀏覽器並導航回 http://localhost:3000/status 你應該會看到你的狀態端點。

將鏡像發佈到 Docker Hub

現在我們有了打包的 Docker 鏡像,我們需要將它存儲在某個可以將其拉回的地方。您需要重新登錄 Docker Hub,然後單擊 'Create Repository' .就像 Git 存儲庫允許我們存儲版本控制的 Git 項目一樣,Docker 存儲庫允許我們存儲 Docker 映像。

您需要填寫存儲庫的名稱,以及可選描述以及它是公共存儲庫還是私有存儲庫(基本上,您是否需要以授權 Docker 用戶身份登錄)。

現在,將其公開,因為當我們嘗試部署到 DigitalOcean 時,它會讓我們的生活更輕鬆。最後,滾動到底部並點擊 'Create' .

回到命令行,我們需要在推送之前標記我們的圖像:

$ docker tag digital-ocean-app <USER_NAME>/digital-ocean-app

我們需要替換 <USER_NAME> 使用我們的 Docker Hub 用戶名的部分。可選地,如果我們想指定我們正在推送我們的圖像的特定版本,我們可以這樣做:

$ docker tag digital-ocean-app <USER_NAME>/digital-ocean-app:<VERSION>

<VERSION> 被稱為“圖像標籤”——我們可以在那裡放一個數字(1.0 , 1.1 等)來表示版本,甚至描述環境(dev , staging , prod )。我傾向於使用 Git 提交哈希,所以我確切地知道我正在運行什麼,並且可以與我的提交歷史進行比較。

默認情況下,每次推送時,你的倉庫都會自動創建一個帶有 :latest 標籤的鏡像 ,所以我們總是知道最近推送的圖片的標籤是什麼。

為了能夠推送到我們的存儲庫,我們需要登錄:

$ docker login

輸入您的 Docker Hub 憑據。

免費電子書:Git Essentials

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

成功登錄後,您將能夠通過以下方式推送您的圖片:

$ docker push <USER_NAME>/digital-ocean-app:<OPTIONAL_VERSION>

數字海洋

最後,我們可以將 dockerized 應用程序部署到 DigitalOcean 上。首先,讓我們創建一個帳戶:

您必須提供一些個人詳細信息,包括付款詳細信息以及設置初始項目。隨意給它起個名字,但如果您打算做任何廣泛的事情,請選擇一些選項來優化您的設置。

完成後,您將被重定向到項目的根頁面。左側是帶有多個選項的工具欄。隨意探索 - DigitalOcean 擅長讓您知道您將要做的事情是否會花費您。

創建 SSH 密鑰

在我們做任何事情之前,我們需要創建一個 SSH 密鑰 並將公共部分上傳到 DigitalOcean。 SSH 密鑰分為兩部分,公鑰和私鑰。

私鑰用於對系統的用戶進行身份驗證。系統通過使用公鑰執行一項功能來驗證私鑰是否是用於生成公鑰的功能。如果是,他們都來自同一個地方,因此用戶可以被信任。

DigitalOcean 需要一個可以放置在我們啟動的任何 Droplet 上的公鑰,以便我們可以使用只有我們知道的密鑰訪問它們我們 有。

讓我們創建一個 SSH 密鑰對 現在:

$ ssh-keygen -t rsa -b 4096

此命令應該適用於 Windows、Linux 和 MacOS。

這將詢問您要保存密鑰的文件,您可以將其稱為 - digital-ocean-key .

它還會要求輸入密碼 - 如果您願意,可以隨意設置一個,或者您可以將其留空。如果您在我們一直在處理的同一文件夾中創建它,您將看到兩個文件 - 一個名為 digital-ocean-key 還有一個叫 digital-ocean-key.pub - 這些分別是您的私鑰和公鑰。

將 SSH 密鑰添加到您的 DigitalOcean 帳戶

在您的 DigitalOcean 帳戶的左下角,有一個 'Security' 鏈接 .點擊此鏈接,下一頁將有一個添加 SSH 密鑰的選項:

點擊“添加 SSH 密鑰” 你會看到一個對話框來輸入你的密鑰。只需複制 digital-ocean-key.pub 的內容 進入大文本框(您可以使用 cat digital-ocean-key.pub 將內容打印到終端 )。

在其下方較小的框中,為該鍵命名。

設置 DigitalOcean Droplet

添加 SSH 密鑰後。點擊“水滴” 左側的鏈接,然後在下一頁單擊“創建 Droplet” .

在 DigitalOcean 中,Droplet 是一個私有虛擬服務器,可以輕鬆配置並用於運行您的應用程序。

在此頁面上,您將看到用於配置 DigitalOcean Droplet 的多個選項,包括分發、計劃、每月大小/成本、區域和身份驗證。

我們將讓 DigitalOcean 為我們創建一個已經在其上運行 Docker 的 Droplet,而不是選擇一個發行版並自己配置它。

點擊“市場” 在各種 Linux 發行版之上 - 在這裡您可以找到各種現有配置 - 這些是 Droplet,當啟動時,將使用已安裝的所述軟件啟動。

這樣可以節省實時時間,這意味著如果我們願意,我們可以使用完全相同的配置啟動多個實例,而不必單獨配置它們。

Docker Droplet 應該有一個選項 .如果沒有,請點擊“查看所有 Marketplace 應用” ,你就可以在那裡找到合適的 Docker 配置:

根據“計劃” ,我們要選擇'標準' .讓我們選擇每月 5 美元的選項,以進行演示。

隨意選擇適合您的區域 - 通常最近的區域最容易進入,但不會產生巨大影響。

在身份驗證下,選擇 'SSH 密鑰' ,然後選擇您要使用的鍵(如您在上一步中創建的鍵)。如果你願意,你也可以命名你的 Droplet。完成後,單擊“創建 Droplet” 在底部。

等待一分鐘,讓您的 Droplet 啟動。它會出現在 'Droplets' 下 當它啟動並準備好時,面板旁邊有一個綠點。至此,我們已經準備好連接它了。

在 DO Droplets 上運行 Docker 鏡像

單擊已啟動的 Droplet,您將看到有關它的詳細信息。目前,我們對 IP 地址感興趣——這是 Droplet 在互聯網上的地址。

要訪問它,我們需要使用我們之前創建的私鑰連接到它。從與該私鑰相同的文件夾中,運行:

$ ssh -i digital-ocean-key [email protected]<IP_ADDRESS>

-i digital-ocean-key 指定您正在使用 SSH 密鑰,以及該密鑰所在的位置。 [email protected]<IP_ADDRESS> 指定用戶和您嘗試連接的地址 - 在本例中,我們嘗試連接的用戶是 root , IP 地址就是 DigitalOcean Droplet 的地址。

連接到實例後,只需運行 Docker 映像即可。如果你將它留在公共存儲庫中,那麼你可以使用與推送它相同的名稱輕鬆運行它:

$ docker run -p 3000:3000 <DOCKER_USER_NAME>/digital-ocean-app:<OPTIONAL_TAG>

如果你把它放在私有倉庫中,你需要使用 docker login 登錄 在運行 docker run 之前再次 命令。

Docker 容器運行後,在瀏覽器中打開一個選項卡並導航到 <IP_ADDRESS>:3000/status - <IP_ADDRESS> 是您運行容器的 DigitalOcean Droplet 的 IP 地址。

您應該看到之前創建的狀態端點 - 恭喜!你現在有一個在 DigitalOcean 上運行的 Node.js 應用程序!

結論

您可以從這裡進入幾個方向。首先,您可能希望構建您的應用程序,以便它可以做更多有用的事情。

您可能想考慮購買一個域來託管您的應用程序,並將其指向您的 DigitalOcean Droplet,以便更容易訪問。

我還建議探索 DigitalOcean 的其他一些功能——您可以使用他們的一些網絡工具通過限制對 SSH 端口 (22) 的訪問來保護您的 Droplet,探索 Docker 擁有的其他一些圖像,或者甚至看看為您的應用程序構建數據庫!


Tutorial JavaScript 教程
  1. 用JS滾動到頂部

  2. jQuery 從字符串創建數組

  3. Vue 和本地存儲?

  4. 使用 HTML 和 CSS 的 Glassmorphism 側邊導航

  5. 最佳現代 JavaScript  — 地圖

  6. 模板文字和標記的模板文字

  7. 應用於 JavaScript 的干淨代碼——第四部分。註釋

  1. 我是如何開始我的 Web 開發之旅的

  2. 如何在 React 中使用 Axios Post 請求發送表單數據

  3. Typescript 類型終極指南

  4. 使用 Angular ComponentFactory 的工具提示工件

  5. 在 MS Paint 3D 中獲取免費的 3D 模型,然後將其添加到 BabylonJS 項目中

  6. 足夠的 JavaScript 讓你開始:#7 條件

  7. 如何在 JavaScript 中獲取 p 標籤文本 |獲取段落文本示例

  1. TypeError:無法讀取nodejs中post方法中未定義的屬性'0'

  2. JavaScript 代碼清理:如何重構以使用類

  3. 使用 Axios 調用 Alexa API

  4. JavaScript 新對象 |基本代碼