摘要:化應用程序此示例的目的是向你展示如何將應用程序放入容器中,該指南旨在用于開發,而不用于生產部署,本指南還假設你有一個有效的安裝,并且基本了解應用程序的結構。
Docker化Node.js Web應用程序
此示例的目的是向你展示如何將Node.js應用程序放入Docker容器中,該指南旨在用于開發,而不用于生產部署,本指南還假設你有一個有效的Docker安裝,并且基本了解Node.js應用程序的結構。
在本指南的第一部分中,我們將在Node.js中創建一個簡單的Web應用程序,然后我們將為該應用程序構建一個Docker鏡像,最后我們將該鏡像作為容器運行。
Docker允許你將具有所有依賴關系的應用程序打包到一個稱為容器的標準化單元中,用于軟件開發,容器是Linux操作系統分離出的基礎版本,鏡像是你加載到容器中的軟件。
創建Node.js應用程序首先,創建一個所有文件都將存在于其中的新目錄,在此目錄中,創建一個描述你的應用及其依賴項的package.json文件:
{ "name": "docker_web_app", "version": "1.0.0", "description": "Node.js on Docker", "author": "First Last", "main": "server.js", "scripts": { "start": "node server.js" }, "dependencies": { "express": "^4.16.1" } }
使用新的package.json文件,運行npm install,如果你使用的是npm版本5或更高版本,則會生成一個package-lock.json文件,該文件將被復制到你的Docker鏡像中。
然后,創建一個使用Express.js框架定義Web應用程序的server.js文件:
"use strict"; const express = require("express"); // Constants const PORT = 8080; const HOST = "0.0.0.0"; // App const app = express(); app.get("/", (req, res) => { res.send("Hello world "); }); app.listen(PORT, HOST); console.log(`Running on http://${HOST}:${PORT}`);
在接下來的步驟中,我們將了解如何使用官方Docker鏡像在Docker容器中運行此應用程序,首先,你需要構建應用程序的Docker鏡像。
創建Dockerfile創建一個名為Dockerfile的空文件:
touch Dockerfile
在你喜歡的文本編輯器中打開Dockerfile。
我們需要做的第一件事是定義我們想要構建的鏡像,在這里,我們將使用Docker Hub提供的最新LTS(長期支持)版本8 node:
FROM node:8
接下來,我們創建一個目錄來保存鏡像中的應用程序代碼,這將是你的應用程序的工作目錄:
# Create app directory WORKDIR /usr/src/app
這個鏡像已經安裝了Node.js和NPM,所以接下來我們需要做的是使用npm二進制文件安裝你的應用程序依賴項,請注意,如果你使用的是npm版本4或更早版本,則不會生成package-lock.json文件。
# Install app dependencies # A wildcard is used to ensure both package.json AND package-lock.json are copied # where available (npm@5+) COPY package*.json ./ RUN npm install # If you are building your code for production # RUN npm install --only=production
請注意,我們只復制package.json文件,而不是復制整個工作目錄,這使我們可以利用緩存的Docker層,bitJudo在這里有一個很好的解釋。
要將應用程序的源代碼捆綁在Docker鏡像中,請使用COPY指令:
# Bundle app source COPY . .
你的應用程序綁定到端口8080,因此你將使用EXPOSE指令讓docker守護程序映射它:
EXPOSE 8080
最后但并非最不重要的是,使用定義你運行時的CMD定義運行你應用程序的命令,這里我們將使用基本的npm start來運行node server.js來啟動你的服務器:
CMD [ "npm", "start" ]
你的Dockerfile現在應該如下所示:
FROM node:8 # Create app directory WORKDIR /usr/src/app # Install app dependencies # A wildcard is used to ensure both package.json AND package-lock.json are copied # where available (npm@5+) COPY package*.json ./ RUN npm install # If you are building your code for production # RUN npm install --only=production # Bundle app source COPY . . EXPOSE 8080 CMD [ "npm", "start" ].dockerignore文件
在與Dockerfile相同的目錄中創建一個.dockerignore文件,其中包含以下內容:
node_modules npm-debug.log
這樣可以防止將本地模塊和調試日志復制到Docker鏡像上,并可能覆蓋鏡像中安裝的模塊。
構建你的鏡像轉到具有Dockerfile的目錄,然后運行以下命令來構建Docker鏡像,使用-t標志可以標記鏡像,以便以后使用docker images命令更容易找到:
$ docker build -t/node-web-app .
你的鏡像現在將由Docker列出:
$ docker images # Example REPOSITORY TAG ID CREATED node 8 1934b0b038d1 5 days ago運行鏡像/node-web-app latest d64d3505b0d2 1 minute ago
使用-d運行鏡像以分離模式運行容器,使容器在后臺運行,-p標志將公共端口重定向到容器內的私有端口,運行你之前構建的鏡像:
$ docker run -p 49160:8080 -d/node-web-app
打印應用程序的輸出:
# Get container ID $ docker ps # Print app output $ docker logs# Example Running on http://localhost:8080
如果你需要進入容器內部,你可以使用exec命令:
# Enter the container $ docker exec -it測試/bin/bash
要測試你的應用程序,請獲取Docker映射的應用端口:
$ docker ps # Example ID IMAGE COMMAND ... PORTS ecce33b30ebf/node-web-app:latest npm start ... 49160->8080
在上面的示例中,Docker將容器內部的8080端口映射到計算機上的端口49160。
現在,你可以使用curl調用你的應用程序(如果需要,請通過以下方式安裝:sudo apt-get install curl):
$ curl -i localhost:49160 HTTP/1.1 200 OK X-Powered-By: Express Content-Type: text/html; charset=utf-8 Content-Length: 12 ETag: W/"c-M6tWOb/Y57lesdjQuHeB1P/qTV0" Date: Mon, 13 Nov 2017 20:53:59 GMT Connection: keep-alive Hello world
我們希望本教程可以幫助你在Docker上啟動并運行一個簡單的Node.js應用程序。
你可以在以下位置找到有關Docker和Node.js的更多信息:
官方Node.js Docker鏡像
Node.js Docker最佳實踐指南
官方Docker文檔
Stack Overflow上的Docker標記
Docker Subreddit
上一篇:輕松分析Node.js應用程序 下一篇:遷移到安全的Buffer構造函數文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/99193.html
Node.js 指南 Node.js?是基于Chrome的V8 JavaScript引擎構建的JavaScript運行時。 常規 關于Node.js 入門指南 輕松分析Node.js應用程序 Docker化Node.js Web應用程序 遷移到安全的Buffer構造函數 Node.js核心概念 阻塞與非阻塞概述 Node.js事件循環、定時器和process.nextTick() 不要阻塞事...
摘要:編程書籍的整理和收集最近一直在學習深度學習和機器學習的東西,發現深入地去學習就需要不斷的去提高自己算法和高數的能力然后也找了很多的書和文章,隨著不斷的學習,也整理了下自己的學習筆記準備分享出來給大家后續的文章和總結會繼續分享,先分享一部分的 編程書籍的整理和收集 最近一直在學習deep learning深度學習和機器學習的東西,發現深入地去學習就需要不斷的去提高自己算法和高數的能力然后...
閱讀 2052·2021-11-11 16:55
閱讀 1394·2021-09-28 09:36
閱讀 1038·2019-08-29 15:21
閱讀 1570·2019-08-29 14:10
閱讀 2756·2019-08-29 14:08
閱讀 1627·2019-08-29 12:31
閱讀 3243·2019-08-29 12:31
閱讀 976·2019-08-26 16:47