docker基础操作与进阶 - 搭建基于pm2的node环境

news2024/9/20 22:33:22

1、为什么要使用docker

最近遇到一台机器需要部署两个不同版本node的情况,首先就想起了docker,想必还有其他类似环境问题的情况,需要进行项目隔离,而docker正是用来解决这个问题的。

docker的优势就在于环境隔离,相当于可以在一台机器上切割成若干个子机器,而各个子机器之前互不影响,另外docker搭建的项目迁移很方便,不用重复搭建复杂的环境。

2、什么是docker

Docker 是一个开源的应用容器引擎,基于Go语言并遵从 Apache2.0 协议开源。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

通俗点说,linux机器可以比作一键比较大的船,而docker可以制造若干个集装箱,而这些集装箱都是封闭的,每个集装箱里面都可以装不同的东西。延伸到项目中就是,docker可以制作若干个镜像,而每个镜像中都可以有不同的node、redis、mysql版本等。这样我们就不需要有若干个服务器来兼容这些情况。

3、docker基础知识

镜像:可以把镜像理解成iso文件,众所周知虚拟机可以把iso文件制作成windows系统,镜像就是生成容器的前提,可以根据DockeFile制作而成

容器:容器就类似于集装箱,docker基于镜像可以生成容器,一般容器就是我们服务的环境了,一般node的容器会集成node版本+pm2

4、搭建docker镜像

搭建docker环境需要依赖Dockerfile文件生成镜像,Dockerfile文件会注入node、pm2等环境配置。

步骤:

编写Dockerfile文件 → 创建镜像 → 推送远程镜像仓库

Dockerfile常用命令:

指令说明
FROM指明当前的镜像基于哪个镜像构建
LABEL标记镜像信息,添加元数据
ARG定义构建镜像过程中使用的变量
ENV指定环境变量
VOLUME创建一个数据卷挂载点
USER指定运行容器时的用户名或 UID
WORKDIR配置工作目录
EXPOSE容器运行时的端口,默认是TCP
ADD从本地或URL添加文件或压缩包到镜像中,并自动解压
COPY拷贝文件或目录到镜像中
ONBUILD创建子镜像时指定自动执行的操作指令
STOPSIGNAL指定退出的信号值
HEALTHCHECK配置启动容器如何进行健康检查
SHELL指定默认 shell 类型
RUN构建镜像时运行的指定命令
CMD运行容器时默认执行的命令,如果有多个CMD质量,最后一个生效。
ENTRYPOINT指定镜像的默认入口命

 

 Dockerfile文件内容

# 基础node镜像,以14.15.0的node镜像为基础搭建其他内容
# 基础镜像可以是本地镜像也可以是远程仓库镜像,例:a.com/common/node:14.15.0
FROM node:14.15.0
LABEL author="zuggs"
LABEL email="zuggs@qq.com"

# RUN命令可以执行命令,安装pm2及pm2-lograte
RUN npm install pm2 -g

RUN pm2 install pm2-logrotate \
  && pm2 set pm2-logrotate:max_size 10G \
  && pm2 set pm2-logrotate:dateFormat YYYY-MM-DD_HH \
  && pm2 set pm2-logrotate:workerInterval 60 \
  && pm2 set pm2-logrotate:rotateInterval "0 * * * *"

# 运行容器时默认执行命令,建议从外面配置,因为每个项目的pm2脚本可能不一样
# WORKDIR /usr/local/etc/nginx/www/project
# CMD pm2-runtime pm2.json

基于Dockerfile打包镜像

# Dockerfile是上面的配置文件,node_pm2是镜像名称,14.15.0是镜像版本,.代表在当前目录打包
docker build -f Dockerfile -t node_pm2:14.15.0 .

执行情况: 

镜像打包完成就可以直接推送到远程仓库了,这样在其他机器就可以直接拉到镜像了

dockerhub: https://hub.docker.com/

推送指令(前提需要登录,docker login ...):

# 在项目中标记镜像,node_pm2是本地镜像名称,docker..node_pm2是远程tag名称,14.15.0是版本号
docker tag node_pm2:14.15.0 docker.zuggs.com/common/node_pm2:14.15.0
# 推送远程
docker push docker.zuggs.com/common/node_pm2:14.15.0

 5、启动docker镜像

前面已经手动打包好所需的node镜像了,我们只需要在服务器拉取所需要的镜像就好

拉取镜像(不拉取也行,可以在执行时直接选远程镜像,这样在会先拉取镜像):

docker pull docker.zuggs.com/common/node_pm2:14.15.0

基于本地or远程镜像启动容器

