製做nodejs項目鏡像,實現docker下的快速部署

前言

  前面的文章《centos7+ docker1.12 實踐部署docker及配置direct_lvm》中,已經實踐瞭如何在centos7下安裝,配置docker, 因此接下來就打算去製做一個nodejs項目鏡像包. 從網上一搜,大部分的Dockerfile內容都是以下這樣的:html

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來配置本身須要的環境.node

  那麼當時就有了一個疑問,nodejs官方鏡像包該怎麼用呢,是否是能夠同時"FROM centos:centos7 FROM node:7.3.0"來基於多個基礎文件來製做出一個本身的鏡像文件呢,後來發現是不行的.linux

  後來在docker hub的node倉庫中,找到了答案nginx

    

   node官方鏡像包是基於linux項目製做的,內部自己就包含了本身所須要的最小的可運行的輕量級的虛擬機.git

  那麼我就來試用一些node鏡像包吧mongodb

基於node:7.3.0製做鏡像文件

  1,nodejs項目

   關於如何編寫nodejs項目,跟本文主提無關,這裏就再也不細說. 我這裏直接使用已有的一個練手項目LittleFileServer.經過xftp4軟件將代碼copy到centos7服務器中,路徑爲 "/home/dockertestdir/dockernodetest/LittleFileServer",其中LittleFileServer文件夾就是項目的根目錄docker

[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 (名字是固定的,不能變)npm

[root@iZ28uvczcf6Z LittleFileServer]# vi Dockerfile

    Dockerfile內容以下json

FROM node:7.3.0

COPY . /home/lfs

WORKDIR /home/lfs

EXPOSE 3500

CMD node index

  3. build鏡像文件

[root@iZ28uvczcf6Z LittleFileServer]# docker build -t node-lfs-official:v1 .
Sending build context to Docker daemon 32.78 MB
Step 1 : FROM node:7.3.0
 ---> d1699fb7d2bf
Step 2 : COPY . /home/lfs
 ---> 00e25cf692d5
Removing intermediate container 2daa5c07d098
Step 3 : WORKDIR /home/lfs
 ---> Running in c582d6bb69bb
 ---> 59f598113734
Removing intermediate container c582d6bb69bb
Step 4 : EXPOSE 3500
 ---> Running in f21b15adc0f6
 ---> 0b515a644212
Removing intermediate container f21b15adc0f6
Step 5 : CMD node index
 ---> Running in 46965228c387
 ---> 5a5da4c52c17
Removing intermediate container 46965228c387
Successfully built 5a5da4c52c17
[root@iZ28uvczcf6Z LittleFileServer]# 

  4.查看一下image文件

[root@iZ28uvczcf6Z LittleFileServer]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
node-lfs-official   v1                  5a5da4c52c17        56 seconds ago      687.8 MB
node-lfs            v2                  cda2998a607f        19 hours ago        82.74 MB
ubuntu              16.04               dd0ff4f609fa        23 hours ago        168.4 MB
node                7.3.0-alpine        d0a6661914f4        8 days ago          54.65 MB
node                7.3.0               d1699fb7d2bf        2 weeks ago         659.7 MB
ubuntu              <none>              104bec311bcd        2 weeks ago         128.9 MB
[root@iZ28uvczcf6Z LittleFileServer]# 

  5. 運行container

   確認文件ok,那就下面就能夠啓動一個container了。ubuntu

[root@iZ28uvczcf6Z LittleFileServer]# docker run -d -p 3500:3500 node-lfs-official:v1
cf7c8b8ac39a170461b18e79d60a774ff0ce09a50070eb6d15ce9236ff078b67
[root@iZ28uvczcf6Z LittleFileServer]# 

   " -p" :是設置端口,格式爲[主機端口:容器端口]

   "-d" :是設置容器運行在後臺模式下.("後臺模式"的詳細內容,能夠參考:後臺(background)運行 ;)

   下面咱們來查詢下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]# 

    狀態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這麼一個新東西,也是在不斷學習之中. 文章的目的也是基於"分享心得,互相學習,共同進步"的想法。。

  文章的內容有不對的地方,歡迎你們在下方 評論區指正。

 

本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然保留追究法律責任的權利;

本文出自:博客園--別問是誰

相關文章
相關標籤/搜索