Docker部署node.js应用

2023-11-16

前言

什么是docker?

通俗的理解,docker是创建和管理容器的一种技术。那什么是容器呢?容器的功能与虚拟机很近似,都是在一个物理主机上运行多个操作系统的技术。最大的不同之处在于,虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。

基本概念
  1. 镜像
    Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。我们可以通过命令或者一些基础镜像,构建自己需要的镜像。
  2. 容器
    容器可以看作镜像的实体,容器可以被创建、启动、停止、删除、暂停等。
为什么使用docker

我们知道在部署node.js的应用时,需要已经安装node与npm,如果涉及数据库的话,还需要有数据库的环境和数据库信息。在启动应用时,还需要安装程序依赖的第三方库。如果只是单纯的在一台机器上部署的话,感觉还好。但是如果我们需要在很多机器上部署该应用的话,按照一般的方法,就需要在多个机器上不断地重复搭建应用所需要的环境,这是一个很费时间的过程。如果我们采用docker的形式,就可以在本地创建一个应用程序的镜像(包含程序运行所需要的一切环境),然后只需要在远程主机上传我们创建的镜像,然后使用docker根据镜像创建运行应用进程的容器,轻松几行命令就可以在多个主机上运行我们的程序。

环境说明

本文中所有操作均在Ubuntu 16.0上进行。

前期准备

本文读者熟悉node.js技术,已经可以使用node.js搭建一个简单的应用。所以,本文说明中不包含具体的node.js代码教程。此外,本文的node.js设计MySql存储,不涉及数据库的可以直接从第三节开始看起。

一、安装docker

参考文章

二、MySQL容器制作

拉取MySQL数据库镜像
docker pull mysql/mysql-server:tag  

tag: 想要拉取的镜像的版本号 (比如, 5.5, 5.6, 5.7, 8.0, or latest).这里用的是5.7。
不建议使用8.0或者latest。新版本的mysql有些操作跟之前的不太一样,按照网上大多数教程处理可能会有意想不到的错误。本人已经踩坑。

运行MySQL数据库容器
sudo docker run --name db-manage -d -e MYSQL_ROOT_PASSWORD=password -p 3306:3306 mysql/mysql-server:5.7  

–name db-manage: 命名MySQL镜像运行的容器的名称
-d detach,在后台运行容器。
-e MYSQL_ROOT_PASSWORD=123(或者是 –env)环境变量 – 参数告诉 docker 所提供的环境变量MYSQL_ROOT_PASSWORD=password:设置数据库root账户密码为password
-p 3306:3306(或者 –publish) 告诉引擎用户想要将容器内的3306端口映射到外部的3306端口上。

mysql/mysql-server:5.7 : 是拉取的mysql数据库镜像

添加从外部访问数据库的权限

MySQL默认是不能从外部网络访问的,默认只能使用本地IP(127.0.0.1)访问。我们待会需要运行node.js的容器具有访问运行MySQL服务的容器的权限。
或许你会觉得很疑惑,都是在一台机器上,不应该是一个IP地址么?
并不是这样。因为实际的主机会为每个运行在其上面的容器单独分配IP,所以不同容器之间,IP地址并不一样。

1.进入MySQL容器
sudo docker exec -it db-manage bash

db-manage:运行MySQL的容器名称

2.在容器中进入Mysql服务
mysql -uroot -ppassword

root:数据库用户名
password:之前运行容器时设置的数据库密码

3.添加外部访问权限

运行以下命令(若之前拉的MySQL版本高于5.7,会报错。因为之后版本的MySQL添加用户权限方式的命令不是下列所展示,具体请参考官网)

# 切换数据库
USE mysql;
# 给root账户开放所有ip访问权限
GRANT ALL PRIVILEGES ON *.* TO "root"@"%" IDENTIFIED BY "password" WITH GRANT OPTION; 
# 更新权限设置
FLUSH PRIVILEGES;

