本节我们自己打包一个docker镜像并发布到官方的镜像仓库中。这样任何人只需执行以下命令:
docker run -d -p 3000:3000 finleyma/express 就可以访问一个简单的express程序了。

需要你有简单的express使用经验
实现过程非常简单:

  1. 本地全局安装 npm install express-generator -g
  2. 初始化一个express项目 express myapp
  3. cd myapp,然后 npm run start,项目就在本地运行了。
  4. 我们在项目内建立Dockerfile,内容如下:
FROM node:10.8.0-alpine
MAINTAINER www.mafeifan.com
# 设置工作目录,下面的RUN命令会在工作目录执行
WORKDIR /app
# 先拷贝本地的 package.json 和 package-lock 到容器内
# 这样是利用docker的镜像分层机制
COPY package*.json ./
# 安装项目依赖包
# 生产环境可以运行 RUN npm install --only=production 只按照 package.json 中dependencies定义的模块
RUN npm install
# 将根目录下的文件都copy到container(运行此镜像的容器)文件系统的app文件夹下
ADD . /app/
# 暴露容器内的3000端口
EXPOSE 3000
# 容器启动时执行的命令,类似npm run start
CMD ["npm", "start"]
  1. 构建镜像 docker build -t finleyma/express .
    别忘了最后的点,表示当前目录
  2. 启动容器 docker run -d -p 3000:3000 finleyma/express
  3. 可选,登录docker hub, 并提交镜像。docker login, docker push finleyma/express
  4. 进入容器 docker run -it --rm finleyma/express:1.0 ash
    简要说下参数:
  • -it:这是两个参数,一个是 -i:交互式操作,一个是 -t 终端。我们这里打算进入 容器 执行一些命令并查看返回结果,因此我们需要交互式终端。
  • --rm:这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动 docker rm。我们这里只是随便执行个命令,看看结果,不需要排障和保留结果,因此使用 --rm 可以避免浪费空间。
  • ash:因为我们的Node的基础镜像是10.8.0-alpine, alpine的交互式 Shell是ash不是bash,使用bash会提示not found。注意这个细节。
    会发现整个项目文件都在容器内。
image.png

简单总结使用Docker的好处:

  1. 使用版本方便,比如服务器上跑着node6,而你的项目需要node8以上。使用docker因为是隔离的环境
  2. 部署分享也方便,一行命令完事

问题:容器内的 node_modules 是本来就有还是容器执行 npm install 产生的呢?
答案:是构建的时候打包进镜像内了。我们看一下体积,有20M而且进到容器内, ls -l node_modules 时间也是打包的什么,并不是当前时间。

image.png

参考:

https://nodejs.org/en/docs/guides/nodejs-docker-webapp/
https://www.imooc.com/article/19840
https://github.com/nodejs/docker-node/blob/master/docs/BestPractices.md

