docker部署node服务类项目

简介: docker部署node服务类项目

docker部署node服务类项目


本文在docker 用 nginx 部署静态项目基础上,继续利用 docker 环境,运行 node,部署服务器项目,从而更多理解docker

在网页里使用接口

上一个静态项目里,添加请求即可。接口会在服务端项目添加。

<body>
  试试
  <script src="https://unpkg.com/axios@0.27.2/dist/axios.min.js"></script>
  <script>
    axios
      .get('/api/json', {
        params: {},
      })
      .then((res) => {
        console.log(res);
      })
      .catch((error) => {
        console.log(error);
      });
  </script>
</body>

创建服务器项目

建一个项目文件夹demo_server,项目路径下运行npm init -y初始化下

然后yarn add express

创建server.js写接口

项目根目录下,创建server.js

const express = require('express');
const PORT = 8080;
const HOST = '0.0.0.0';
const app = express();
app.get('/json', (req, res) => {
  res.json({
    code: 0,
    data: 'This is message from node container',
  });
});
app.listen(PORT, HOST);
console.log(`Running on http://${HOST}:${PORT}`);

拉取node公共镜像

拉取node公共镜像

docker pull node

创建Dockerfile文件

一般自定义构建镜像,是基于Dockerfile文件构建。

项目根目录下,创建Dockerfile文件

FROM node:latest
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 8080
CMD [ "npm", "start" ]
  • FROM - 基于哪个镜像来实现
  • WORKDIR - 工作目录
  • COPY - 添加宿主机文件到容器里
  • RUN - 执行的命令
  • EXPOSE - 容器内应用可使用的端口
  • CMD - 容器启动后,所执行的程序,如果docker run后面跟启动命令会被覆盖掉

创建.dockerignore 文件

构建镜像的时候 node_modules 的依赖直接通过 RUN npm install 来安装。 项目中创建一个 .dockerignore 文件来忽略一些直接跳过的文件:

node_modules
npm-debug.log

自定义构建应用镜像

基于Dockerfile文件,自定义构建服务器镜像:

docker build -t server_image .
  • -t 是给镜像命名
  • . 是基于当前目录的 Dockerfile 来构建镜像

基于镜像启动容器

用下面命令,启动容器,之后访问

docker run -p 5000:8080 -d --name server_container server_image

基于镜像,启动容器,来提供接口服务8080端口,并映射宿主的5000端口。

跨域转发

目前静态项目的端口是3333,而服务的端口是5000,这样请求就会跨域,所以需要将静态项目容器的请求转发到服务的容器上。

查看服务容器对应的 ip

查看服务容器对应的 ip:

docker inspect server_container | grep IPAddress

可以看到是172.17.0.3,不同的可能不一样,记录这个值。

修改 nginx 配置

在静态项目的nginx/default.conf,增加一条规则

location / {
    root   /usr/share/nginx/html;
    index  index.html index.htm;
}
# 增加这个
location /api/ {
  rewrite  /api/(.*)  /$1  break;
  proxy_pass http://172.17.0.3:8080;
}

/api/{path} 转到目标服务的 /{path} 接口上,这里的172.17.0.3就是服务容器对应的 IP。

配置负载均衡

后端服务一般都是双机或者多机以确保服务的稳定性

我们可以再启动一个后端服务容器,并修改 nginx 的配置,来优化资源利用率,最大化吞吐量,减少延迟,确保容错配置。

先再启动一个服务容器,记录下其 IP

# 容器名和宿主的端口号 需要重命名
docker run -p 5001:8080 -d --name server_container2 server_image
# 得到容器的IP,我这里是172.17.0.4
docker inspect server_container2 | grep IPAddress