MySQL命令已分号结尾
必须使用FLUSH PRIVILEGES更新权限设置才有效
如果只想为指定IP连接MySQL数据库赋予权限,使用一下命令:(更多给MySQL添加用户权限可以参考这篇文章)

# 给root账户开放192.168.1.3访问权限
GRANT ALL PRIVILEGES ON *.* TO "root"@"192.168.1.3" IDENTIFIED BY "password" WITH GRANT OPTION; 

三、node程序容器制作

拉取node.js基础镜像
sudo docker pull node:tag  

tag 想要拉取的镜像的版本号。这里使用9.11.2-jessie 参考docker公共镜像官网(/node/”>https://hub.docker.com//node/)

制作自己的node.js服务镜像

前提准备:
1. 已经有可以运行的node.js程序
2. node.js链接数据库的设置如下:

const address = {
    host     : process.env.DATABASE_HOST || 'localhost',
    user     : 'root',
    password : 'choosealife',
    port:  process.env.PORT || '3306',
    database: 'manage',
};
1.进入程序文件夹根目录
cd node-app
2.创建Dockerfile文件(文件名不能更改)
    touch Dockerfile  
 文件内容如下:
# 选择之前下载的node基础镜像 node:<version>
FROM node:9.11.2-jessie
#将当前文件夹下所有文件加入需要制作的镜像中, 在 'manage' 文件夹中.
ADD . /manage
#  下载所需要的包
RUN cd /manage;
npm install --production
# 定义程序默认端口
EXPOSE 3000
# 运行程序命令(manage是ADD添加的文件夹名称, server.js是自己的程序启动入口文件)
CMD ["node","/manage/server.js"]
3.制作镜像
 sudo docker build -t node-image-name .

注意: node-imge-name是镜像名称。命令后有一个 . , 不能忘记了。

4.运行node程序镜像并关联运行的MySQL容器
sudo docker run --name manage-system -it -p 3000:3000 --link db-manage:db-manage -e DATABASE_HOST=db-manage  node-manage-image
  1. docker run -it 在容器里运行 docker 镜像,使用交互式终端。
  2. -p 3000:3000 将宿主机的3000 端口映射到容器的3000 端口上
  3. link db-manage:db-manage 连接到名为 db-manage的 容器上,并且用 db-manage 指代该容器
  4. -e DATABASE_HOST=db-manage 将在node.js数据库连接中设置的环境变量 DATABASE_HOST 设置为 db-manage
  5. node-image-name 是在容器内运行的镜像名称

四、上传docker镜像到远程仓库

  1. 上传到docker hub
    参考文章

  2. 上传到腾讯云服务器
    参考文章

  3. 上传到阿里云服务器
    参考文章

五、常用docker命令

1.获取基础镜像
sudo docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
2.制作镜像
# 需要提前创建构建文件Dockerfile, version不是必须, 默认为latest, . 表示当前目录
sudo docker build -t imgae-name:version .
3.查看镜像
sudo docker image ls
4.删除镜像
sudo docker image rm image-name
5.已指定镜像创建容器
sudo docker run -it image-name
6.启动已经存在的容器
sudo docker container start container-name
7.停止已经运行的容器
sudo docker container stop container-name
8.重启已经运行的容器
sudo docker container restart container-name
9.查看所有容器
sudo docker container ls -a
10.删除容器
# 删除指定容器, 加上-f可以强制删除正在运行的容器
sudo docker container rm  container-name
# 清除所有处于终止状态的容器
 sudo docker container prune
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Docker部署node.js应用 的相关文章

  • 如何保护我的网站免遭 HTTrack 或其他软件的翻录?

    我最近获得了批准的网站模板主题森林 http themeforest net 我的网站流量过多 并注意到我在 Themeforest 上的演示被 HTTrack 等某些软件破坏 如果这种情况持续下去 该产品的销量最终可能会下降 那么 有什么
  • 在 Tomcat 上部署 Java Web 项目,无需 WAR 或 EAR

    我有一个 Java Web 项目 Struts Spring 在我的本地主机上完美运行 我必须将其部署在我的网站上 但虚拟主机提供的 Tomcat Manager 界面显示 由于安全原因 它无法上传 WAR 文件 当联系技术支持时 我被告知
  • Java selenium - 如何在 TimeoutException 之后正确刷新网页?

    ChromeOptions options new ChromeOptions options addExtensions new File extension 6 2 5 0 crx ZenMate options addExtensio
  • 在 Blogger 中使用相对链接

    我正在使用博主 当我需要在我的博客文章中提到一个链接并且该链接实际上是我自己的博客文章的链接时 我在其旁边提到标签 www my blog name blogspot in 12 2013 how to do html if i chang
  • 部署 .war 时出现 Glassfish 服务器错误:部署期间发生错误:准备应用程序时出现异常:资源无效

    我正在使用以下内容 NetBeans IDE 7 3 内部版本 201306052037 爪哇 1 7 0 17 Java HotSpot TM 64 位服务器虚拟机 23 7 b01 NetBeans 集成 GlassFish Serve
  • 在脚本标签内工作的角度表达式

    如何在脚本标签内使用角度表达式 我对此很陌生并且需要帮助 这是我的 java 脚本代码的示例
  • Web 应用程序使用 API 来完成一切?

    我即将开始为我的公司规划一个内部项目管理工具 API 一直让我疑惑 首先创建 API 并使用这些 API 调用构建实际站点而不是实施两次 是否会被视为不好的做法 效率太低 让我知道你的想法 我完全同意开发 API 将为您提供解耦的架构 并且
  • 网站 YouTube 嵌入视频不断播放

    我正在使用 youtube 提供的 iframe 在我的网站上嵌入视频 我还使用了一个 css 弹出窗口 这是我从这个页面学到的http www pat burt com web development how to do a css po
  • 同源政策目的可疑

    正如我所读到的 同源策略是防止源自 邪恶 域 A 的脚本向 良好 域 B 发出请求 换句话说 跨站点请求伪造 玩了一下我了解到的Access Control Allow Origin标头和CORS据我了解 它允许从好域 B 指定服务器 域
  • Azure Web 角色中的网站项目

    我正在研究一个新的 ASP Net 项目 我们希望将其托管在 Windows Azure Web 角色中 该项目的技术要求之一是利用 ASP Net 的完整预编译选项 不可更新 单页程序集 Web Site项目模型 与 ASP Net 相反
  • 我可以通过什么方式混合 jQuery 和 vanilla JavaScript

    我有一个用普通 JavaScript 编写的 Web 应用程序 我想用 jQuery 动画来增强它 并使用我在各种 jQuery 插件中找到的一些功能 例如上传 http www uploadify com 可以通过什么方式将 jQuery
  • wix 安装程序/创建网站并分配新的或现有的 Web 应用程序池

    我尝试使用 wix 安装创建一个新网站 没关系 没有问题 但我无法将新的或现有的网络应用程序池分配给新网站 iis website 标记不包含 WebAppPool 属性 我如何将网络应用程序池分配给网站 你可以在下面看到我的代码 感谢您的
  • ASP.net获取硬件信息

    如果我创建一个 ASP net 页面 我是否能够获取当前用户的 CPUID 和 BIOS 序列号 还是出于安全原因不允许这样做 我目前有一个获取这些值的 Visual Basic net 应用程序 我只是想知道是否可以在网页上执行相同的操作
  • 我想将我的 NEXT.js 项目链接到静态网站

    我有一个使用 HTML CSS 开发的网站 它是一个静态网站 但现在我使用 NEXT js 与 Strapi API 集成创建了一个博客项目 我的问题是如何将我的静态网站与我的 Next js 项目链接起来 我尝试使用链接标签 但没有用 i
  • 如何在 PHP Soap 客户端中禁用命名空间别名?

    我的 PHP Microsoft AX 集成有问题 我正在使用 SOAP WSDL 与服务集成 我遇到的问题是在从 PHP 向 WSDL 发送请求后收到此错误 无效的实例类型名称 ns3 AxdEntity DirParty DirOrga
  • 在 CMS(Wordpress 和 phpBB)之间共享登录信息

    假设我想开发一个嵌入一些 CMS 的网站 例如 WordPress http wordpress org 博客和phpbb http www phpbb com forum 统一网站登录和注册流程的最便捷方法是什么 让用户对网站的每个部分采
  • 是否可以下载网站的完整代码、HTML、CSS 和 JavaScript 文件? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 是否可以完全下载网站或查看其所有代码 例如 我知道您可以在浏览器中查看页面源代码 但是有没有办法下载所有网站代码 例如 HTML CSS
  • 如何在Fiddler中显示请求发送时间和响应接收时间?

    我正在使用 Fiddler Web 调试器工具版本 4 4 4 8 我已经向例如提出了请求www google com 和 fiddler 显示发送了请求并收到了响应 我如何知道并显示请求何时发送以及何时收到响应 开始 结束日期不在 Fid
  • 开发工具在表达式上中断

    当给定的 Javascript 表达式为 true 时 我想暂停一切 我见过条件断点 但这对我不起作用 因为这需要首先在某处设置断点 或者首先基于某个标准 然后向其添加附加条件 相反 我想要的是能够在给定表达式为真时中断 无论在哪里 在 D
  • 如何测量我的网站客户端的图像下载时间?

    在 Img 标签中 我们知道图像有一个 OnLoad 事件 该事件在图像完成加载时触发 但是我们能在图像开始下载时得到准确的测量结果吗 我正在尝试测量网站的页面加载时间 因此如果可能的话 了解加载图像需要多长时间将成为我分析的一部分 我想以

随机推荐

  • linux下搭建goprotobuf

    linux下搭建goprotobuf 1 搭建go语言环境 参考官网 http golang org doc install 主要是设置好GO PATH这个变量 这个就是你的工作环境目录 可以使用go env来查询设置好了没 2 搭建pro
  • python中列表概念,Python基本数据类型——List(列表)

    1 序列 1 1 序列的基本概念 序列是Python中最基本的一种数据结构 序列用于保存一组有序的数据 所有的数据在序列当中都有一个唯一的位置 索引 并且序列中的数据会按照添加的顺序来分配索引 数据结构是指计算机中数据存储的方式 1 2 序
  • Pinpoint--基础--04--请求追踪和字节码插装

    Pinpoint 基础 04 请求追踪和字节码插装 备注 背景 英文原文 https naver github io pinpoint 1 8 4 techdetail html Dapper原文 https ai google resea
  • 00后卷王自述,我真的很卷吗?

    前段时间我去面试了一个软件测试公司 成功拿到了offer 薪资也从10k涨到了18k 对于工作都还没两年的我来说 还是比较满意的 毕竟有些工作了3到4年的可能还没有我的高 在公司一段时间后大家都说我是卷王 其实我也没办法 自己家里条件不是很
  • Pytorch ----注意力机制与自注意力机制的代码详解与使用

    注意力机制的核心重点就是让网络关注到它更需要关注的地方 当我们使用卷积神经网络去处理图片的时候 我们会更希望卷积神经网络去注意应该注意的地方 而不是什么都关注 我们不可能手动去调节需要注意的地方 这个时候 如何让卷积神经网络去自适应的注意重
  • Java基础6--对象和类

    Java基础6 对象和类 文章目录 Java基础6 对象和类 概念 Java中的对象 Java 中的类 构造方法 创建对象 访问实例变量和方法 Java 内部类 非静态内部类 静态内部类 从内部类访问外部类成员 import 语句 概念 对
  • 异步编程CompletableFuture系列3 接口合并

    直接上代码 import java util concurrent CompletableFuture import java util concurrent TimeUnit public class Test3 public stati
  • 没有找到MSVCR90D.DLL的两种解决方法

    1 没有找到MSVCR90D DLL的简单解决方法之一 在VS2005 2008下写C C 程序时 偶然会出现这样的错误 这样的错误一般会出现在第一次运行项目时 或重装VS后 这里提供一种简单的解决办法 希望对初学者有用 打开项目的属性页
  • 【CCPC-2019】【江西省赛】【霖行】J-Worker

    CCPC 2019 江西省赛 霖行 J Worker 题目 Avin meets a rich customer today He will earn 1 million dollars if he can solve a hard pro
  • python中用pickle打开文件报错:EOFError: Ran out of input

    用pickle dump 保存文件之后如果不关闭文件就会出现此错误 f open test pkl wb pickle dump dict f f close 后面添加关闭就不会报错
  • JAVA - 判断两个浮点数相等

    背景知识 float型和double型是JAVA的基本类型 用于浮点数表示 在JAVA中float型占4个字节32位 double型占8个字节64位 一般比较适合用于工程测量计算中 其在内存里的存储结构如下 float型 符号位 1 bit
  • 基于梯度下降算法求解线性回归

    点击上方 小白学视觉 选择加 星标 或 置顶 重磅干货 第一时间送达 01 线性回归 Linear Regression 梯度下降算法在机器学习方法分类中属于监督学习 利用它可以求解线性回归问题 计算一组二维数据之间的线性关系 假设有一组数
  • Solidworks2022-2-软件安装步骤

    Solidworks2022软件安装步骤 1 先确定你的系统是否已经安装了 net 3 5 和 net 4 0 net 3 5 和 net 4 0查看方法 如果 没有或缺少 根据第二张图进行下载或增加一下 2 断开网络连接 关闭保护设置 3
  • Linux_centos7_vi/vim程序编辑器_(6)_(bird_bro)

    参考资料 https studylib net doc 11479665 vi vim graphical cheat sheet q j
  • noj.26 二叉排序树的合并

    题目描述 分析 1 先序 创建二叉排序树 2 在二叉排序树中插入一个值 3 n 大于根节点在右子树中插入 4 n 小于根节点在左子树中插入 5 合并排序二叉树 6 中序输出合并后的排序二叉树 完整代码 include
  • 谈谈react操作onMouseEnter、onMouseLeave结合css里的hover

    react对于每个html元素都添加了很多事件处理函数 这些事件网上一搜就都出来了 这里简单说下在react中利用js进行操作类似于css里的hover所使用的事件 比如这样一个需求 有以下3个div div class a abc a d
  • 在 cocos2d 里面如何使用 Texture Packer 和像素格式来优化 spritesheet

    原文链接 http www cnblogs com andyque archive 2011 03 18 1988097 html 免责申明 必读 本博客提供的所有教程的翻译原稿均来自于互联网 仅供学习交流之用 切勿进行商业传播 同时 转载
  • java开发思路_Java Web开发教程——基本思路

    思路 将需求拆解为基本技术的简单组合 再分别实现 基本技能必须是足够简单且容易理解的 对基本技能的组合 必须是严格相等于需求域的 不能有缺漏 一 基本技能 基础知识 B S Browser Server 就是以浏览器作为用户界面与用户进行交
  • LeetCode 解题笔记(三)字符串

    文章目录 一 基础篇 344 反转字符串 2022 03 06 7 整数反转 2022 03 07 387 字符串中的第一个唯一字符 2022 03 08 242 有效的字母异位词 2022 03 09 总目录 LeetCode 解题笔记
  • Docker部署node.js应用

    前言 什么是docker 通俗的理解 docker是创建和管理容器的一种技术 那什么是容器呢 容器的功能与虚拟机很近似 都是在一个物理主机上运行多个操作系统的技术 最大的不同之处在于 虚拟机技术是虚拟出一套硬件后 在其上运行一个完整操作系统