日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用nodejs构建Docker image最佳实践

發布時間:2024/2/28 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用nodejs构建Docker image最佳实践 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 簡介
  • 準備nodejs應用程序
  • 創建Dockerfile文件
  • 創建.dockerignore文件
  • 創建docker image
  • 運行docker程序
  • node的docker image需要注意的事項

簡介

docker容器的出現,徹底的改變了應用程序的運行方式,而nodejs同樣的也顛覆了后端應用程序的開發模式。兩者結合起來,就會產生意想不到的作用。

本文將會以一個常用的nodejs程序為例,分析怎么使用docker來構建nodejs image.

準備nodejs應用程序

一個標準的nodejs程序,需要一個package.json文件來描述應用程序的元數據和依賴關系,然后通過npm install來安裝應用的依賴關系,最后通過node app.js來運行程序。

本文將會創建一個簡單的koa應用程序,來說明docker的使用。

首先創建package.json文件:

{"name": "koa-docker","description": "怎么將nodejs koa程序打包成docker應用","version": "0.0.1","dependencies": {"ejs": "^2.5.6","fs-promise": "^2.0.3","koa": "^2.2.0","koa-basic-auth": "^2.0.0","koa-body": "^4.0.8","koa-compose": "^4.0.0","koa-csrf": "^3.0.6","koa-logger": "^3.0.0","@koa/router": "^8.0.5","koa-session": "^5.0.0","koa-static": "^3.0.0","koa-views": "^6.0.2"},"scripts": {"test": "NODE_ENV=test mocha --harmony --reporter spec --require should */test.js","lint": "eslint ."},"engines": {"node": ">= 7.6"},"license": "MIT" }

上面的package.json文件制定了項目的依賴。

接下來,我們需要使用npm install來安裝項目的依賴,安裝好的項目依賴文件將會放在本地的node_modules文件夾中。

然后我們就可以編寫服務程序了:

const Koa = require('koa'); const app = module.exports = new Koa();app.use(async function(ctx) {ctx.body = 'Hello www.flydean.com'; });if (!module.parent) app.listen(3000);

上面是一個非常簡單的koa服務端程序,監聽在3000端口,并且對每次請求都會返回‘Hello www.flydean.com’。

運行node app.js 我們就可以開啟web服務了。

好了,我們的服務程序搭建完畢,接下來,我們看一下docker打包nodejs程序的最佳實踐。

創建Dockerfile文件

為了創建docker image,我們需要一個Dockerfile文件,作為該image的描述。

我們一步一步的講解,如何創建這個Dockerfile文件。

  • 引入base image。
  • 為了運行docker程序,我們需要指定一個基本的image,比如操作系統,node為我們提供了一個封裝好的image,我們可以直接引用:

    FROM node:12

    我們指定了node的12版本,這個版本已經安裝好了最新的LTS node 12,使用這個image我們就可以不需要自己來安裝node的相關環境,非常的方便。

  • 指定工作目錄
  • 有了image,接下來就需要我們指定docker中的工作目錄:

    # Create app directory WORKDIR /data/app
  • 安裝node_modules
  • 接下來我們需要將package*.json文件拷貝進image中,并且運行npm install來安裝依賴庫:

    COPY package*.json ./RUN npm install

    上面我們拷貝的是package*.json,因為如果我們本地運行過npm install命令的話,將會生成一個pacakge-lock.json文件。這個文件是為了統一依賴包版本用的。我們需要一并拷貝。

    拷貝完之后就可以運行npm install來安裝依賴包了。

    問題?為什么我們只拷貝了pacakge.json,而不是拷貝整個工作目錄呢?

    回答:docker file中的每一個命令,都會導致創建一個新的layer,上面的docker file中,只要pakage.json沒有被修改,新創建的docker image其實是可以共享layer緩存的。

    但是如果我們直接添加本地的工作目錄,那么只要我們的工作目錄有文件被修改,會導致整個docker image重新構建。所以為了提升構建效率和速度,我們只拷貝package.json。

  • 拷貝應用程序并運行
  • 最后的工作就是拷貝應用程序app.js然后運行了:

    # 拷貝應用程序 COPY app.js .# 暴露端口 EXPOSE 8080# 運行命令 CMD [ "node", "app.js" ]

    最后,我們的dockerfile文件應該是這樣的:

    FROM node:12# Create app directory WORKDIR /data/appCOPY package*.json ./RUN npm install# 拷貝應用程序 COPY app.js .# 暴露端口 EXPOSE 8080# 運行命令 CMD [ "node", "app.js" ]

    創建.dockerignore文件

    我們知道git會有一個.gitignore文件,同樣的docker也有一個.dockerignore文件,這個文件的作用就是避免你的本地文件被拷貝到docker image中。

    node_modules

    比如我們可以在其中指定node_modules,使其不會被拷貝。

    創建docker image

    創建docker image很簡單,我們可以使用下面的命令:

    docker build -t flydean/koa-web-app .

    創建完畢之后,我們可以使用docker images來查看剛剛創建好的image :

    docker images# Example REPOSITORY TAG ID CREATED node 12 1934b0b038d1 5 days ago flydean/koa-web-app latest d64d3505b0d2 1 minute ago

    運行docker程序

    最后,我們可以通過docker run命令來運行應用程序

    docker run -p 54321:8080 -d flydean/koa-web-app

    然后我們就可以通過本地的54321端口來訪問應用程序了。

    node的docker image需要注意的事項

    這里我們來探討一下創建docker image需要注意的事項。

  • 不要使用root用戶來運行應用程序
  • 默認情況下,docker中的應用程序會以root用戶來運行,為了安全起見,建議大家以普通用戶來運行應用程序,我們可以在docker file中指定:

    FROM node:12 ... # 在最后,以node用戶來運行應用程序 USER node

    或者我們在運行的時候以 -u “node” 作為啟動參數來指定運行的用戶。

    docker run \-u "node"flydean/koa-web-app
  • 指定運行時候的NODE_ENV
  • node的應用程序很多時候需要依賴于NODE_ENV來指定運行時環境,我們可以以參數的形式傳遞給docker run命令:

    docker run \ -e "NODE_ENV=production"flydean/koa-web-app

    本文作者:flydean程序那些事

    本文鏈接:http://www.flydean.com/nodejs-docker-best-practices/

    本文來源:flydean的博客

    歡迎關注我的公眾號:「程序那些事」最通俗的解讀,最深刻的干貨,最簡潔的教程,眾多你不知道的小技巧等你來發現!

    總結

    以上是生活随笔為你收集整理的使用nodejs构建Docker image最佳实践的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。