前面的文章《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
关于如何编写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]#
在项目根目录中编写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
[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]#
[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]#
确认文件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是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这么一个新东西,也是在不断学习之中. 文章的目的也是基于"分享心得,互相学习,共同进步"的想法。。
文章的内容有不对的地方,欢迎你们在下方 评论区指正。
本文版权归做者和博客园共有,欢迎转载,但未经做者赞成必须保留此段声明,且在文章页面明显位置给出原文链接,不然保留追究法律责任的权利;
本文出自:博客园--别问是谁