修改一下 静态项目的nginx/default.conf(新增 upstream ,修改 location /api/ 中的 proxy_pass

server {
    # ...
    location /api/ {
      rewrite  /api/(.*)  /$1  break;
      # !!!修改这里
      proxy_pass http://backend;
    }
    ; ...
  }
  # !!!upstream要与server同级
  upstream backend {
      server 172.17.0.3:8080;
      server 172.17.0.4:8080;
  }

重启下静态项目的容器docker restart web_container

测试下 — 挂掉其中一个服务容器

docker stop server_container

刷新网页http://localhost:3333/,依旧正常~

网络异常,图片无法展示
|

启动容器失败 - 怎么查看原因

启动容器之后,docker ps却没发现相应的容器,可以通过logs诊断

# 比如 docker logs web_container
docker logs [容器名 或者 容器id]

写负载均衡的时候,就碰到这种问题,原来我把upstream写在server内部了,logs就提示错误信息,然后根据错误提示google了下,因此找到原因~~

docker部署egg项目

成熟的项目,一般都会有框架,docker部署node服务项目,大同小异,这边示例下egg项目的部署

1. 项目新增Dockerfile文件

项目根目录下加Dockerfile文件:

# 设置基础镜像,如果本地没有该镜像,会从Docker.io服务器pull镜像
FROM node:latest
# 配置环境变量
ENV NODE_ENV production
# 这个是容器中的文件目录
RUN mkdir -p /usr/src/app
# 设置工作目录
WORKDIR /usr/src/app
# 拷贝package.json文件到工作目录
# !!重要:package.json需要单独添加。
# Docker在构建镜像的时候,是一层一层构建的,仅当这一层有变化时,重新构建对应的层。
# 如果package.json和源代码一起添加到镜像,则每次修改源码都需要重新安装npm模块,这样木有必要。
# 所以,正确的顺序是: 添加package.json;安装npm模块;添加源代码。
COPY package.json /usr/src/app/package.json
# 安装npm依赖(使用淘宝的镜像源)
# 如果使用的境外服务器,无需使用淘宝的镜像源,即改为`RUN npm i`。
RUN npm i --production --registry=https://registry.npm.taobao.org
# 拷贝所有源代码到工作目
COPY . /usr/src/app
# 暴露容器端口
EXPOSE 9000
CMD npm start

2. 建立镜像,启动容器即可

之后建立镜像,然后启动容器即可

docker build -t egg_image ./
docker run -itd --net=host --name egg_container -p 8000:8000 egg_image

这样就可以访问http://localhost:8000

再次理解docker容器

  • 镜像就像是一个安装包,每个docker容器类似新一个电脑下载了安装包然后启动
  • 每个容器既然都是新电脑,那么就拥有自己独立的空间、网络。

引用

目录
相关文章
kde
|
26天前
|
应用服务中间件 网络安全 nginx
手把手教你使用 Docker 部署 Nginx 教程
本文详解Nginx核心功能与Docker部署优势,涵盖镜像拉取、容器化部署(快速、挂载、Compose)、HTTPS配置及常见问题处理,助力高效搭建稳定Web服务。
kde
561 4
|
2月前
|
JavaScript 算法 前端开发
【Docker项目实战】使用Docker部署paopao-ce微社区
【Docker项目实战】使用Docker部署paopao-ce微社区
339 84
【Docker项目实战】使用Docker部署paopao-ce微社区
|
25天前
|
应用服务中间件 Linux nginx
在虚拟机Docker环境下部署Nginx的步骤。
以上就是在Docker环境下部署Nginx的步骤。需要注意,Docker和Nginix都有很多高级用法和细节需要掌握,以上只是一个基础入门级别的教程。如果你想要更深入地学习和使用它们,请参考官方文档或者其他专业书籍。
97 5
|
2月前
|
存储 Docker Python
docker 部署 sftp
本文介绍SFTP服务的部署与配置,包括users.conf用户配置规则、Docker容器运行命令及上传目录权限说明,重点解析atmoz/sftp镜像的chroot机制与子目录映射,确保用户登录后正确访问/upload目录,并提供Python脚本实现文件上传示例。
179 12
docker 部署 sftp
|
2月前
|
运维 Linux 数据库
基于 Docker 部署 n8n 指南,新手一看就会
本教程详解如何通过 Docker 快速部署开源自动化工具 n8n,适合新手快速上手。内容涵盖官方部署步骤、常见难点及第三方一键部署方案,助你高效搭建自动化工作流平台。
914 6
kde
|
1月前
|
存储 NoSQL Redis
手把手教你用 Docker 部署 Redis
Redis是高性能内存数据库,支持多种数据结构,适用于缓存、消息队列等场景。本文介绍如何通过Docker快速拉取轩辕镜像并部署Redis,涵盖快速启动、持久化存储及docker-compose配置,助力开发者高效搭建稳定服务。
kde
574 7
kde
|
1月前
|
存储 搜索推荐 数据库
🚀 RAGFlow Docker 部署全流程教程
RAGFlow是开源的下一代RAG系统,融合向量数据库与大模型,支持全文检索、插件化引擎切换,适用于企业知识库、智能客服等场景。支持Docker一键部署,提供轻量与完整版本,助力高效搭建私有化AI问答平台。
kde
1461 8
kde
|
1月前
|
存储 关系型数据库 MySQL
MySQL Docker 容器化部署全指南
MySQL是一款开源关系型数据库,广泛用于Web及企业应用。Docker容器化部署可解决环境不一致、依赖冲突问题,实现高效、隔离、轻量的MySQL服务运行,支持数据持久化与快速迁移,适用于开发、测试及生产环境。
kde
359 4
|
2月前
|
前端开发 JavaScript 应用服务中间件
在Docker部署的前端应用中使用动态环境变量
以上步骤展示了如何在 Docker 配置过程中处理并注入环墨遁形成可执行操作流程,并确保最终用户能够无缝地与之交互而无须关心背后复杂性。
167 13

热门文章

最新文章