docker run -d --name demo_server \
  --log-opt max-size=10m --net=host \
  -v /usr/local/etc/nginx/www/project:/usr/local/etc/nginx/www/project \
  docker.zuggs.com/common/node_pm2:14.15.0 sh -c \
  'cd /usr/local/etc/nginx/www/project && pm2-runtime start pm2.json'

docker run 常用参数介绍,全部可参考docker官网run配置

-d 后台运行容器
--name 容器名称
--log-opt 设置日志文件大小和数量配置,可选max-size和max-file
--net 容器网络选项
  host:容器使用宿主机的IP和端口,--net=host
  container:容器和一个指定的容器共享IP、端口,--net=container:NAME_or_ID
  none:该模式关闭了容器的网络功能,--net=node
  bridge:默认值,此模式会为每一个容器分配、设置IP等,--net=bridge
-v 目录映射,这个容器就可以访问到该目录,宿主机路径:容器挂载路径
-p 端口映射,选择host模式就不需要做端口映射了,本地端口:容器端口
sh -c 容器启动后执行的脚本,Dockerfile未写CMD配置的可以在这里配置

 6、docker常用指令

# 搜索镜像
docker search IMAGE_NAME

# 拉取镜像
docker pull IMAGE_NAME

# 构建镜像
docker build -t tag_name:tag_version .

# 标记镜像
docker tag tag_name:tag_version remote_image:remote_version

# 推送镜像到远程
docker push remote_image:remote_version

# 查看所有本地镜像
docker images

# 删除镜像
docker rmi IMAGE_ID

# 查看所有容器,-a是所有容器,默认只查看运行中容器
docker ps -a

# 运行容器
docker run [options]

# 停止容器
docker stop CONTAINER_NAME | CONTAINER_ID

# 启动容器
docker start CONTAINER_NAME | CONTAINER_ID

# 重启容器
docker restart CONTAINER_NAME | CONTAINER_ID

# 在容器中运行后台任务
docker exec CONATAINER_NAME | CONTAINER_ID [COMMAND]

# 查看容器详细信息
docker inspect CONTAINER_ID | CONTAINER_NAME

# 删除容器
docker rm CONTAINER_ID

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/594774.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第九篇、基于Arduino uno,用LCD1602(带IIC的)显示屏显示字符——结果导向

0、结果 说明:可以在LCD1602屏幕上面显示字符,实时的变量,也可以设置是否背光,如果是你想要的,可以接着往下看。 1、外观 说明:注意是带IIC通讯的LCD屏幕,外形如下。 2、连线 说明&#xff…

Hexo写文章不方便?用上GitHub Actions真的是泰裤辣

对于做个人博客的小伙伴来说 HEXO 大家肯定都是非常熟悉的吧,这是一个静态的个人博客程序,通过 HEXO + GitHub Pages 搭建免费个人博客也是很多博主的选择。但相信肯定也会有些困恼,比如博客的渲染维护太麻烦了,我要在一台新设备上写博客并推送到 GitHub Pages 还要先安装 …

【Redis】聊一下哨兵集群

上一篇中,介绍了哨兵机制可以减少主库实例下线的误判率,但是如果只有一个哨兵实例,出现宕机后没有办法保证服务的高可用,所以一般实际的生产环境都是搭建3个哨兵实例构建的集群进行运行。但是具体的运行机制是什么。其实主要就是三…

使用langchain及llama_index实现基于文档(长文本)的相似查询与询问

文章目录 1. 引言2. 简介3. 带关键字的查询方案4. 不带关键字的总结询问5. 实现代码 1. 引言 在调用ChatGPT接口时,我们常常受到4096个字符(token)的限制。这种限制对于处理长文本或者需要对文档进行相似查询和询问的场景来说是一个挑战。然…

如何复制投票链接投票怎样链接到公众号投票链接如何生成

关于微信投票,我们现在用的最多的就是小程序投票,今天的网络投票,在这里会教大家如何用“活动星投票”小程序来进行投票。 我们现在要以“妙趣拾光”为主题进行一次投票活动,我们可以在在微信小程序搜索,“活动星投票”…

【Python开发】FastAPI 03:请求参数—请求体

除了路径参数和查询参数,还有请求体,其用于传递 JSON、XML 或其他格式的数据,以便服务器能够读取并做出相应的处理,可以说请求体的作用更为强大。试想一下,如果存在七八个参数,路径参数和查询是不是就招架不…

Camera | 10.linux驱动 led架构-基于rk3568

前面文章我们简单给大家介绍了如何移植闪光灯芯片sgm3141,该驱动依赖了led子系统和v4l2子系统。 V4L2可以参考前面camera系列文章,本文主要讲述led子系统。 一、LED子系统框架 Linux内核的 led 子系统主要功能: 为每个设备在/sys/class/le…

《Linux内核源码分析》(2)进程原理及系统调用

