摘要:但是,命名約定為全部大寫。命令可以多次使用,表示會創建多個鏡像。現在可以開始構建鏡像了,安裝比較蛋疼,我本地沒有安裝環境,我用的是時速云的本地客戶端,安裝配置都比較簡單,這里就不說了,大家可以參考官方文檔。
14年畢業后開始接觸node,15年來帝都找了份工作,一直默默的在cnode社區晃悠,灌過幾次水,今天就想發個處女貼,跟大家聊聊怎么把nodeclub項目源碼構建成一個鏡像。話說Docker是今年剛接觸的,還在入門中/(ㄒoㄒ)/~~,下面我簡單介紹下Docker、Dockerfile的語法以及如何把nodeclub源碼構建成鏡像。(已經對Docker比較熟悉的小伙伴可以直接跳到第三個)
1.什么是docker?Docker allows you to package an application with all of its dependencies into a standardized unit for software development.
Docker是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然后發布到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口(類似 iPhone 的 app)。幾乎沒有性能開銷,可以很容易地在機器和數據中心中運行。最重要的是,他們不依賴于任何語言、框架包括系統。
Docker 的目標是實現輕量級的操作系統虛擬化解決方案。Docker 的基礎是 Linux 容器(LXC)等技術。在 LXC 的基礎上 Docker 進行了進一步的封裝,讓用戶不需要去關心容器的管理,使得操作更為簡便。用戶操作 Docker 的容器就像操作一個快速輕量級的虛擬機一樣簡單。
下面的圖片比較了 Docker 和傳統虛擬化方式的不同之處,可見容器是在操作系統層面上實現虛擬化,直接復用本地主機的操作系統,而傳統方式則是在硬件層面實現。
(圖片來自Docker官方網站)
Docker can build images automatically by reading the instructions from a Dockerfile. A Dockerfile is a text document that contains all the commands you would normally execute manually in order to build a Docker image. By calling docker build from your terminal, you can have Docker build your image step by step, executing the instructions successively.
Docker通過讀取Dockerfile文件中的指令自動構建鏡像。Dcokerfile是一個文本文件,它包含了構建鏡像所需要執行的全部命令。執行docker build命令,Docker就會按照文檔執行并最終創建一個鏡像。(這段話是翻譯上面那段話的%>_<%)。 Dockerfile支持支持的語法命令如下:
INSTRUCTION argument
指令不區分大小寫。但是,命名約定為全部大寫。
Dockerfile都必須以FROM命令開始。 FROM命令會指定鏡像基于哪個基礎鏡像創建,接下來的命令也會基于這個基礎鏡像(譯者注:CentOS和Ubuntu有些命令可是不一樣的)。FROM命令可以多次使用,表示會創建多個鏡像。具體語法如下:
FROM
例如:
FROM google/nodejs
上面的指令告訴我們,新的鏡像將基于google的Node.js的鏡像來構建。
繼FROM命令,DockefFile還提供了一些其它的命令以實現自動化。在Dockerfile文件中這些命令的順序就是它們被執行的順序。 下面我們就了解下這些有趣的Dockerfile命令吧。 1.MAINTAINER:設置該鏡像的作者。語法如下:
MAINTAINER
2.RUN:在shell或者exec的環境下執行的命令。RUN指令會在新創建的鏡像上添加新的層面,接下來提交的結果用在Dockerfile的下一條指令中。語法如下:
RUN
3.ADD:復制文件指令。它有兩個參數和。destination是容器內的路徑。source可以是URL或者是啟動配置上下文中的一個文件。語法如下:
ADD
4.CMD:提供了容器默認的執行命令。 Dockerfile只允許使用一次CMD指令。 使用多個CMD會抵消之前所有的指令,只有最后一個指令生效。 CMD有三種形式:
CMD ["executable","param1","param2"] CMD ["param1","param2"] CMD command param1
5.EXPOSE:指定容器在運行時監聽的端口。語法如下:
EXPOSE;
6.ENTRYPOINT:配置給容器一個可執行的命令,這意味著在每次使用鏡像創建容器時一個特定的應用程序可以被設置為默認程序。同時也意味著該鏡像每次被調用時僅能運行指定的應用。類似于CMD,Docker只允許一個ENTRYPOINT,多個ENTRYPOINT會抵消之前所有的指令,只執行最后的ENTRYPOINT指令。語法如下:
ENTRYPOINT ["executable", "param1","param2"] ENTRYPOINT command param1 param2
7.WORKDIR:指定RUN、CMD與ENTRYPOINT命令的工作目錄。語法如下:
WORKDIR /path/to/workdir
8.ENV:設置環境變量。它們使用鍵值對,增加運行程序的靈活性。語法如下:
ENV
9.USER:鏡像運行時,設置一個UID。語法如下:
USER
10.VOLUME:授權訪問從容器內到主機上的目錄。語法如下:
VOLUME ["/data"]3. 把nodeclub構建成一個鏡像
先把我寫的Dockerfile貼出來:
# Dockerfile to create a nodeclub image FROM google/nodejs MAINTAINER Carrotzpc # Add files to the image RUN mkdir -p /opt/nodejs ADD . /opt/nodejs WORKDIR /opt/nodejs # Install the dependencies modules RUN npm install # Run make build RUN make build # Expose environment variables ENV MONGO_CARROT_ADDR **LinkMe** ENV MONGO_CARROT_PORT **LinkMe** ENV MONGO_CARROT_DATABASE admin ENV MONGO_CARROT_USER **ChangeMe** ENV MONGO_CARROT_PASS **ChangeMe** # Expose the container port EXPOSE 5000 ENTRYPOINT ["node", "app.js"]
這么簡單的幾行命令,就可以構建出一個nodeclub鏡像。下面我重點聊一下環境變量ENV,nodeclub的源碼我用的是node + mongo(無redis)的版本,mongo配置信息通過環境變量傳遞,這就需要我們簡單修改一下nodeclub的配置文件,我在配置文件中增加了以下代碼(不過直接在配置文件里邊這樣寫不太好),用來獲取mongo數據庫連接字符串:
// Get mongodb connec string from env function _getMongoUrl(){ var db_addr = process.env.MONGO_CARROT_ADDR; var db_port = process.env.MONGO_CARROT_PORT; var db_user = process.env.MONGO_CARROT_USER; var db_pass = process.env.MONGO_CARROT_PASS; var db_database = process.env.MONGO_CARROT_DATABASE; var db_url = "mongodb://"; if (db_user && db_pass) { db_url += (db_user + ":" + db_pass + "@"); } db_url += (db_addr? db_addr: "localhost"); db_url += ":" + (db_port? db_port: 27017); db_url += "/" + (db_database? db_database: "admin"); console.log("Connect to MongoStore Use this url:" + db_url); return db_url; }
(不知道還有木有童鞋有耐心看到這里)到這里我們完成了源碼的修改,其中Dockerfile是放在源代碼根目錄的?,F在可以開始構建nodeclub鏡像了,Windows安裝Docker比較蛋疼,我本地沒有安裝Docker環境,我用的是TenxCloud時速云的本地客戶端tce,安裝配置都比較簡單,這里就不說了,大家可以參考官方文檔。 在命令行中輸入tce login填寫用戶名、密碼后完成登錄,然后進入到源代碼根目錄,執行tce push nodeclub命令,tce會自動將Dockerfile及引用的本地文件打包成zip,并上傳到TenxCloud,由TenxCloud的容器引擎構建Docker 鏡像,我們可以看到Docker構建鏡像的相關日志:
完成構建后打開時速云網站,進入鏡像市場>我的鏡像就可以看到我們剛剛構建的鏡像nodeclub:
在鏡像詳情頁可以上傳鏡像圖標、修改鏡像信息、服務接口等,我們把Dockerfile中的ENV增加到服務接口中,用于在部署鏡像時填寫mongo的相關配置信息:
萬事具備,只欠一個mongo了,正好時速云有提供mongo的鏡像,于是我部署了一個mongo,然后在部署nodeclub時填寫這個mongo的地址、端口等信息,這樣就完成了nodeclub的部署:
還有一種方式就是把mongo也集成到我們的鏡像中,這就涉及到了mongo的安裝以及啟動,我們留在下一次討論。我把源代碼上傳到了github,大家有興趣的話可以自己構建試試:
還有一種方式就是把mongo也集成到我們的鏡像中,這就涉及到了mongo的安裝以及啟動,我們留在下一次討論。我把源代碼上傳到了github,大家有興趣的話可以自己構建試試:https://github.com/Carrotzpc/docker-nodeclub。
示例網站:http://nodeclub-k9nmf.q1.tenxcloud.net:46141/。
PS:由于部署鏡像前host并不可知,所以我把源碼改成了通過req.headers.host來獲取host,這樣激活郵件中的鏈接就可用了。
參考資料what is docker ?
什么是容器服務(Container as a Service)
Dockerfile reference
Docker入門教程(三)Dockerfile
google / nodejs
How to use MongoDB & NodeJS with Docker (video included)
使用 tce 客戶端
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/26437.html
摘要:如何用定制你自己的環境前言學習幾個月了,一直在論壇和群里潛水,一直都想寫點什么回報大家積極的知識分享。關于如何使用,可以參考上面的文章和官方文檔二小試牛刀,用構建一個的環境并運行程序首先來貼上我的先附上這個項目地址。 如何用Docker定制你自己的Beego環境 前言: 學習golang幾個月了,一直在論壇和qq群里潛水,一直都想寫點什么回報大家積極的知識分享。 前幾日在CSDN上...
摘要:編寫文件環境作者信息復制環境配置環境變量拷貝爆漏的端口號執行命令將包放在文件同一個目錄下。執行構建命令然后就可以當做正常的鏡像使用。 1.編寫Dockerfile文件. # 環境 FROM centos # 作者信息 MAINTAINER david 986945193@qq.com # 復制JDK環境 COPY jdk1.8.0_191 jdk1.8.0_191 # 配置環境變量 ...
摘要:部署項目寫在前面作為輕量級虛擬化技術,擁有持續集成版本控制可移植性隔離性和安全性等優勢。容器可以被創建啟動停止刪除暫停等。重新運行應用容器直接基于鏡像來啟動容器,運行命令將宿主機的掛載到容器的目錄上。Docker 部署 vue 項目 1.寫在前面: Docker 作為輕量級虛擬化技術,擁有持續集成、版本控制、可移植性、隔離性和安全性等優勢。本文使用Docker來部署一個vue的前端應用,并盡...
摘要:月日數人云在上海舉辦金融沙龍,邀請上交所和近二十家來自銀行保險證券的技術專家一同探討容器技術在金融業中的最佳實踐。數人云肖德時在會上將傳統金融行業通過容器可以解決的四大問題做了逐一解讀。如何動態的分配,就是剛才上交所介紹的一些治理的方法。 7月29日數人云在上海舉辦金融沙龍,邀請上交所和近二十家來自銀行、保險、證券的IT技術專家一同探討容器技術在金融業中的最佳實踐。數人云CTO肖德時在...
摘要:域名和應用記得一樣接著我們創建一個管理員用戶,然后其他的都默認,點擊立即安裝完成。初始化成功之后我們可以在里邊創建一個倉庫,然后登陸。比如配置文件需要的密鑰,用戶名和密碼,一些環境變量都可以在設置,構建狀態徽章可以在你的項目文件加上去。 drone是一個基于容器的本地持續交付平臺,和Jenkins是差不多的,然后配合輕量級的gogs來作為git管理,都是基于golang開發的很符合我的...
閱讀 3616·2021-11-24 10:22
閱讀 3686·2021-11-22 09:34
閱讀 2480·2021-11-15 11:39
閱讀 1528·2021-10-14 09:42
閱讀 3662·2021-10-08 10:04
閱讀 1553·2019-08-30 15:52
閱讀 847·2019-08-30 13:49
閱讀 3015·2019-08-30 11:21