摘要:采用虛擬化的技術來虛擬化出應用程序的運行環境。安裝成功后,可以通過查看版本號盡量使用最新的穩定版本。是鏡像名,是鏡像的版本號,到此你已經成功構建了一個新的鏡像,你可以通過,查看你的鏡像。部署時將此文件到生產環境服務器上。
Docker
docker是一個開源的應用容器引擎,可以為我們提供安全、可移植、可重復的自動化部署的方式。docker采用虛擬化的技術來虛擬化出應用程序的運行環境。此種方式具有以下優勢:
每個部署的應用程序都是一個容器,彼此隔離,互不影響;
服務器只需要安裝docker即可運行構建好的應用程序鏡像,不會涉及復雜的服務器環境配置,因為配置都在特定的應用程序所在的鏡像中去配置即可;
簡化了自動化部署和運維的繁瑣流程,只需將構建好的鏡像load到服務器的docker中即可運行我們的應用程序;
可以充分利用服務器的系統資源,一臺服務器上可以同時運行多個容器;
前言docker采用的是c/s架構,Client通過接口與Server進程通信實現容器的構建,運行和發布。docker比較重要的三個核心概念如下:
鏡像(images):一個只讀的模板,可以理解為應用程序的運行環境,包含了程序運行所依賴的環境和基本配置,鏡像可以按照層級(從基礎鏡像開始)來構建,每一層包含特定的環境。
倉庫(repository):一個用于存放鏡像文件的倉庫,如果你對git的倉庫熟悉,應該很容易理解,對,就是那個。有私有倉庫和公有倉庫之分。
容器(container):一個運行應用程序的虛擬容器,在我們運行鏡像時產生。容器包含自己的文件系統+隔離的進程空間和包含其中的進程。
sharplook是一款通過大數據分析來解決客戶在監控系統中存在的數據采集難、解析難、處理難的IT運維產品。在給客戶部署產品的過程中涉及到比較多的環境配置和組件安裝以及復雜的依賴項,這些繁瑣的流程降低了安裝部署的效率和產品質量。基于此,我們開發了一款可以快速便捷的安裝部署套件,提供一種漂亮的安裝部署流程。產品采用 Nuxt + Koa 的基礎架構進行開發,其中采用nuxt來提供SSR(服務端渲染)功能,Nuxt.js是基于Vue.js的通用架構,其中集成了以下組件:
Vue2
Vue-Router
Vuex
Vue-Meta
另外,Nuxt.js 使用 Webpack 和 vue-loader 、 babel-loader 來處理代碼的自動化構建工作(如打包、代碼分層、壓縮等等)。
我們項目使用Nuxt.js作為中間件來進行UI渲染,使用Koa啟動我們自己的服務器,koa2 是由 Express 原班人馬打造的,致力于成為一個更小、更富有表現力、更健壯的 Web 框架。
關于如何快速搭建這樣一個項目,小生之前在《vue-cli “從入門到放棄”》中介紹過vue-cli的使用,這個項目我們通過vue-cli工具,使用 nuxt-community/koa-template 模板,vue init nuxt-community/koa-template快速構建出來。具體的代碼邏輯,在此不做贅述。
關于為什么選擇docker來部署我們的node服務,前面已經介紹了,我們基于node的web應用涉及到的部署環境并不復雜,僅僅需要Node.js作為平臺即可,由于依賴的包文件太多,而且比較大,業界還沒有特別好用的開源node打包工具。做前端的同學都知道,webpack是一個功能強大的資源加載構建的打包工具,只需要將項目文件打包到一個dist文件下,打包后的文件體量小,解決了文件之間的依賴問題,提取出公共代碼庫,生產環境只需要部署dist文件夾即可。然而,Nodejs程序涉及到的依賴包,和資源卻沒法進行打包,node服務開啟后僅僅是一個node進程而已。那么我們如何部署node程序呢?既然沒法打包,只能將其全部文件進行部署(雖然可能存在別的問題,小生也在研究中,大神可以給點建議),于是小生就希望將其放入docker中去部署,免去生產環境node版本不一致等問題。下面小生就將如何用docker來部署Node項目的過程分享給諸位。
實戰以下將進入戰備狀態,請同志們準備好大腦和電腦,跟著我左手、右手一個慢動作。
環境準備安裝docker,未安裝的同學,請根據自己的開發環境采用不同的安裝方式去安裝,具體操作參考教程,不做贅述。
安裝成功后,可以通過docker -v查看版本號(盡量使用最新的穩定版本)。
項目準備
在你的項目根目錄下,添加Dockerfile文件,此文件用來配置我們自定義一個鏡像所需要指定的依賴項、環境以及執行的命令等。內容格式如下:
# 指定我們的基礎鏡像是node,版本是v8.0.0 FROM node:8.0.0 # 指定制作我們的鏡像的聯系人信息(鏡像創建者) MAINTAINER EOI # 將根目錄下的文件都copy到container(運行此鏡像的容器)文件系統的app文件夾下 ADD . /app/ # cd到app文件夾下 WORKDIR /app # 安裝項目依賴包 RUN npm install RUN npm rebuild node-sass --force # 配置環境變量 ENV HOST 0.0.0.0 ENV PORT 8000 # 容器對外暴露的端口號 EXPOSE 8000 # 容器啟動時執行的命令,類似npm run start CMD ["npm", "start"]
關于Dockerfile文件中的關鍵字,解釋如下:
FROM
語法:FROM[: ] 解釋:設置要制作的鏡像基于哪個鏡像,FROM指令必須是整個Dockerfile的第一個指令,如果指定的鏡像不存在默認會自動從Docker Hub上下載。
MAINTAINER
語法:MAINTAINER解釋:MAINTAINER指令允許你給將要制作的鏡像設置作者信息。
ADD
語法:ADD解釋:ADD指令用于從指定路徑拷貝一個文件或目錄到容器的指定路徑中, 是一個文件或目錄的路徑,也可以是一個url,路徑是相對于該Dockerfile文件所在位置的相對路徑, 是目標容器的一個絕對路徑。
WORKDIR
語法:WORKDIR /path/to/workdir 解釋:WORKDIR指令用于設置Dockerfile中的RUN、CMD和ENTRYPOINT指令執行命令的工作目錄(默認為/目錄),該指令在Dockerfile文件中可以出現多次,如果使用相對路徑則為相對于WORKDIR上一次的值,例如WORKDIR /data,WORKDIR logs,RUN pwd最終輸出的當前目錄是/data/logs。
RUN
語法:① RUN#將會調用/bin/sh -c ② RUN ["executable", "param1", "param2"] #將會調用exec執行,以避免有些時候shell方式執行時的傳遞參數問題,而且有些基礎鏡像可能不包含/bin/sh 解釋:RUN指令會在一個新的容器中執行任何命令,然后把執行后的改變提交到當前鏡像,提交后的鏡像會被用于Dockerfile中定義的下一步操作,RUN中定義的命令會按順序執行并提交,這正是Docker廉價的提交和可以基于鏡像的任何一個歷史點創建容器的好處,就像版本控制工具一樣。
ENV
語法:ENV解釋:ENV指令用于設置環境變量,在Dockerfile中這些設置的環境變量也會影響到RUN指令,當運行生成的鏡像時這些環境變量依然有效,如果需要在運行時更改這些環境變量可以在運行docker run時添加–env = 參數來修改。 注意:最好不要定義那些可能和系統預定義的環境變量沖突的名字,否則可能會產生意想不到的結果。
EXPOSE
語法:EXPOSE[ ...] 解釋:EXPOSE指令用來告訴Docker這個容器在運行時會監聽哪些端口,Docker在連接不同的容器(使用–link參數)時使用這些信息。
CMD
語法: ① CMD ["executable", "param1", "param2"] #將會調用exec執行,首選方式 ② CMD ["param1", "param2"] #當使用ENTRYPOINT指令時,為該指令傳遞默認參數 ③ CMD[ | ] #將會調用/bin/sh -c執行 解釋:CMD指令中指定的命令會在鏡像運行時執行,在Dockerfile中只能存在一個,如果使用了多個CMD指令,則只有最后一個CMD指令有效。當出現ENTRYPOINT指令時,CMD中定義的內容會作為ENTRYPOINT指令的默認參數,也就是說可以使用CMD指令給ENTRYPOINT傳遞參數。 注意:RUN和CMD都是執行命令,他們的差異在于RUN中定義的命令會在執行docker build命令創建鏡像時執行,而CMD中定義的命令會在執行docker run命令運行鏡像時執行,另外使用第一種語法也就是調用exec執行時,命令必須為絕對路徑。
其中還有其他的一些關鍵字:USER、ENTRYPOINT、VOLUME、ONBUILD等,如果你有興趣可以自行研究。
在項目根目錄下添加.dockerignore文件,此文件的作用類似.gitignore文件,可以忽略掉添加進鏡像中的文件,寫法、格式和.gitignore一樣,一行代表一個忽略。本項目添加的忽略如下:
.DS_Store npm-debug.log* selenium-debug.log .nuxt/ /package-lock.json *.tar *.md # Editor directories and files .idea *.suo *.ntvs* *.njsproj *.sln構建鏡像
查看目前本地docker的鏡像
> docker images REPOSITORY TAG IMAGE ID CREATED SIZE
cd 到項目根目錄下,執行以下命令
> docker build -t deploy:1.0 . Sending build context to Docker daemon 1.436GB .... 此處省略1000個字符。 Successfully built d8f0875e967b Successfully tagged deploy:1.0
deploy是鏡像名,1.0是鏡像的版本號,到此你已經成功構建了一個新的鏡像,你可以通過docker images,查看你的鏡像。
> docker images REPOSITORY TAG IMAGE ID CREATED SIZE deploy 1.0 d8f0875e967b 3 minutes ago 2.11GB
啟動鏡像,測試是否成功。
> docker run -d -p 9000:8000 deploy:1.0 8aec5ee037bb253901d2c2e02c7be546580546c493576139f3789fb660f3401d > docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8aec5ee037bb deploy:1.0 "npm start" 57 seconds ago Up 56 seconds 0.0.0.0:9000->8000/tcp amazing_bassi
docker run -d -p 9000:8000 deploy:1.0中-d表示后臺運行,-p 9000:8000表示指定本地的9000端口隱射到容器內的8000端口。 deploy:1.0為我們要運行的鏡像。通過docker ps -a查看docker的進程(容器的運行本身就是一種特殊的進程)運行情況,發現我們的容器已經在運行。本地可以訪問localhost:9000。
通過docker logs可以查看我們容器內應用進程的運行日志。docker logs
> docker logs 8aec5ee037bb npm info it worked if it ends with ok npm info using npm@5.0.0 npm info using node@v8.0.0 npm info lifecycle newlook-deploy@1.0.0~prestart: newlook-deploy@1.0.0 npm info lifecycle newlook-deploy@1.0.0~start: newlook-deploy@1.0.0 > newlook-deploy@1.0.0 start /app > node ./server/index.js Server listening on 0.0.0.0:8000 DONE Compiled successfully in 9310ms06:55:56 > Open http://0.0.0.0:8000
docker stop上傳鏡像(這里用上傳到公共倉庫來演示)可以停止容器運行 docker start 可以啟動容器運行 docker restart 可以重啟容器 docker rm -f可以強制刪除在運行的容器
沒注冊DockerHub的同學,請注冊DockerHub
登錄docker
> docker login Username: XXX Password: XXX Login Succeeded
docker tag
> docker tag deploy:1.0 lzqs/deploy:1.0
docker push
> docker push lzqs/deploy:1.0
上傳成功后,docker logout 退出,登錄 https://hub.docker.com/ 查看上傳的鏡像。
下載鏡像
通過docker pull
> docker pull lzqs/deploy:1.0生產部署
前面說了,我們可以將上傳到倉庫的鏡像下載下來部署,但是如果鏡像比較大或者部署環境壓根無法聯網,你是不是要跪了。所以我們采取另一種方法,將開發好的鏡像直接打包保存到安裝盤里面,到客戶生產環境再將鏡像包上傳并加載到服務器的docker中即可。
在開發環境打包,docker save
> docker save lzqs/deploy:1.0 > deploy.tar
這里ls會發現目錄下生成了deploy.tar的文件。部署時將此文件copy到生產環境服務器上。
確保生產服務器上已經安裝了docker,若沒裝,請參考相關文檔,若不裝,對不起小生也無力了,然后在服務器上加載上傳的鏡像包deploy.tar。
> docker load < deploy.tar 007ab444b234: Loading layer [==================================================>] 129.3 MB/129.3 MB 4902b007e6a7: Loading layer [==================================================>] 45.45 MB/45.45 MB bb07d0c1008d: Loading layer [==================================================>] 126.8 MB/126.8 MB ecf5c2e2468e: Loading layer [==================================================>] 326.6 MB/326.6 MB 7b3b4fef39c1: Loading layer [==================================================>] 352.3 kB/352.3 kB 677f02386f07: Loading layer [==================================================>] 137.2 kB/137.2 kB 7333bb4665b8: Loading layer [==================================================>] 55.66 MB/55.66 MB e292e64ffb88: Loading layer [==================================================>] 3.757 MB/3.757 MB ee76d0e6f6d9: Loading layer [==================================================>] 1.436 GB/1.436 GB 33dca533c6e5: Loading layer [==================================================>] 331.8 kB/331.8 kB 24630015679d: Loading layer [==================================================>] 35.18 MB/35.18 MB Loaded image: lzqs/deploy:1.0
加載成功后,docker images即可看到加載的鏡像
> docker images REPOSITORY TAG IMAGE ID CREATED SIZE lzqs/deploy 1.0 d8f0875e967b About an hour ago 2.115 GB
運行lzqs/deploy鏡像,成功后,在外部訪問服務器的9000端口, <服務器的IP>:9000
> docker run -d -p 9000:8000 lzqs/deploy 1d0db9a5d0c8826171e501b0e86afd444fca8144b1105e63dae8d621bdda7a77 > docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1d0db9a5d0c8 lzqs/deploy:1.0 "npm start" About a minute ago Up About a minute 0.0.0.0:9000->8000/tcp goofy_curran
docker exec -it
> docker exec -it 1d0db9a5d0c8 /bin/bash root@1d0db9a5d0c8:/app#
戰功,訪問部署的docker應用,<服務器的IP>:9000,效果如下圖:
小結七月流火,程序員的好日子要到了,當然也是大家的好日子快到了,適宜的溫度應該更加高產。關于docker的研究還在進行中,為了前端更好的發展,讓我們繼續燥起來吧,畢竟沒有什么是一段JS解決不了的。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/27006.html
摘要:采用虛擬化的技術來虛擬化出應用程序的運行環境。安裝成功后,可以通過查看版本號盡量使用最新的穩定版本。是鏡像名,是鏡像的版本號,到此你已經成功構建了一個新的鏡像,你可以通過,查看你的鏡像。部署時將此文件到生產環境服務器上。 Docker docker是一個開源的應用容器引擎,可以為我們提供安全、可移植、可重復的自動化部署的方式。docker采用虛擬化的技術來虛擬化出應用程序的運行環境。此...
摘要:就鹿晗宣布戀情導致微博宕機事件淺談大型網站高可用性架構中午吃飯刷著刷著微博發現微博突然掛了。用戶在使用瀏覽器訪問一個網站時需要先通過協議向服務器發送請求,之后服務器返回文件與響應信息。 webpack:從入門到真實項目配置 自從出現模塊化以后,大家可以將原本一坨代碼分離到個個模塊中,但是由此引發了一個問題。每個 JS 文件都需要從服務器去拿,由此會導致加載速度變慢。Webpack 最主...
摘要:最近在學習,并用重新部署了項目,使用后確實大幅度地降低了部署難度。如果,內存,硬盤不夠,只能加物理設備,但這個是有上限的。虛擬化時代為了解決物理設備的諸多問題,出現了虛擬機。全手動部署編寫文件。一鍵啟動,確保已安裝。 最近在學習 Docker,并用 Docker 重新部署了cdfang-spider項目,使用 docker 后確實大幅度地降低了部署難度。如果你也想用 Docker 來部...
摘要:最近在學習,并用重新部署了項目,使用后確實大幅度地降低了部署難度。如果,內存,硬盤不夠,只能加物理設備,但這個是有上限的。虛擬化時代為了解決物理設備的諸多問題,出現了虛擬機。全手動部署編寫文件。一鍵啟動,確保已安裝。 最近在學習 Docker,并用 Docker 重新部署了cdfang-spider項目,使用 docker 后確實大幅度地降低了部署難度。如果你也想用 Docker 來部...
閱讀 2577·2019-08-30 10:53
閱讀 3183·2019-08-29 16:20
閱讀 2933·2019-08-29 15:35
閱讀 1751·2019-08-29 12:24
閱讀 2865·2019-08-28 18:19
閱讀 1838·2019-08-23 18:07
閱讀 2314·2019-08-23 15:31
閱讀 1158·2019-08-23 14:05