制作nodejs项目镜像,实现docker下的快速部署
前言
前面的文章《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镜像文件
[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了。
[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这么一个新东西,也是在不断学习之中. 文章的目的也是基于"分享心得,互相学习,共同进步"的想法。。
文章的内容有不对的地方,欢迎大家在下方 评论区指正。
制作nodejs项目镜像,实现docker下的快速部署的更多相关文章
- Docker环境 ELK 快速部署
Docker环境 ELK快速部署 环境 Centos 7.4 , Docker version 17.12 Docker至少3GB内存: #内核配置 echo ' vm.max_map_count = ...
- NodeJS项目迁移兼Ubuntu下NodeJS环境部署
前言 之前做的几个项目都托管在阿里云服务器,但是最近要到期了.想着到底要不要续期,毕竟100/月.后面看着阿里云有个活动,800/三年.果断买下.环境部署折腾了一天,其中也遇到几个坑. 目录 一.安装 ...
- JAVA项目如何通过Docker实现Jenkins持续部署
原文地址:http://blog.51cto.com/dadonggg/1957691 本篇实操性的案例讲解——JAVA项目如何通过Docker实现持续部署(只需简单四步), 即:开发通过git pu ...
- 使用Docker快速部署各类服务
使用Docker快速部署各类服务 一键安装Docker #Centos环境 wget -O- https://gitee.com/iubest/dinstall/raw/master/install. ...
- docker制作node程序镜像:
准备: 需要5个文件 新建一个docker文件夹 1 .ignore git忽略文件用的 2 pakage.json 安装NODE程序的 也可以直接拷贝进 docker文件加 3 node环境 lin ...
- docker学习7-Dockerfile制作自己的镜像文件
前言 如果你是一个python自动化测试人员,某天你在公司终于完成了一个项目的接口自动化脚本工作,在你自己常用的本机或者服务器上调试完成了脚本,稳稳地没问题. 可是晚上下班回家,你自己找了个linux ...
- Docker —— 使用 Dockerfile 制作 Jdk + Tomcat 镜像
一.准备好Jdk和Tomcat apache-tomcat-8.5.50.tar.gz jdk-8u212-linux-x64.tar.gz 注意: Jdk 和 Tomcat 记得从官网下载,否则制作 ...
- idea使用docker-maven-plugin插件将项目编译为docker镜像到远程linux服务器 原
在使用idea开发时,直接docker-maven-plugin插件,把项目编译成docker镜像,然后通过docker:push推送到linux服务器,非常简单,快捷,也避免了手动打包,然后拷贝wa ...
- docker搭建本地仓库并制作自己的镜像
原文地址https://blog.csdn.net/junmoxi/article/details/80004796 1. 搭建本地仓库1.1 下载仓库镜像1.2 启动仓库容器2. 在CentOS容器 ...
随机推荐
- logstash 中multiline插件的用法
input { stdin { codec =>multiline { charset=>... #可选 字符编码 max_bytes=>... #可选 bytes类型 设置最大的字 ...
- 使用Ant编译和构建项目指南
有两种方法来构建您的应用程序使用Ant构建脚本:一个用于测试/调试您的应用程序,调试模式——和一个用于构建你的最终计划发布——发布模式.不管你怎样构建你的应用程序,它必须先签名然后可以安装在一个模拟器 ...
- Android 控件: Webview 的一些知识点
WebView 加载网页,当点击返回键的时,会显示上一个页面,并刷新. 同时可以对返回上一个页面进行干预,就是用到了缓存. webview加载网页的几个模式,即websetting中设置的加载模式.w ...
- Android: 设置 app 字体大小不跟随系统字体调整而变化
在做 app 内字体大小的需求,类似于 微信中设置字体大小. 那么就需要 app 不跟随系统字体大小调整而变化,找到了两个方法. 方法1: 重写 getResource() 方法,修改 configu ...
- 腾讯云服务器 安装fastdfs文件服务器
上篇安装完nginx后,那么这次咱们就来安装fastdfs文件服务器,为何要使用文件服务器,这里不多说了,以前的文章有写过 首先用ftp工具把fastdfs的相关文件上传至腾讯云,如下 首先,安装基本 ...
- 【Unity】12.3 Off Mesh Link组件
开发环境:Win10.Unity5.3.4.C#.VS2015 创建日期:2016-05-09 一.简介 Off Mesh Link组件用于手动指定路线来生成分离的网格连接.例如,游戏中让行进对象上下 ...
- Android xUtils3源代码解析之网络模块
本文已授权微信公众号<非著名程序猿>原创首发,转载请务必注明出处. xUtils3源代码解析系列 一. Android xUtils3源代码解析之网络模块 二. Android xUtil ...
- 利用babel-cli搭建支持ES6的node环境
现在ES6盛行,开始大量使用ES6的特性敲代码,但限于Node.js本身对ES6的特性支持的不够完备,那么需要借助于其他工具来完成. 基本上,现在都直接写ES6的代码,然后使用babel-cli提供的 ...
- DIOCP开源项目-数据库连接池的使用<多帐套数据库>
很久没有写DIOCP的Demo了,主要公司的事情太繁琐,工作之余都不想动了,之前承若的群里面朋友们的DEMO,昨天晚上恶补了一下,把对数据库连接池的操作加入到了Demo中,大家可以通过SVN下载到最新 ...
- CSS实现:标题两侧画线效果
如图: html代码: <div class="detail-news"> <h5 class="detail-news-title"> ...