docker学习系列7 容器化Node项目
本节我们自己打包一个docker镜像并发布到官方的镜像仓库中。这样任何人只需执行以下命令:
docker run -d -p 3000:3000 finleyma/express
就可以访问一个简单的express程序了。
需要你有简单的express使用经验
实现过程非常简单:
- 本地全局安装
npm install express-generator -g
- 初始化一个express项目
express myapp
- cd myapp,然后 npm run start,项目就在本地运行了。
- 我们在项目内建立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"]
- 构建镜像
docker build -t finleyma/express .
别忘了最后的点,表示当前目录 - 启动容器
docker run -d -p 3000:3000 finleyma/express
- 可选,登录docker hub, 并提交镜像。
docker login
,docker push finleyma/express
- 进入容器
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的好处:
- 使用版本方便,比如服务器上跑着node6,而你的项目需要node8以上。使用docker因为是隔离的环境
- 部署分享也方便,一行命令完事
问题:容器内的 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项目相关推荐
- 《docker+k8s微服务容器化实践》笔记2
5-3 集群环境搭建_A 5-4 集群环境搭建_B 5-5 集群环境搭建_C 这次开始动手操作,首先是Mesos的安装,怎么来安装Mesos.源码:https://github.com/limin ...
- Git学习系列之Git基本操作提交项目(图文详解)
前面博客 Git学习系列之Git基本操作克隆项目(图文详解) 然后可以 cd 切换到 LispGentleIntro 目录, 新增或者修改某些文件.这里只是模拟一下操作, 实际情况可能是 使用 Ecl ...
- Pyside2 学习系列三:PyInstaller打包项目瘦身(超详细的Pyside2 攻略)
继上一篇文章打包后,发现包太大了,我们现在开始进行瘦身优化. 本项目的所有演示代码:github可在这里下载. 打包只用的工具为PyInstaller. 不想细看的朋友 可以直接跳到 最后 方法对比 ...
- Docker学习系列从零开始之汇总【汇总】
以下是整个docker学习系列的地址,希望可以给到大家一定的帮助: 1.Docker学习系列从零开始之centos6.5底下安装docker[一] 2.Docker学习系列从零开始之制作docker原 ...
- Pyside2 学习系列二:PyInstaller打包项目exe (超详细的Pyside2 攻略)
继上一篇文章创建了项目后,本章我们进行项目的打包工作. 本项目的所有演示代码:github可在这里下载. 打包只用的工具为PyInstaller. 打包步骤 1 准备环境 1.1 安装`PyInsta ...
- docker部署机器学习/深度学习模型的容器化方案
文章目录 什么是docker docker的优点 docker image镜像 Dockerfile 文件 Dockerfile配置例子 创建docker镜像 docker container 容器 ...
- 【云原生】docker+k8微服务容器化实战
博主昵称:跳楼梯企鹅 博主主页面链接:博主主页传送门 博主专栏页面连接:专栏传送门--网路安全技术 创作初心:本博客的初心为与技术朋友们相互交流,每个人的技术都存在短板,博主也是一样,虚心求教,希望各 ...
- Docker学习笔记(一)-容器、镜像和客户端与守护进程
0x00 前言 一直使用过docker,但并不是太了解,于是开始学习了解一下 0x01 docker简介 1.什么是容器? 一种虚拟化的方案 操作系统级别的虚拟化 只能运行相同或相似内核的操作系统 依 ...
- Docker是什么?容器化是什么?为什么要容器化?
近些年来,微服务被捧上了天,不会docker好像都不好意思说自己是后端研发.首先,docker究竟是什么玩意呢?我们可以把它看成虚拟机,能在一台服务器上隔离出若干个互不干扰的环境,还能限制资源的使用量 ...
最新文章
- 怎么去掉 IDEA 中 XML 显示的屎黄色
- 国内最优秀的Leangoo敏捷项目协作工具
- 人类倾向于高估人工智能的进步,低估自身智能的复杂性-读《AI 3.0》
- UA MATH636 信息论7 高斯信道
- 【数据结构与算法】之判断是否互为字符重排
- 求最大公约数——欧几里得算法(JAVA)
- ansys19.2安装教程
- 【嵌入式模块】LCD1602LCD12864
- 8 月 Github 上有哪些值得参与的开源项目?
- masm32汇编基础
- 老虎证券开放api常用常量
- 计算机自我鉴定范文7月,学员自我鉴定表7篇
- 字节跳动终于迎来普调,薪资普遍降17%
- 难倒高手了,c语言枚举end的作用是什么?
- CRM客户信息管理系统
- vue项目,解决IE浏览器报Promise未定义的错误
- 立竿见影的思维利器——“黄金思维圈”
- next在java什么意思_Java中,一个类里面的关键字 next 是什么意思
- 一亩三分地 新手上路 95大米 答案 新手入门
- 计算机专业第五轮学科评估排名,第五轮学科评估排行榜-第二轮双一流淘汰名单预测...
热门文章
- java01背包问题算法_经典动态规划--01背包问题
- 解决Windows与虚拟机ubuntu之间相互直接拖动文件
- 上传ML模型,一键可视化,终于能看懂神经网络到底在干啥了
- vivo不小心把内部自研技术方案写进了“年终总结”,我看了直接好家伙
- 看不见的Unicode码让敏感词轻松逃过审核,谷歌IBM都中招
- 京东云默默搞了个操作系统,然后惊艳了一大片煤矿
- 刚出道的黑客搞瘫美国!他们一边搞钱一边捐款给慈善组织,还说俄国人不打俄国人...
- 初二男生为外婆发明认人神器,帮认亲人,20分钟召唤回家,并报出家庭地址...
- 用java数组模拟登录和注册功能
- [Android] Handler源码解析 (Java层)