网站首页 > 开源技术 正文
创建 docker 镜像并通过 3 个步骤部署您的 Node 应用程序
为什么选择 Docker?
“Docker 消除了重复的、平凡的配置任务,并在整个开发生命周期中用于快速、简单和可移植的应用程序开发——桌面和云。 Docker 全面的端到端平台包括 UI、CLI、API 和安全性,旨在在整个应用程序交付生命周期中协同工作。” - 官方网站
我自己说得再好不过了。 这正是 Docker 的原因。 如果这有点难以理解,简单来说,这意味着 Docker 让您可以更专注于让您的代码/产品/应用程序变得更好,消除随之而来的所有与部署和分发相关的担忧。
Docker 配置
完成最初的步骤后,终于到了配置我们的应用程序以与 Docker 一起使用的时候了。 我们将同时使用 Dockerfile 和 docker-compose 方法来对我们的应用程序进行 docker 化。
使用 Dockerfile
在项目的根目录中,添加一个名为 Dockerfile 的新文件。 请记住,它必须具有确切的名称,否则您将必须明确告诉 docker 哪个文件用作配置。 此外,此文件没有扩展名。
- FROM node:lts-alpine——指示 Docker 使用来自 Docker 注册表的精简版本的 NodeJS 镜像,作为我们正在创建的镜像的基础。
- 使用 WORKDIR /usr/app,我们创建一个 usr/app 一个工作目录,我们的所有代码都将在其中存在,然后将 package.json 和 package-lock.json 复制到该目录。
- 通过首先复制 package.json 和 package-lock.json,我们利用了 Docker 附带的缓存,因为它只复制在图像创建之间更改的文件。
- 完成后,我们从项目根目录复制所有内容。 (在我们的机器上),在容器上的 WORKDIR 上。
- 通过使用 EXPOSE 4000,我们让 docker 知道,一旦我们使用此映像启动容器,我们希望端口 4000 可用于流量。
- RUN npm run ts-build 也是我们在本地机器上所做的。它只是编译我们的 TypeScript 代码。
- 最后,CMD ["node", "/dist/index.js"] 是我们指定在使用我们的图像创建新容器时应该执行的默认命令的方式。毕竟,我们确实希望我们的应用程序在容器启动后启动。
此时,我们实际上可以继续构建我们的镜像,并通过在 CLI 中运行一些命令来启动一个新容器,或者我们可以创建一个 docker-compose 文件。我肯定会向您展示两种方式,但请记住,使用 docker-compose 确实使很多事情变得更容易。一旦我们进入下一步,您将看到这一点。
使用 docker-compose
和以前一样,在项目的根目录中添加 2 个新文件 docker-compose.yml 和 Dockerfile.dev。原因很简单,这将用于开发环境。是的!这是正确的!与我们使用 webpack 或使用 nodemon 所做的类似,我们也可以在 Docker 中拥有 dev 和 prod 版本。
如果你把 Dockerfile.dev 和 docker-compose.yml 都拿来和一开始创建的 Dockerfile 比较,你会发现相似之处。 我们仍在公开 PORT 4000 并添加 npm run dev 的默认容器命令。
如果你已经完成了这里,我们已经完成了主要配置,我们将需要为我们的应用程序创建一个图像并使用该图像启动一个新容器。
构建镜像并启动容器
我们可以通过不同的方式构建图像。
使用 Dockerfile
通过运行以下命令,我们告诉 docker 使用当前上下文构建一个新镜像。 ,使用 -t 标志在 <your_dockerhub_name>/<container_name>:tag 中命名图像,并使用我们首先创建的 Dockerfile 执行所有这些操作。
docker image build . -t <your_dockerhub_name>/<container_name>:tag
现在要使用该图像创建一个新容器,我们需要运行:
docker run -p 4000:4000 <image_name/image_id>
您将看到 -p 4000:4000 标志和传递到命令中的值,它告诉 docker 将我本地机器的端口 4000 映射到容器的端口 4000。 这将使我可以在 localhost:4000 上访问我的节点应用程序。 这称为容器端口映射。
使用 docker-compose
还记得我们添加到 docker-compose 文件中的所有配置吗? 还有我是如何告诉你的,使用 docker-compose 会让你的生活更轻松? 现在是时候施展魔法了……通过在 cli 中运行以下命令,我们可以一次性构建映像并启动新容器。
docker-compose up --build
就是这样。 --build 标志指示 docker 首先使用 Dockerfile.dev 中的配置构建映像,然后启动具有所有这些网络设置(容器端口映射)和默认命令的新容器。
添加生成文件
老实说,很难继续编写相同的长命令,或者记住必须传递到 cli 的所有标志。 我建议您在项目根目录中添加一个 Makefile 并创建脚本(类似于我们在 package.json 中所做的)。 运行任何命令就像 make <command_name> 一样简单。
运行 make up-dev 命令或 make build-image,然后运行 make run-image 命令后,您的应用程序将在 Docker 容器中运行。 如果您在终端/控制台中没有收到任何错误,请访问 localhost:4000,您将看到打印的消息 — Hello World!。 从那时起,天空就是你的极限。
关注七爪网,获取更多APP/小程序/网站源码资源!
猜你喜欢
- 2024-10-22 调用 Express API时出现奇怪的CORS错误怎么办?
- 2024-10-22 详解如何从零开始搭建Express+Vue开发环境
- 2024-10-22 从零开始学习nodejs+express--交互环境
- 2024-10-22 express开发(一)简介与搭建(express创建项目)
- 2024-10-22 express中间件原理connect(express和koa中间件原理的区别)
- 2024-10-22 蓝易云 - centos系统直接部署express教程。
- 2024-10-22 Node + Express + Mysql: Todo List项目让你成全栈
- 2024-10-22 我为 Express 开了外挂(cad中的express怎么显示为中文)
- 2024-10-22 Node实战篇:Express--jade模板引擎(七)
- 2024-10-22 深入全面讲解Express的Cookies:原理解析与代码示例
你 发表评论:
欢迎- 03-19基于layui+springcloud的企业级微服务框架
- 03-19开箱即用的前端开发模板,扩展Layui原生UI样式,集成第三方组件
- 03-19SpringMVC +Spring +Mybatis + Layui通用后台管理系统OneManageV2.1
- 03-19SpringBoot+LayUI后台管理系统开发脚手架
- 03-19layui下拉菜单form.render局部刷新方法亲测有效
- 03-19Layui 遇到的坑(记录贴)(layui chm)
- 03-19基于ASP.NET MVC + Layui的通用后台开发框架
- 03-19LayUi自定义模块的定义与使用(layui自定义表格)
- 最近发表
-
- 基于layui+springcloud的企业级微服务框架
- 开箱即用的前端开发模板,扩展Layui原生UI样式,集成第三方组件
- SpringMVC +Spring +Mybatis + Layui通用后台管理系统OneManageV2.1
- SpringBoot+LayUI后台管理系统开发脚手架
- layui下拉菜单form.render局部刷新方法亲测有效
- Layui 遇到的坑(记录贴)(layui chm)
- 基于ASP.NET MVC + Layui的通用后台开发框架
- LayUi自定义模块的定义与使用(layui自定义表格)
- Layui 2.9.11正式发布(layui2.6)
- Layui 2.9.13正式发布(layui2.6)
- 标签列表
-
- jdk (81)
- putty (66)
- rufus (78)
- 内网穿透 (89)
- okhttp (70)
- powertoys (74)
- windowsterminal (81)
- netcat (65)
- ghostscript (65)
- veracrypt (65)
- asp.netcore (70)
- wrk (67)
- aspose.words (80)
- itk (80)
- ajaxfileupload.js (66)
- sqlhelper (67)
- express.js (67)
- phpmailer (67)
- xjar (70)
- redisclient (78)
- wakeonlan (66)
- tinygo (85)
- startbbs (72)
- webftp (82)
- vsvim (79)
本文暂时没有评论,来添加一个吧(●'◡'●)