简介: 本文将从零至一,介绍如何在云服务器上通过 Docker 容器运行一个简单的Node应用。

前言

本文将从零至一,介绍如何在云服务器上通过 Docker 容器运行一个简单的Node应用。本文假设读者已经掌握基本的Linux,Docker,Node,Express 知识。

基本步骤

  1. 本地写好nodejs应用,放到github。
  2. 云服务器安装docker,配置国内镜像加速。
  3. 拉取一个node镜像。
  4. 从github拉取项目代码。
  5. 编写Dockerfile文件,构建镜像。
  6. 根据镜像运行一个容器。
  7. 本地进行访问。

具体步骤

1.编写Node应用

新建项目目录hello,进入目录,初始化项目:

npm  init

安装express模块

npm install express --save

项目根目录下新建 app.js ,当访问时返回Hello,Docker!,监听3000端口。

// app.js
const express = require('express');
const app = express();
app.get('/', function (req, res) {
res.send('Hello,Docker!');
});
app.listen(3000);
console.log('Server is running on http://localhost:3000');

2.安装Docker

远程连接服务器,安装Docker:

yum install -y docker

安装成功以后,编辑/etc/docker/daemon.json 文件,配置国内镜像加速。
这里用到的是阿里云提供的加速服务,需要登录https://dev.aliyun.com/来获取个人专属的加速地址。这里假设加速地址是https://4da6b0g8.mirror.aliyuncs.com

vim /etc/docker/daemon.json

编写以下内容:

