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应用 的相关文章

  • 混合命名和未命名函数参数

    我有这个功能来验证 JWT 令牌 不是中间件 它说 package main import net http log fmt github com dgrijalva jwt go func ValidateToken w http Res
  • Spring MVC Web 应用程序 - 从属性启用/禁用控制器

    我有一个在 Tomcat 中运行的 Web 应用程序 并使用 Spring MVC 来定义控制器和映射 我有以下课程 Controller api test public class TestController RequestMappin
  • 使用 ruby​​ on Rails 向静态网站添加功能

    我是 ruby on Rails 的新手 我有一个包含很多静态页面的网站 我想向网站添加一些动态页面 我将在 ruby on Rails 中开发这些页面 当用户单击静态页面之一上的按钮之一时 将触发这些页面提供的功能 我想我将把动态页面放在
  • REST API 与 Web API

    我是构建 HTTP API 的初学者 我似乎对 REST API 和 Web API 之间的区别感到困惑 我在网上读到更多相关内容 困惑似乎越来越多 我猜菲尔丁有与此链接相同的问题http roy gbiv com untangled 20
  • Firebase 9(模块化 sdk web )替换 fieldPath

    我将以下代码与 Firebase SDK 8 一起使用 const db firebase firestore const collectionRef db collection collectionName var query colle
  • 你能用c++加载一个网页,包括JS和动态html并获取渲染的DOM字符串吗?

    是否可以用 C 加载网页并获取渲染的 DOM 不仅仅是 HTTP 响应 还有 java 脚本运行后 可能是让它运行一段时间后 呈现的 DOM 特别是随着时间的推移可能发生变化的动态 HTML 有这个库吗 或者 如果不是 c 您是否知道可以用
  • Ant Design Collapse - 关闭按钮

    我是 Ant Design 的初学者 在使用 Ant Design 库中的 Collapse 和 Form 时遇到了这个问题 我已经设置了我的页面 其中添加新项目的表单位于折叠中 并且折叠下方有一个项目列表
  • Tomcat 是否立即支持 JAX-RS(它是否支持 JAX-RS)?

    从教材 RESTful Java with JAX RS 中我们可以读到 如果我们的应用程序服务器是 JAX RS 感知的 或者换句话说 与 JAX RS 紧密集成 则声明我们的ShoppingApplication作为 servlet 的
  • 执行预检请求时是否需要 Access-Control-Allow-Origin CORS 标头?

    我们在我们的网站上看到了著名的 CORS 错误 XMLHttpRequest 无法加载https my site com api https my site com api 请求的资源上不存在 Access Control Allow Or
  • IIS 6 网站根目录与应用程序?解决Url()?

    IIS 6 ASP NET 3 5 C NET 我们遇到一个问题 即同一组文件的行为会有所不同 具体取决于它是根 IIS 网站还是 IIS 网站下的应用程序 使用生成的网址解析网址 http msdn microsoft com en us
  • 函数默认参数有些问题?

    看到这个 let foo outer function bar func x gt foo let foo inner console log func bar outer 我想知道为什么输出是 外部 而不是 内部 我知道 JavaScri
  • WebUSB 和 RFID 读取器

    我想知道是否有人有让 RFID 读取器通过 WebUSB 工作的经验 我使用的阅读器是https www parallax com product 28340 https www parallax com product 28340 根据我
  • Jekyll 在子网站上生成静态网站?

    是否可以将 Jekyll 放在 GitHub 上托管的网站的单个部分上 即是否可以让 example github io 成为常规站点 而 example github io blog 由 Jekyll 静态生成 我相信可以通过创建另一个名
  • HTML if 语句在 CDN 失败时加载本地 JS/CSS

    当从 CDN 或任何外部服务器加载 CSS JS 文件时 有可能 即使概率很低 由于外部故障而丢失该文件 在这种情况下 html 页面将因缺乏适当的 CSS 和 JS 而被损坏 有没有一种实用的方法可以在 CDN 故障时加载本地版本 IF
  • asp.NET 2.0网站无法访问App_Code中的类

    将我的网站部署到服务器后 我在访问课程时遇到问题 请注意 这是一个网络Site不是网络应用 错误是 编译器错误消息 CS0246 找不到类型或命名空间名称 Order 是否缺少 using 指令或程序集引用 版本信息 Microsoft N
  • Phonegap - cordova 在 Android 和 iOS 设备上延迟且缓慢

    我刚刚开始使用 zend studio 开始我的第一个 PhoneGap 项目 但是 在我构建并部署它之后 该应用程序非常慢 Android 和 iOS 均可 滚动滞后 如果我按下按钮 转到下一页的速度很慢 有什么办法可以提高它的性能吗 提
  • 烧瓶 - 404 未找到

    我是烧瓶开发的新手 这是我在烧瓶中的第一个程序 但它向我显示了这个错误 在服务器上找不到请求的 URL 如果您输入了网址 请手动检查拼写并重试 这是我的代码 from flask import Flask app Flask name ap
  • 使用 php ping 网站

    我想创建一个 php 脚本 它将 ping 一个域并列出响应时间以及请求的总大小 这将用于监控网站网络 我尝试过curl 这是我到目前为止的代码 function curlTest2 url clearstatcache return if
  • 诸如用于测试 HTTP 请求的虚拟 REST 服务器之类的东西? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我一直在四处寻找 但找不到任何这样的网站 我想知道是否有一些虚拟服务器可以响应测试 GET 请求并返回
  • 部署 .war 时出现 Glassfish 服务器错误:部署期间发生错误:准备应用程序时出现异常:资源无效

    我正在使用以下内容 NetBeans IDE 7 3 内部版本 201306052037 爪哇 1 7 0 17 Java HotSpot TM 64 位服务器虚拟机 23 7 b01 NetBeans 集成 GlassFish Serve

随机推荐

  • 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是创建和管理容器的一种技术 那什么是容器呢 容器的功能与虚拟机很近似 都是在一个物理主机上运行多个操作系统的技术 最大的不同之处在于 虚拟机技术是虚拟出一套硬件后 在其上运行一个完整操作系统