使用 Docker 轻松开发 Node.js

上一篇文章中,我们了解到:

  • Docker 基础知识

  • Docker 镜像

  • Docker容器

  • 构建 Node.js 镜像并在容器中运行它

为我们的 Node.js 应用程序提供一个单独的环境看起来不错(对于基础知识而言),但您必须构建一个映像并在进行每一个小更改后再次运行它。

如果您想要同步您的开发环境,以便一旦您对代码进行更改,它会在您再次访问 API 后自动反映,该怎么办?对于开发环境来说听起来很酷,对吧?🤩

输入绑定坐骑

官方文档说,当您使用绑定挂载时,主机上的文件或目录将挂载到容器中。文件或目录通过其在主机上的绝对路径引用。请在此处(https://docs.docker.com/storage/bind-mounts/)阅读官方详细信息。

简而言之,它将应用程序目录与容器内的目录同步,以便您在主机中所做的任何更改都会立即反映在容器中。

将应用程序目录与容器内的目录同步

这意味着如果您更改文件中的任何内容,它们将在正在运行的容器中自动更改。

Nodemon 和 package.json

由于您来自node.js世界,您会知道我们必须使用nodemon它来监视根目录中的文件,然后在检测到文件更改后立即重新启动node.js应用程序。

我全局安装了 nodemon,所以我遇到了 docker 容器的问题,所以请通过运行以下命令来确保您nodemon的容器中有node_modules:

npm install --save-dev nodemon

您将拥有它devDependencies。现在您应该scripts在中进行如下编辑package.json:

"scripts": {
    "start": "node index.js",
    "dev": "nodemon -L index.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },

最后,你的package.json应该看起来像这样:

{
  "name": "docker",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "node index.js",
    "dev": "nodemon -L index.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.18.2"
  },
  "devDependencies": {
    "nodemon": "^3.0.1"
  }
}

我们现在已经完成了package.json更改。让我们继续更新Dockerfile

更新 Dockerfile

在我们从上一篇文章中得到这个之前:

FROM node:12.18.3-alpine3.12
WORKDIR /app
COPY package.json /app
RUN npm install
COPY . /app
EXPOSE 3000:3000
CMD ["node", "index.js"]

现在,由于我们已经更新package.json并且我们想在开发环境中运行它,因此我们必须运行以下命令:

npm run dev

为了使其出现在 Dockerfile 中,我们必须像这样替换最后一行:

CMD ["npm", "run", "dev"]

总体 Dockerfile 应该如下所示:

FROM node:12.18.3-alpine3.12
WORKDIR /app
COPY package.json /app
RUN npm install
COPY . /app
ENV PORT 3000
EXPOSE $PORT
EXPOSE 3000:3000
CMD ["npm", "run", "dev"]

我们还进行了以下两项更改:

ENV PORT 3000
EXPOSE $PORT

3000我们现在直接在我们的环境变量中添加Dockerfile并公开它。

构建 Docker 镜像

由于现在我们进行了更改,package.json因此我们必须根据之前学到的命令重新构建图像:

docker build -t shameel-node-image .

运行 Docker 容器

从上一篇文章中,我们了解到了这个 docker 命令:

docker run -p 3000:3000 -d --name shameel-node-app -d shameel-node-image

这将从容器的内部端口(即,到的shameel-node-app端口)运行名为 docker 容器。shameel-node-imagedetached modeexposes3000hostMachine3000


文章来源地址https://www.toymoban.com/diary/docker/332.html

现在,您需要使用一个新标志-v:

docker run -v <hostMachinePath>:<containerPath> -p 3000:3000 -d --name shameel-node-app -d shameel-node-image

如果你在 Windows 上,你可以这样给出:

docker run -v "D:\shameel-node-docker":/app -p 3000:3000 --name shameel-node-app shameel-node-image

您必须给出 的绝对路径hostMachine。在本例中,D:\shameel-node-docker是我的应用程序在 Windows 计算机中存在的绝对路径。

但这使得我们的命令太长了。我们需要一个能够以更干净的方式为我们提供绝对路径的解决方案。

在 Windows CMD 中,您可以使用以下命令获取它%cd%,在 Linux Bash 中,您应该可以使用以下命令获取它:$(pwd)

对于重击

我使用 Git Bash 进行了尝试,我希望它也能在 Linux 中的 Bash 中工作。

$ docker run -v "$(pwd):/app" -p 3000:3000 -d --name shameel-node-app shameel-node-image

我得到这个输出,这意味着容器开始运行:

使用 Git Bash 进行了尝试,我希望它也能在 Linux 中的 Bash 中工作

对于 Windows CMD

我运行了这个命令,它在 CMD 中就像一个魅力:

docker run -v "%cd%:/app" -d -p 3000:3000 --name shameel-node-app shameel-node-image

检查安装座

您现在已成功地将位置从主机安装到容器并希望验证它。

为此,命令的语法如下:

docker inspect <conainer-name>

对于我的情况,它变成这样:

docker inspect shameel-node-app

然后从整个输出中查找Mounts 。

如果您不想检查所有内容而只想关注Mount,请运行以下命令:

docker inspect -f "{{ .Mounts }}" shameel-node-app

您应该能够看到bind主机到容器的路径。

如果您有 Docker Desktop,则可以选择容器并单击Bind mounts以查看:

选择容器并单击Bind mounts以查看

Docker 桌面绑定挂载

避免node_modules同步

目前,如果您node_modules从主机中删除。它也将从容器中删除。

这不应该是一个想要的行为,因为我们已经node_modules在我们的Dockerfile. 因此,我们必须想出一种方法来同步除node_modules

我们将不得不使用-v具有更具体路径的标志。

我在 CMD 中运行了这样的命令:

docker run -v "%cd%:/app" -v /app/node_modules -d -p 3000:3000 --name shameel-node-app shameel-node-image

现在,您也可以从 Docker Desktop 进行验证:

Docker Dekstop 验证

node_modules除了是 之外的一切MOUNT。

node_modulesnpm install现在通过我们的命令安装Dockerfile,并且不再同步到主机。

验证开发环境

目前我们有这个应用程序:

应用程序截图

进行轻微更改并将其保存在文件中后,如下所示:

app.get('/', (_, res) => {
    res.send('Hello Shameel! How are you?');
    }
);

您可以在下图中检查nodemonDocker Desktop 日志中的重新启动,一旦我们刷新页面,我们应该能够看到反映的更改

反映的变化

您也可以通过此命令检查 CLI 中的日志:

docker logs <container>

对我来说,它是:

docker logs shameel-node-app

码头工人日志

为什么应该进行只读绑定挂载

目前,安装是双面的。如果您对容器中的目录进行任何更改app,它将反映在您的主机中。

这是危险的,因为如果有人以某种方式访问了您的容器,那么黑客就可以轻松地将恶意内容放入您的主机中。

命令中唯一的变化是添加了:ro确保挂载为只读的命令。

bash 中的命令如下所示:

docker run -v "$(pwd):/app:ro" -p 3000:3000 -d --name shameel-node-app shameel-node-image

CMD 中的命令如下所示:

docker run -v "%cd%:/app:ro" -p 3000:3000 -d --name shameel-node-app shameel-node-image

结论

在这篇博客中,我们学习了如何在 docker 的帮助下通过合并绑定挂载并确保我们的开发更改在保存文件后立即得到反映,从而使 Node.js 中的开发变得容易。

快乐的编码和容器化!🐳✨


到此这篇关于使用 Docker 轻松开发 Node.js的文章就介绍到这了,更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

原文地址:https://www.toymoban.com/diary/docker/332.html

如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用
面向 Nodejs 开发人员的 Docker
上一篇 2023年09月28日 10:56
如何强制在浏览器网站上启用复制和粘贴!JavaScript 书签
下一篇 2023年09月28日 11:32

相关文章

  • Node,docker 中安装node.js

    首先启动docker服务:systemctl start docker 启动完成之后拉取node最新镜像:docker pull node 然后开始等待,最后拉取完成会有相应的输出信息。 我们再通过命令确认下node是否拉取成功:docker images 到这里,node最新镜像已被成功拉取下来。 接下来我们就要运行镜像:docker run -i -t node /

    2024年02月13日
    浏览(35)
  • 实战:Docker化Node.js项目

    Docker是一种轻量级的应用容器技术,可以将应用程序及其所有依赖项打包成一个可移植的容器,以便在任何支持Docker的环境中运行。Node.js是一种基于Chrome的JavaScript运行时,可以用于构建高性能和可扩展的网络应用程序。在现代软件开发中,将Node.js应用程序Docker化是一项重要

    2024年02月21日
    浏览(37)
  • Docker与Node.js容器化

    Docker是一种开源的应用容器引擎,它使用标准化的包装应用程序以及它们的依赖项,以便在任何运行Docker的环境中运行。Node.js是一个基于Chrome的JavaScript运行时,它使得开发者可以使用JavaScript编写后端应用程序。 容器化是一种将应用程序和其所有依赖项打包到一个可移植的环

    2024年02月21日
    浏览(34)
  • 如何选择最佳的 Node.js Docker 镜像

    选择一个Node.js的Docker镜像看起来像是一件小事,但是镜像的大小和潜在漏洞可能会对你的CI/CD流程和安全造成重大的影响。那我们如何选择一个最好Node.js Docker镜像呢?我们在使用 FROM node:latest 或只是 FROM node 时,很容易忽略他潜在的风险。如果你不知道总体的安全风险并且把

    2024年02月10日
    浏览(47)
  • 如何使用Zabbix官方模板轻松实现Docker容器监控?

    感谢王军 ZCP(Zabbix 高级认证专家)翻译!欢迎投稿分享你的使用经验。 本文将介绍通过Zabbix监控Docker容器。使用官方模板 Docker by Zabbix agent2 template 很容易实现Docker容器监控。模板下载链接和配置步骤可以在 Zabbix 集成页面上找到。 导入官方Docker模板 安装并配置Zabbix Agent2 Z

    2024年02月05日
    浏览(34)
  • 疯狂Node.js服务器篇:使用VsCode搭建Node.js开发环境

    疯狂Node.js服务器篇:使用VsCode搭建Node.js开发环境 Node.js作为一种流行的服务器端JavaScript运行环境,提供了强大的功能和便捷的开发体验。在本篇文章中,我们将探索如何使用VsCode搭建Node.js开发环境,以便更高效地进行服务器端应用程序的开发。 步骤1:安装Node.js 首先,我们

    2024年02月08日
    浏览(52)
  • 轻松掌握k8s(使用docker)安装知识点

    kubernetes具有以下特性: 服务发现和负载均衡 Kubernetes 可以使用 DNS 名称或自己的 IP 地址公开容器,如果进入容器的流量很大, Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。 存储编排 Kubernetes 允许你自动挂载你选择的存储系统,例如本地存储、公共云提供商等。

    2023年04月22日
    浏览(31)
  • Node Version Manager(nvm):轻松管理 Node.js 版本的利器

    Node.js 是现代 Web 开发中不可或缺的一部分,然而,随着时间的推移,Node.js 的不断更新和发展,我们往往需要在同一台机器上安装和管理多个 Node.js 版本,以适应不同项目的需求。而在这个问题上, Node Version Manager(nvm) 成为了解决方案。本文将介绍如何安装和使用 nvm,让

    2024年04月28日
    浏览(33)
  • 轻松使用Docker启动MySQL并初始化SQL(Dockerfile)

    在本教程中,我们将使用Docker来启动MySQL容器,并通过初始化SQL脚本来创建数据库和表。此外,我们还将演示如何将MySQL密码外置到环境变量文件中,以增加安全性。 在开始之前,请确保已经安装了Docker。如果尚未安装,可以参考我前面的教程 首先,我们需要创建一个名为

    2024年02月22日
    浏览(56)
  • 使用Portainer图形化工具轻松管理远程Docker环境并实现远程访问

    Portainer 是一个轻量级的容器管理工具,可以通过 Web 界面对 Docker 容器进行管理和监控。它提供了可视化的界面,使得用户可以更加方便地管理 Docker 容器、镜像、网络和数据卷等资源。下面介绍如何将本地Portainer 管理界面结合cpolar内网穿透工具实现远程任意浏览器访问! 远程

    2024年02月08日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包