docker学习系列7 容器化Node项目相关推荐

  1. 《docker+k8s微服务容器化实践》笔记2

    5-3 集群环境搭建_A  5-4 集群环境搭建_B  5-5 集群环境搭建_C 这次开始动手操作,首先是Mesos的安装,怎么来安装Mesos.源码:https://github.com/limin ...

  2. Git学习系列之Git基本操作提交项目(图文详解)

    前面博客 Git学习系列之Git基本操作克隆项目(图文详解) 然后可以 cd 切换到 LispGentleIntro 目录, 新增或者修改某些文件.这里只是模拟一下操作, 实际情况可能是 使用 Ecl ...

  3. Pyside2 学习系列三:PyInstaller打包项目瘦身(超详细的Pyside2 攻略)

    继上一篇文章打包后,发现包太大了,我们现在开始进行瘦身优化. 本项目的所有演示代码:github可在这里下载. 打包只用的工具为PyInstaller. 不想细看的朋友 可以直接跳到 最后 方法对比 ...

  4. Docker学习系列从零开始之汇总【汇总】

    以下是整个docker学习系列的地址,希望可以给到大家一定的帮助: 1.Docker学习系列从零开始之centos6.5底下安装docker[一] 2.Docker学习系列从零开始之制作docker原 ...

  5. Pyside2 学习系列二:PyInstaller打包项目exe (超详细的Pyside2 攻略)

    继上一篇文章创建了项目后,本章我们进行项目的打包工作. 本项目的所有演示代码:github可在这里下载. 打包只用的工具为PyInstaller. 打包步骤 1 准备环境 1.1 安装`PyInsta ...

  6. docker部署机器学习/深度学习模型的容器化方案

    文章目录 什么是docker docker的优点 docker image镜像 Dockerfile 文件 Dockerfile配置例子 创建docker镜像 docker container 容器 ...

  7. 【云原生】docker+k8微服务容器化实战

    博主昵称:跳楼梯企鹅 博主主页面链接:博主主页传送门 博主专栏页面连接:专栏传送门--网路安全技术 创作初心:本博客的初心为与技术朋友们相互交流,每个人的技术都存在短板,博主也是一样,虚心求教,希望各 ...

  8. Docker学习笔记(一)-容器、镜像和客户端与守护进程

    0x00 前言 一直使用过docker,但并不是太了解,于是开始学习了解一下 0x01 docker简介 1.什么是容器? 一种虚拟化的方案 操作系统级别的虚拟化 只能运行相同或相似内核的操作系统 依 ...

  9. Docker是什么?容器化是什么?为什么要容器化?

    近些年来,微服务被捧上了天,不会docker好像都不好意思说自己是后端研发.首先,docker究竟是什么玩意呢?我们可以把它看成虚拟机,能在一台服务器上隔离出若干个互不干扰的环境,还能限制资源的使用量 ...

最新文章

  1. 怎么去掉 IDEA 中 XML 显示的屎黄色
  2. 国内最优秀的Leangoo敏捷项目协作工具
  3. 人类倾向于高估人工智能的进步,低估自身智能的复杂性-读《AI 3.0》
  4. UA MATH636 信息论7 高斯信道
  5. 【数据结构与算法】之判断是否互为字符重排
  6. 求最大公约数——欧几里得算法(JAVA)
  7. ansys19.2安装教程
  8. 【嵌入式模块】LCD1602LCD12864
  9. 8 月 Github 上有哪些值得参与的开源项目?
  10. masm32汇编基础
  11. 老虎证券开放api常用常量
  12. 计算机自我鉴定范文7月,学员自我鉴定表7篇
  13. 字节跳动终于迎来普调,薪资普遍降17%
  14. 难倒高手了,c语言枚举end的作用是什么?
  15. CRM客户信息管理系统
  16. vue项目,解决IE浏览器报Promise未定义的错误
  17. 立竿见影的思维利器——“黄金思维圈”
  18. next在java什么意思_Java中,一个类里面的关键字 next 是什么意思
  19. 一亩三分地 新手上路 95大米 答案 新手入门
  20. 计算机专业第五轮学科评估排名,第五轮学科评估排行榜-第二轮双一流淘汰名单预测...

热门文章

  1. java01背包问题算法_经典动态规划--01背包问题
  2. 解决Windows与虚拟机ubuntu之间相互直接拖动文件
  3. 上传ML模型,一键可视化,终于能看懂神经网络到底在干啥了
  4. vivo不小心把内部自研技术方案写进了“年终总结”,我看了直接好家伙
  5. 看不见的Unicode码让敏感词轻松逃过审核,谷歌IBM都中招
  6. 京东云默默搞了个操作系统,然后惊艳了一大片煤矿
  7. 刚出道的黑客搞瘫美国!他们一边搞钱一边捐款给慈善组织,还说俄国人不打俄国人...
  8. 初二男生为外婆发明认人神器,帮认亲人,20分钟召唤回家,并报出家庭地址...
  9. 用java数组模拟登录和注册功能
  10. [Android] Handler源码解析 (Java层)