您好,登錄后才能下訂單哦!
這篇文章主要介紹了Windows下如何用Docker部署Node.js開發環境的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Windows下如何用Docker部署Node.js開發環境文章都會有所收獲,下面我們一起來看看吧。
先明確一下我們希望實現的效果:
1、依然在windows下編輯源代碼,在docker容器中運行代碼,最后在windows的瀏覽器中看到運行結果,方便后續debug。
2、可以將我開發完成的程序和運行環境一起打包制作成docker的image,移交image給小伙伴運行或者直接發布到服務器上。
安裝與啟動
docker引擎核心是運行在linux操作系統上的linux容器。所以要在windows上使用docker容器,先要提供linux運行環境。
去docker官網下載msi安裝程序,若你的系統版本(例如64bit windows 10 pro, enterprise and education)支持hyper-v虛擬技術,那么不需要使用額外的虛擬機(virtualbox),安裝程序會自動為你安裝完成docker(docker for windows)。
若不能使用hyper-v虛擬技術,docker項目組也提供了docker toolbox工具,可以很方便的在windows環境下安裝docker。
本文中的執行系統為win7,故使用docker toolbox。
安裝過程會附帶安裝oracle vm virtualbox虛擬機,如下圖:
kitematic為docker的gui管理工具,打開docker terminal可以快速地啟動docker。
可以發現此時docker給default machine分配了一個ip:192.168.99.100。我們可以直接在該終端下執行docker命令。
由于在windows中運行docker多加了一層虛擬機,有幾個概念需要了解:
docker主機指的是linux虛擬機,也就是說,此時docker主機(即linux虛擬機)的ip地址為192.168.99.100。
與一般的ssh訪問虛擬機一樣,我們也可以通過該ip用ssh登錄到docker主機去執行命令。(用戶名:docker;密碼:tcuser)
如要用root權限去執行linux命令(如mount),則需要打開virtualbox。
搭建image
新安裝好的docker主機中沒有任何image(docker images 查看已有的image)。運行node應用需要搭建node環境鏡像,可以從docker hub上pull輕量級的linux鏡像作為基礎鏡像(如centos),在上面手動安裝node;也可以直接pull一個已安裝了node的鏡像(docker pull 拉取鏡像)。從docker hub下載鏡像可能非常慢,可以借助國內的云服務商下載(如)。
現在假設我們pull了一個不包含node環境的centos鏡像。
$ docker run -it centos bash
啟動一個容器,并進入容器的bash進行交互式操作。采用與centos下一樣的方式安裝node。安裝完成后exit退出容器。請放心,如果不使用docker rm或者docker run時不增加--rm參數,即使退出容器,容器本身及其中的修改不會消失。可以用docker ps -a查看所有容器,docker ps查看正在運行的容器。
$ docker commit <container_id> <image>
提交之前修改的容器到新的image。該鏡像就是已經安裝了node環境的鏡像(命名為nodejs)。
在后續的開發中我們可以用docker run -it nodejs bash啟動容器。
在windows和虛擬機之間共享文件
我們現在需要在docker容器中運行源代碼,而docker容器是在docker主機中的,所以首先,我們需要先保證docker主機(即linux虛擬機)能訪問到windows中的源代碼文件。
打開virtualbox,點擊“設置”->“共享文件夾”,指定路徑和名稱后勾選“自動掛載”和“固定分配”。“自動掛載”可以使得虛擬機下次啟動時自動掛載文件夾,否則每次啟動都需要重新手動掛載。
如果順利,重啟虛擬機輸入mount命令,可以看到共享文件夾掛載到了哪里,進入該目錄就能看到與windows下同步的文件。
如果自動掛載遇到問題,取消這個選項,使用以下命令手動掛載:
mount -t vboxsf docker_share <mount_point>
在docker容器中運行node代碼
首先在windows的共享文件夾下編輯測試代碼app.js:
var http = require('http'); http.createserver(function (req, res) { res.writehead(200, {'content-type': 'text/plain'}); res.end('hello world\n'); }).listen(1337); console.log('server running at http://0.0.0.0:1337/');
可以在docker主機中看到該文件。
用nodejs鏡像啟動一個容器,我們希望這個容器能訪問docker主機中的文件作為源代碼,還希望能在windows下訪問運行后的執行端口查看結果。用以下命令啟動容器:
$ docker run -v /docker_share:/app -p 1337:1337 -it nodejs bash
-v 主機目錄:容器數據卷目錄 使得主機目錄被掛載到容器中,可被容器訪問。
-p 主機端口:容器端口使得容器端口被映射到主機上,可以被容器外部訪問到。
注: 重復多個-p命令可以映射多個端口。
(docker 0.11版本以上可以使用--net=host參數使得容器中的所有端口映射在docker主機上。故也可使用:)
$ docker run -v /docker_share:/app --net=host -it nodejs bash
進入容器中對應的數據卷目錄,執行node app.js
windows下通過瀏覽器訪問192.168.99.100:1337可看到結果
至此,基本的node應用已經能在docker下跑起來啦~
進一步的開發工作
1. npm install
一般在node工程中都會存在node_modules依賴需要用npm install安裝。在docker下,期望運行應用的容器中,同樣可以執行該命令。但注意增加--no-bin-links指令來避免創建軟連接。
npm install --no-bin-links
2. 關聯其他服務與容器互聯
許多node應用都會關聯啟用redis、mysql等服務。直接地,我們可以像在windows下一樣打開同一個容器的多個終端分別運行服務或執行代碼。用以下命令進入一個正在運行的容器:
$ docker exec -it <container> bash
更優雅地,我們將不同的服務運行在不同的容器上,然后使用--link name:alias容器互聯的方式將他們關聯起來。
3. 實時響應代碼變化
在開發過程中,如果每次修改代碼都需要結束node進程然后重啟必然會很麻煩。可以使用工具實現監控代碼變化并自動重啟進程的效果,這樣一來只需要在瀏覽器下刷新就可以看到新的運行效果。
安裝nodemon:
npm install -g nodemon
依然以app.js為例,在容器中運行app.js時使用命令:
nodemon -l app.js
注:如果不在容器下運行,使用nodemon app.js即可,而在容器中,需要使用-l或--legacy-watch參數打開chokidar輪詢,才能監聽到掛載目錄中文件的改變。
嘗試更改app.js內容,保存后可以發現nodemon自動重啟了:
刷新瀏覽器看到修改后的結果:
打包源碼和環境為image
在工程目錄下編輯dockerfile和.dockerignore文件。dockerfile:
from nodejs # create app directory run mkdir -p /usr/src/app workdir /usr/src/app # install app dependencies copy package.json /usr/src/app/ run npm install # bundle app source copy . /usr/src/app expose 8080 cmd [ "npm", "start" ]
from指定基礎鏡像,接下來列出基于基礎鏡像需要做的操作命令,搭建起新的image環境(包括復制源碼和執行npm install)可以參考。
.dockerignore:
node_modules npm-debug.log
在build新鏡像時忽略其中的文件。
在docker主機中的工程目錄下(dockerfile所在目錄)使用命令:
$ docker build -t <imagename> . //注意末尾的點不可省去
可得到自行build的鏡像。該鏡像會自動添加到你的docker主機下,你可以直接啟動新鏡像的容器運行代碼(鏡像內就包含代碼,所以無需重復掛載到數據卷,不過就不能在windows下修改了),也可以將鏡像分享給小伙伴。
關于“Windows下如何用Docker部署Node.js開發環境”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“Windows下如何用Docker部署Node.js開發環境”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。