{
“registry-mirrors”: [“https://4da6b0g8.mirror.aliyuncs.com“]
}

修改完配置文件应该重启服务。

3.拉取Node镜像

拉取Node镜像

docker pull node:9.2.0

等待镜像拉取成功,可以查看下我们已经有的镜像:

docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/node 9.2.0 c1d02ac1d9b4 3 weeks ago 675.6 MB
node 9.2.0 c1d02ac1d9b4 3 weeks ago 675.6 MB

4.部署项目代码

进入/home目录,从github上拉取项目代码:

cd /home
git clone https://github.com/hsyq/hello

这里的github地址要换成自己仓库的地址。

5.编写Dockerfile文件

Dockerfile文件里是一条条能被Linux执行的命令,docker能根据该文件构建镜像。
该文件必须和项目文件放在一起,一般放在项目根目录下,本例中即/home/hello目录下。

cd hello
vim Dockerfile
# 基础镜像为node,版本为v9.2.0
FROM node:9.2.0 # 创建容器内的项目存放目录
RUN mkdir -p /home/nodeapp
WORKDIR /home/nodeapp # 将Dockerfile当前目录下所有文件拷贝至容器内项目目录并安装项目依赖
COPY . /home/Service
RUN npm install # 容器对外暴露的端口号,要和node项目配置的端口号一致
EXPOSE 3000 # 容器启动时执行的命令
CMD [ "node", "app.js" ]

6.构建镜像

在项目根目录下执行命令构建对象:

docker build -t hello .

屏幕会按照Dockerfile内的指令一条条执行并显示在屏幕上。
构建完成,查看已有的镜像。

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello latest b753dcb8208d 4 hours ago 675.6 MB
docker.io/node 9.2.0 c1d02ac1d9b4 3 weeks ago 675.6 MB
node 9.2.0 c1d02ac1d9b4 3 weeks ago 675.6 MB

7.运行容器

通过镜像hello创建一个容器并运行:

docker run -d --name hellocontainer -p 80:3000 hello

-d表示容器会在后台运行;--name 是我们给容器起的名字,这个名字是唯一的;-p表示端口映射,即将容器内的3000端口映射到宿主机器的80端口上,这样外部就可以通过80端口来访问容器内部运行的应用了。

本文的演示没有使用 Nginx 做端口转发,只要服务器开放 80 端口,就能将 80 映射到 node项目容器的3000端口上,对完提供访问服务。

执行命令查看容器的状态:

docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                        PORTS                  NAMES
748be4cfccd9 hello "node app.js" 25 seconds ago Up 25 seconds 0.0.0.0:80->3000/tcp hellocontainer

此时,node应用已经在容器内跑起来了。我们可以访问了。

8.本地访问

打开本地的浏览器,输入云服务器的公网IP即可访问:

原文链接:https://click.aliyun.com/m/1000354798/

本文为阿里云原创内容,未经允许不得转载。

Docker部署Node应用简单实践的更多相关文章

  1. 使用 Docker 部署 Node 应用 - 镜像文件尺寸的优化

    前面 使用 Docker 部署 Node 应用 一文中完成了镜像的创建和运行,不过生成的镜像还有些粗糙,需要进一步优化. 镜像的优化 通过 docker images 看到简单的一个 node 服务端 ...

  2. 使用 Docker 部署 Node 应用

    容器将应用与环境打包整合,解决了应用外部依赖的痛点,打包后通过窗口可方便地部署到任意环境,用过就知道很香. 创建示例应用 以 NestJS 为例,先创建一个示例应用. $ npm i -g @nest ...

  3. docker部署node.js

    1.dockerfile FROM node:14.16.0 RUN mkdir -p /var/log/lily/ RUN mkdir -p /opt/node # 工作目录 WORKDIR /op ...

  4. Docker部署Sql Server 2019实践

    1. 拉取SqlServer2019镜像 sudo docker pull mcr.microsoft.com/mssql/server:2019-latest 2. 创建容器+挂载: sudo do ...

  5. docker 部署mysql redis

    先介绍利用的两个数据卷挂载的规则,这对于理解挂载mysql数据库存储非常有帮助. 如果挂载一个空的数据卷到容器中的一个非空目录中,那么这个目录下的文件会被复制到数据卷中. 如果挂载一个非空的数据卷到容 ...

  6. docker部署nodejs项目应用

    之前笔者弄了一套nestjs项目放在自己服务器上,并用pm2管理进程. 现在要把pm2停止,尝试一下用docker容器,那么首先要安装docker 一.安装docker 由于笔者服务器的系统是cent ...

  7. Docker部署kafka|Go操作实践

    前言 写作本文的背景是由于字节的暑期青训营中,某个项目要求编写一个简易的流处理引擎(flink),开发语言不限,推荐Java,本着好奇心的驱使,我打算使用Go语言进行部分尝试. 既然是流处理引擎,那么 ...

  8. 一种简单的生产环境部署Node.js程序方法

    最近在部署Node.js程序时,写了段简单的脚本,发觉还挺简单的,忍不住想与大家分享. 配置文件 首先,本地测试环境和生产环境的数据库连接这些配置信息是不一样的,需要将其分开为两个文件存储 到conf ...

  9. ubuntu16.04环境下在docker上部署javaweb项目简单案例

    因为一些原因,接触到了docker,经过一番研究,总算是有了一些自己的看法,有什么不对的地方,希望多多指教. 废话不多说,首先我这里使用的虚拟机安装的是ubuntu16.04版本,其他版本应该也可以. ...

  10. Docker部署Mysql实践

    前言:由于Docker部署容器时,没有指定IP,当机器重启后,容器的IP会变化,所以在创建容器的时候,最好能固定IP:同时,在Ubuntu系统中,每次执行命令,都需要root权限,命令需要加sudo标 ...

随机推荐

  1. MySql注入—DNS注入

    MySql注入-DNS注入 1.DNS注入原理 一.DNS注入原理 DNS注入,是通过查询相应DNS解析产生的记录日志来获取想要的数据 对于sql盲注这样的方法常常用到二分法,非常麻烦而且没有回显,要 ...

  2. 【转】客户端软件GUI开发技术漫谈:原生与跨平台解决方案分析

    原生开发应用开发 Microsoft阵营的 Winform WinForm是·Net开发平台中对Windows Form的一种称谓. 如果你想深入的美化UI,需要耗费很大的力气,对于目前主流的CSS样 ...

  3. 前后端分离Ajax入门

    前后端分离之Ajax入门 一.概念 Ajax(Asynchronous Javascript And XML),即是异步的JavaScript和XML,Ajax其实就是浏览器与服务器之间的一种异步通信 ...

  4. 为什么ASP.NET Core的路由处理器可以使用一个任意类型的Delegate

    毫不夸张地说,路由是ASP.NET Core最为核心的部分.路由的本质就是注册一系列终结点(Endpoint),每个终结点可以视为"路由模式"和"请求处理器"的 ...

  5. linux安装/切换不同版本c/c++

    查看ubuntu系统上g++的版本: ls /usr/bin/g++* 安装指定版本gcc和g++ # 以version == 4.9为例 sudo apt-get install gcc-4.9 g ...

  6. 《梦断代码》(《Dreaming in Code》)读书笔记

    <梦断代码>(<Dreaming in Code>)读书笔记 在看了这本书之后,我在豆瓣看到一段书评:做软件难.软件乃是人类自以为最有把握,实则最难掌控的技术.这本书揭示了好多 ...

  7. redis的延迟双删策略

    1,redis数据为什么会存在和数据库数据不一致的问题 在多线程并发情况下,假设有两个数据库修改请求,为保证数据库与redis的数据一致性,修改请求的实现中需要修改数据库后,级联修改redis中的数据 ...

  8. #树状数组,离散#洛谷 3586 [POI2015]LOG

    题目 分析 考虑\(\geq s\)的部分最多取到\(s\), 设\(<s\)的总和为\(p\),个数为\(t\), 那么\(p+(n-t)*s\geq c*s\)就一定能取到 代码 #incl ...

  9. 30分钟成为Contributor|如何多方位参与OpenHarmony开源贡献?

    如何优雅地参与开源贡献,向顶级开源项目提交 PR(Pull Request).战"码"先锋直播间第八期围绕"OpenAtom OpenHarmony(以下简称" ...

  10. 携手HMS Core统一扫码服务, 兴业证券优理宝App提升用户扫码体验

    兴业证券优理宝App联合华为HMS Core,集成HMS Core统一扫码服务,在提升扫码成功率的同时,还支持C端用户用手机端APP扫描手表端二维码,实现行情在手机与手表间跨终端流转,行情信息,抬腕可 ...