《Linux内核源码分析》(2)进程原理及系统调用 一、进程 操作系统的作用:作为硬件的使用层,提供使用硬件资源的能力, 进程的作用:作为操作系统使用层,提供使用操作系统抽象出的资源层的能力 进程、线程和程序的区别&…

【计算机视觉】Segment Anything 安装配置及代码测试(含源代码)

文章目录 一、前言二、安装2.1 基本要求2.2 Install Segment Anything 三、代码使用示例3.1 Automatically generating object masks with SAM3.2 Environment Set-up3.3 显示标注3.4 图像示例3.5 Automatic mask generation3.6 Automatic mask generation options 一、前言 目…

客户体验:响应速度是他们的 No.1 Pick么?

服务响应速度在为消费者提供服务时极为重要,那么,在消费者整体体验中,响应速度是否是消费者最在意的呢? 无论是对企业还是消费者来说,时间都至关重要。消费者在寻求客户服务时,不喜欢等待。根据《客户服务受…

【Python asyncio】零基础也能轻松掌握的学习路线与参考资料

Python asyncio是一个强大而易于使用的库,让Python程序员能够编写高效的异步IO应用程序。它为程序员提供了一种简单而优雅的方法来避免使用 Python GIL(全局解释器锁),同时允许他们轻松地处理高并发的网络通信和并发任务执行。下面…

蓝桥杯数论总结:快速幂和矩阵快速幂

本文先是给出快速幂的原理,又由一道例题明确快速幂的Python代码模版;而后给出矩阵快速幂的原理(介绍了矩阵相乘,对没学过线代者友好),和矩阵快速幂的模版。再给出快速幂和矩阵快速幂相关的题单。 目录 快…

Linux高级---k8s存储

文章目录 一、数据卷的概述二、关系图三、数据卷的类型1、emptydira、描述b、适用场景c、emptydir应用 2、hostpatha、描述b、适用场景c、hostpath应用 3、nfsa、描述b、适用场景c、nfs应用 4、PV和PVCa、描述b、存储卷和存储卷声明的关系c、存储卷声明的管理过程 5、PVa、资源…

10个可以快速用Python进行数据分析的小技巧

一些小提示和小技巧可能是非常有用的,特别是在编程领域。有时候使用一点点黑客技术,既可以节省时间,还可能挽救“生命”。 一个小小的快捷方式或附加组件有时真是天赐之物,并且可以成为真正的生产力助推器。所以,这里…

基于Spring Boot+Vue的课堂管理系统

介绍 基于Spring BootVue的课堂管理系统。前后端分离。包含教师授课管理、学生选退课、聊天室、签到、笔记管理模块等。 技术架构 spring BootMyBatisRedisWebSocketVueCLIAxiosElement UI 项目特点: - 后台使用MyBatis连接数据库,编写后台服务器的…

【教程】2步白嫖使用DeepL Pro会员版 [附插件]

转载请注明出处:小锋学长生活大爆炸[xfxuezhang.cn] 【教程】5步白嫖使用Grammarly Premium高级版 [附脚本] 适用说明 Edge、Chrome等,使用了Chrome内核的浏览器应该都可以吧。 开始白嫖 1、下载并解压插件,下载链接:https://x…

第2章:数据结构【AcWing】

文章目录 单链表定义初始化头插在下标为pos位置后插入删除下标为pos后的结点遍历 双链表定义初始化在下标为pos后插入删除下标为pos的位置 栈和队列栈定义示例代码 队列定义示例代码循环队列定义示例代码 单调栈和单调队列单调栈朴素方法 O ( n 2 ) O(n^2) O(n2)优化 O ( n ) …

Web的基本漏洞--逻辑漏洞

目录 一、逻辑漏洞介绍 1.逻辑漏洞的原理 2.逻辑漏洞的分类 3.常见的逻辑漏洞 4.挖掘逻辑漏洞 一、逻辑漏洞介绍 1.逻辑漏洞的原理 逻辑漏洞是指由于程序逻辑不严或逻辑太复杂,导致一些逻辑分支不能够正常处理或处理错误,从而进行攻击。一般出现任…

英国皇家植物园采用机器学习预测植物抗疟性,将准确率从 0.46 提升至 0.67

内容一览:疟疾是严重危害人类生命健康的重大传染病,研究人员一直在致力于寻找新的植物源性抗疟疾化合物,以研发相关药物。近期英国皇家植物园利用机器学习 算法 有效预测了植物抗疟性,该研究成果目前已发表在《Frontiers in Plant…

路径规划算法:基于风驱动优化的路径规划算法- 附代码

路径规划算法:基于风驱动优化的路径规划算法- 附代码 文章目录 路径规划算法:基于风驱动优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要:本文主要介绍利用智能优化算法…