摘要:開始在下部署開發(fā)環(huán)境著實遍地坑,每遇到一個問題都要去原因再試圖解決。該鏡像就是已經(jīng)安裝了環(huán)境的鏡像命名為。在下,期望運行應(yīng)用的容器中,同樣可以執(zhí)行該命令。
開始
在windows下部署nodejs開發(fā)環(huán)境著實遍地坑,每遇到一個問題都要去google原因再試圖解決。而且如果你想把你寫好的應(yīng)用交給別人跑跑看,他可能同樣需要折騰很久才能真正在他的環(huán)境下運行起來。被坑了好些時日最終還是放棄,轉(zhuǎn)戰(zhàn)Docker。
Docker的簡介不在本文贅述,基本概念可參看Docker——從入門到實踐
文章開頭先明確一下我們希望實現(xiàn)的效果:
依然在Windows下編輯源代碼,在Docker容器中運行代碼,最后在Windows的瀏覽器中看到運行結(jié)果,方便后續(xù)debug。
可以將我開發(fā)完成的程序和運行環(huán)境一起打包制作成Docker的image,移交image給小伙伴運行或者直接發(fā)布到服務(wù)器上。
安裝與啟動Docker引擎核心是運行在Linux操作系統(tǒng)上的Linux容器。所以要在Windows上使用Docker容器,先要提供Linux運行環(huán)境。
去Docker官網(wǎng)下載msi安裝程序,若你的系統(tǒng)版本(例如64bit Windows 10 Pro, Enterprise and Education)支持Hyper-V虛擬技術(shù),那么不需要使用額外的虛擬機(VirtualBox),安裝程序會自動為你安裝完成Docker(Docker for Windows)。
The Hyper-V package must be enabled for Docker for Windows to work. The Docker for Windows installer will enable it for you, if needed. (This requires a reboot). If your system does not satisfy these requirements, you can install Docker Toolbox, which uses Oracle Virtual Box instead of Hyper-V.
若不能使用Hyper-V虛擬技術(shù),Docker項目組也提供了Docker ToolBox工具,可以很方便的在Windows環(huán)境下安裝Docker。
更詳細內(nèi)容參考Docker官方文檔-toolbox。
本文中的執(zhí)行系統(tǒng)為Win7,故使用Docker toolbox。
安裝過程會附帶安裝Oracle VM VirtualBox虛擬機,如下圖:
Kitematic為Docker的GUI管理工具,打開Docker Terminal可以快速地啟動Docker。
可以發(fā)現(xiàn)此時Docker給default machine分配了一個IP:192.168.99.100。我們可以直接在該終端下執(zhí)行Docker命令。
由于在Windows中運行Docker多加了一層虛擬機,有幾個概念需要了解:
Docker主機指的是Linux虛擬機,也就是說,此時Docker主機(即Linux虛擬機)的IP地址為192.168.99.100。
與一般的ssh訪問虛擬機一樣,我們也可以通過該IP用ssh登錄到Docker主機去執(zhí)行命令。(用戶名:docker;密碼:tcuser)
如要用root權(quán)限去執(zhí)行Linux命令(如mount),則需要打開VirtualBox。
新安裝好的Docker主機中沒有任何image(docker images 查看已有的image)。運行node應(yīng)用需要搭建node環(huán)境鏡像,可以從Docker Hub上pull輕量級的Linux鏡像作為基礎(chǔ)鏡像(如CentOS),在上面手動安裝node;也可以直接pull一個已安裝了node的鏡像(docker pull 拉取鏡像)。從Docker Hub下載鏡像可能非常慢,可以借助國內(nèi)的云服務(wù)商下載(如daocloud.io)。
現(xiàn)在假設(shè)我們pull了一個不包含node環(huán)境的CentOS鏡像。
$ docker run -it centos bash
啟動一個容器,并進入容器的bash進行交互式操作。采用與CentOS下一樣的方式安裝node。安裝完成后exit退出容器。請放心,如果不使用docker rm或者docker run時不增加--rm參數(shù),即使退出容器,容器本身及其中的修改不會消失。可以用docker ps -a查看所有容器,docker ps查看正在運行的容器。
$ docker commit
提交之前修改的容器到新的image。該鏡像就是已經(jīng)安裝了node環(huán)境的鏡像(命名為nodejs)。
在后續(xù)的開發(fā)中我們可以用docker run -it nodejs bash啟動容器。
我們現(xiàn)在需要在Docker容器中運行源代碼,而Docker容器是在Docker主機中的,所以首先,我們需要先保證Docker主機(即Linux虛擬機)能訪問到Windows中的源代碼文件。
打開VirtualBox,點擊“設(shè)置”->“共享文件夾”,指定路徑和名稱后勾選“自動掛載”和“固定分配”。“自動掛載”可以使得虛擬機下次啟動時自動掛載文件夾,否則每次啟動都需要重新手動掛載。
如果順利,重啟虛擬機輸入mount命令,可以看到共享文件夾掛載到了哪里,進入該目錄就能看到與Windows下同步的文件。
如果自動掛載遇到問題,取消這個選項,使用以下命令手動掛載:
mount -t vboxsf docker_share在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 "); }).listen(1337); console.log("Server running at http://0.0.0.0:1337/");
可以在Docker主機中看到該文件。
用nodejs鏡像啟動一個容器,我們希望這個容器能訪問Docker主機中的文件作為源代碼,還希望能在Windows下訪問運行后的執(zhí)行端口查看結(jié)果。用以下命令啟動容器:
$ docker run -v /docker_share:/app -p 1337:1337 -it nodejs bash
-v 主機目錄:容器數(shù)據(jù)卷目錄 使得主機目錄被掛載到容器中,可被容器訪問。
-p 主機端口:容器端口使得容器端口被映射到主機上,可以被容器外部訪問到。
注: 重復(fù)多個-p命令可以映射多個端口。
(Docker 0.11版本以上可以使用--net=host參數(shù)使得容器中的所有端口映射在Docker主機上。故也可使用:)
$ docker run -v /docker_share:/app --net=host -it nodejs bash
進入容器中對應(yīng)的數(shù)據(jù)卷目錄,執(zhí)行node app.js
Windows下通過瀏覽器訪問192.168.99.100:1337可看到結(jié)果
至此,基本的node應(yīng)用已經(jīng)能在Docker下跑起來啦~
進一步的開發(fā)工作1. npm install
一般在node工程中都會存在node_modules依賴需要用npm install安裝。在Docker下,期望運行應(yīng)用的容器中,同樣可以執(zhí)行該命令。但注意增加--no-bin-links指令來避免創(chuàng)建軟連接。
npm install --no-bin-links
2. 關(guān)聯(lián)其他服務(wù)與容器互聯(lián)
許多node應(yīng)用都會關(guān)聯(lián)啟用redis、mysql等服務(wù)。直接地,我們可以像在Windows下一樣打開同一個容器的多個終端分別運行服務(wù)或執(zhí)行代碼。用以下命令進入一個正在運行的容器:
$ docker exec -itbash
更優(yōu)雅地,我們將不同的服務(wù)運行在不同的容器上,然后使用--link name:alias容器互聯(lián)的方式將他們關(guān)聯(lián)起來,詳情可以看這篇博客。
3. 實時響應(yīng)代碼變化
在開發(fā)過程中,如果每次修改代碼都需要結(jié)束node進程然后重啟必然會很麻煩。可以使用nodemon工具實現(xiàn)監(jiān)控代碼變化并自動重啟進程的效果,這樣一來只需要在瀏覽器下刷新就可以看到新的運行效果。
安裝nodemon:
npm install -g nodemon
依然以app.js為例,在容器中運行app.js時使用命令:
nodemon -L app.js
注:如果不在容器下運行,使用nodemon app.js即可,而在容器中,需要使用-L或--legacy-watch參數(shù)打開Chokidar輪詢,才能監(jiān)聽到掛載目錄中文件的改變。
嘗試更改app.js內(nèi)容,保存后可以發(fā)現(xiàn)nodemon自動重啟了:
刷新瀏覽器看到修改后的結(jié)果:
關(guān)于nodemon,更詳細的使用參見GitHub-nodemon。
打包源碼和環(huán)境為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指定基礎(chǔ)鏡像,接下來列出基于基礎(chǔ)鏡像需要做的操作命令,搭建起新的Image環(huán)境(包括復(fù)制源碼和執(zhí)行npm install)可以參考node官方文檔和這篇博文。
.dockerignore:
node_modules npm-debug.log
在build新鏡像時忽略其中的文件。
在Docker主機中的工程目錄下(Dockerfile所在目錄)使用命令:
$ docker build -t. //注意末尾的點不可省去
可得到自行build的鏡像。該鏡像會自動添加到你的docker主機下,你可以直接啟動新鏡像的容器運行代碼(鏡像內(nèi)就包含代碼,所以無需重復(fù)掛載到數(shù)據(jù)卷,不過就不能在Windows下修改了),也可以將鏡像分享給小伙伴。
總結(jié)到此,應(yīng)該已經(jīng)能滿足基本的開發(fā)需求。
雖然在Windows下使用Docker因為多加的一層虛擬機會覺得有一點別扭,但是Docker本身用容器和鏡像將開發(fā)環(huán)境封裝隔離的特性依然帶來諸多方便。
以上都是我初步接觸Docker的折騰結(jié)果,如果有什么錯誤或者更方便的方式方法歡迎交流指正。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/86685.html
摘要:開始在下部署開發(fā)環(huán)境著實遍地坑,每遇到一個問題都要去原因再試圖解決。該鏡像就是已經(jīng)安裝了環(huán)境的鏡像命名為。在下,期望運行應(yīng)用的容器中,同樣可以執(zhí)行該命令。 開始 在windows下部署nodejs開發(fā)環(huán)境著實遍地坑,每遇到一個問題都要去google原因再試圖解決。而且如果你想把你寫好的應(yīng)用交給別人跑跑看,他可能同樣需要折騰很久才能真正在他的環(huán)境下運行起來。被坑了好些時日最終還是放棄,轉(zhuǎn)...
摘要:本文整理自時速云線上微信群分享第十期本文主要包括的基本概念使用場景,以及如何在時速云平臺上進行的編排部署,希望對大家在進行微服務(wù)架構(gòu)實踐時有所幫助。問關(guān)于提供訪問容器數(shù)據(jù)的能力,中包含一個業(yè)務(wù)和一個服務(wù),時速云的控制臺可以進入到容器內(nèi)部。 本文整理自【時速云線上微信群分享】第十期 本文主要包括Pod的基本概念、使用場景,以及如何在時速云平臺上進行Pod的編排部署,希望對大家在進行微服務(wù)...
摘要:圖表君聊開篇今天是圖表君聊的第一篇,為什么會有這個系列呢容器技術(shù)出現(xiàn)已經(jīng)有一段時間了,之前零零星星的也看過一些文章,圖表君的項目上也在使用。至于,圖表君沒試過,官網(wǎng)有的教程,大家可以參考。上的官網(wǎng),安裝,然后跟著圖表君一起學(xué)習(xí)吧。 圖表君聊Docker-開篇 今天是圖表君聊Docker的第一篇,為什么會有這個系列呢?容器技術(shù)Docker出現(xiàn)已經(jīng)有一段時間了,之前零零星星的也看過一些文章...
摘要:腳本列出了在結(jié)束時安裝的映像。在不同的體系結(jié)構(gòu),將用標識體系結(jié)構(gòu)的字符串替換。提供了許多來支持各種編程語言,官方發(fā)布了兩款針對和的和文檔。。 入門 在我們開始之前,如果你還沒有這樣做,你可能希望檢查是否已經(jīng)在開發(fā)區(qū)塊鏈應(yīng)用程序和/或運行Hyperledger Fabric的平臺上安裝了所有前提條件。 一旦安裝了前提條件,就可以下載并安裝HyperLedger Fabric了,當我們在F...
摘要:第二十期啟迪云高級交付經(jīng)理董樂首先我們基礎(chǔ)架構(gòu)的組成主要是計算存儲和網(wǎng)絡(luò)。不會取代像或這樣的配置管理。事實上,在創(chuàng)建鏡像時,可以使用或等工具在鏡像上安裝軟件。第二十期 啟迪云高級交付經(jīng)理 ?董樂 首先我們基礎(chǔ)架構(gòu)的組成主要是計算、存儲和網(wǎng)絡(luò)。在我們以往的模式中主要使用的是虛擬化技術(shù)。 無論哪種虛擬化技術(shù)在實際生產(chǎn)環(huán)境中主要都是通過模板來提高交付效率,模板主要由操作系統(tǒng)和應(yīng)用組成。...
閱讀 2877·2021-10-14 09:43
閱讀 1671·2021-09-29 09:34
閱讀 1754·2021-07-28 00:16
閱讀 2969·2019-08-30 15:53
閱讀 2913·2019-08-30 13:59
閱讀 2970·2019-08-30 13:57
閱讀 1099·2019-08-26 13:38
閱讀 1900·2019-08-26 13:25