前言
前面的文章《centos7+ docker1.12 實踐部署docker及配置direct_lvm》中,已經實踐了如何在centos7下安裝,配置docker, 所以接下來就打算去制作一個nodejs項目鏡像包. 從網上一搜,大部分的Dockerfile內容都是如下這樣的:
FROM centos:centos7
MAINTAINER yourname@example.com
RUN yum -y update; yum clean all
RUN yum -y install epel-release; yum clean all
RUN yum -y install nodejs npm; yum clean all
# copy 程序代碼到容器的/src 下
ADD . /src
RUN cd /src; npm install
EXPOSE 3500
CMD ["node", "/src/index.js"]
這個代碼片段筆者並沒有實踐過,直接使用會不會報錯不是很清楚,不過這個不是重點。重點是,網上大部分的做法都是基於centos/ubuntu 系統鏡像包,再安裝nodejs,npm...之類的package來配置自己需要的環境.
那么當時就有了一個疑問,nodejs官方鏡像包該怎么用呢,是不是可以同時"FROM centos:centos7 FROM node:7.3.0"來基於多個基礎文件來制作出一個自己的鏡像文件呢,后來發現是不行的.
后來在docker hub的node倉庫中,找到了答案
node官方鏡像包是基於linux項目制作的,內部本身就包含了自己所需要的最小的可運行的輕量級的虛擬機.
那么我就來試用一些node鏡像包吧
基於node:7.3.0制作鏡像文件
1,nodejs項目
關於如何編寫nodejs項目,跟本文主提無關,這里就不再細說. 我這里直接使用已有的一個練手項目LittleFileServer.通過xftp4軟件將代碼copy到centos7服務器中,路徑為 "/home/dockertestdir/dockernodetest/LittleFileServer",其中LittleFileServer文件夾就是項目的根目錄
[root@iZ28uvczcf6Z ~]# cd /home/dockertestdir/dockernodetest/LittleFileServer
[root@iZ28uvczcf6Z LittleFileServer]# ls -al
total 88
drwxr-xr-x 14 root root 4096 Jan 5 11:01 .
drwxr-xr-x 3 root root 4096 Jan 3 18:26 ..
drwxr-xr-x 2 root root 4096 Dec 21 19:30 api
drwxr-xr-x 2 root root 4096 Dec 21 18:51 bll
drwxr-xr-x 2 root root 4096 Dec 21 18:53 cache
drwxr-xr-x 2 root root 4096 Dec 21 12:22 common
drwxr-xr-x 2 root root 4096 Dec 21 16:31 config
drwxr-xr-x 3 root root 4096 Dec 30 19:01 .idea
-rw-r--r-- 1 root root 3892 Dec 21 14:58 index.js
drwxr-xr-x 2 root root 4096 Nov 21 14:50 logs
-rw-r--r-- 1 root root 16187 Jun 22 2015 mime.json
drwxr-xr-x 20 root root 4096 Dec 21 17:00 node_modules
-rw-r--r-- 1 root root 861 Jan 4 16:45 package.json
drwxr-xr-x 6 root root 4096 Dec 22 09:53 public
-rw-r--r-- 1 root root 1271 Dec 21 18:56 routes.js
drwxr-xr-x 2 root root 4096 Dec 21 19:11 tempup
drwxr-xr-x 4 root root 4096 Nov 24 14:17 uploads
drwxr-xr-x 2 root root 4096 Dec 22 09:45 views
[root@iZ28uvczcf6Z LittleFileServer]#
2. 編寫Dockerfile文件
在項目根目錄中編寫Dockerfile (名字是固定的,不能變)
[root@iZ28uvczcf6Z LittleFileServer]# vi Dockerfile
Dockerfile內容如下
FROM node:7.3.0
COPY . /home/lfs
WORKDIR /home/lfs
EXPOSE 3500
CMD node index
3. build鏡像文件
4.查看一下image文件
5. 運行container
確認文件ok,那就下面就可以啟動一個container了。
[root@iZ28uvczcf6Z LittleFileServer]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cf7c8b8ac39a node-lfs-official:v1 "/bin/sh -c 'node ind" 11 seconds ago Up 8 seconds 0.0.0.0:3500->3500/tcp condescending_nobel
[root@iZ28uvczcf6Z LittleFileServer]#
" -p" :是設置端口,格式為[主機端口:容器端口]
"-d" :是設置容器運行在后台模式下.("后台模式"的詳細內容,可以參考:后台(background)運行 ;)
下面我們來查詢下container的狀態
[root@iZ28uvczcf6Z LittleFileServer]# docker run -d -p 3500:3500 node-lfs-official:v1 cf7c8b8ac39a170461b18e79d60a774ff0ce09a50070eb6d15ce9236ff078b67 [root@iZ28uvczcf6Z LittleFileServer]#
狀態ok,然后就可以在本地 通過 ip:port 來訪問了。
變化
鏡像文件大小(node:7.3.0-alpine)
從鏡像列表可以很清楚的發現,node:7.3.0是659M,基於它制作的node-lfs-official:v1 是687M;
而node:7.3.0-alpine版是54M,基於它制作的node-lfs:v2 只有82M。
所以,如果你對鏡像文件大小有特殊要求,就不妨把Dockerfile中的"FROM node:7.3.0"換成 "FROM node:7.3.0-alpine"吧,其他流程完全一樣,你的鏡像包就可以縮小8倍多. 至於node:7.3.0與node:7.3.0-alpine之間的區別,參考官方網頁: docker_hub-node 。 下面再給個截圖:
結果
回到文章開篇所提的問題,兩種制作nodejs項目鏡像文件的方式: 方式1=>基於centos/ubuntu系統鏡像,安裝所需的node,npm等環境來運行nodejs項目 ; 方式二=>直接基於node官方鏡像包,運行自己的項目 ; 二者有什么區別?
筆者自己的感覺是,前者的擴展性更好,可以配置更復雜一些的環境。如果你的環境很復雜,需要配置很多軟件,比如你要再集成nginx,mongodb等,使用方式一,你可以很方便的進行控制,擴展; 而方式二,則比較適合簡單一些的環境,例如現在很火熱的"微服務"概念,這也是大家認為docker很適合的一個應用場景. 如果你的nodejs項目沒有太復雜的環境需求,例如 node,nginx,mongodb全部被獨立拆分,各自微服務化,那么直接使用node官方鏡像會很方便.
后言
筆者能力有限,對於docker這么一個新東西,也是在不斷學習之中. 文章的目的也是基於"分享心得,互相學習,共同進步"的想法。。
文章的內容有不對的地方,歡迎大家在下方 評論區指正。