优秀的编程知识分享平台

网站首页 > 技术文章 正文

前端开发-使用docker容器化一个nodejs应用

nanyue 2024-08-06 18:18:19 技术文章 5 ℃

先创建一个my-body-app文件夹

mkdir my-node-app
cd my-node-app

然后创建一个index.js 来启动一个node server

var express = require('express')
var app = express()
app.get('/',function(req,res){
 res.send('Hello World!')
})
app.listen(8081,function(){
 console.log('app listening on port 8081!')
})

然后创建一个package.json文件,可以通过npm init -y来快速生成

{
 "name": "helloworld", 
 "version": "1.0.0", 
 "description": "Dockerized node.js app", 
 "main": "index.js", 
 "author": "", 
 "license": "ISC", 
 "dependencies": { 
 "express": "^4.16.4" 
 }
 }

然后我们创建一个dockerfile,然后保存到my-node-app文件夹。这个文件没有扩展名,他的名字就叫做dockerfile,下面是里面的内容

# Dockerfile
FROM node:8
WORKDIR /app
COPY package.json /app
RUN npm install
COPY . /app
EXPOSE 8081
CMD node index.js

下面解释一下里面的命令

FROM node:8 -- 从 docker hub 拉取 node.js docker 镜像,可以在这里找到 node 的镜像:https://hub.docker.com/_/node/

WORKDIR /app -- 设置镜像中的工作目录,可以与下面的命令一起使用: COPY,RUN 和 CMD

COPY package.json /app -- 将 package.json 从宿主机的 my-node-app 目录复制到了镜像中的 /app 目录

RUN npm install -- 在镜像中运行此命令来安装 node 包

COPY . /app -- 复制 my-node-app 目录中的所有文件到镜像中的 /app 目录

EXPOSE 8081 -- 这条命令告诉 container 要暴露一个端口号,这个端口号正是我们在 index.js 中写的那个。默认情况下,容器会忽略对它所有的请求

构建docker镜像

打开控制台,到my-node-app目录下,执行下面命令

 # Build a image docker build -t <image-name> <relative-path-to-your-dockerfile>
 docker build -t hello-world .

这条命令在我们宿主机穿件了一个hello-word镜像

-t 用来为我们的镜像制定一个名字,这里就是hello-world . 是用来指明docker

file的路径,由于我们已经在my-node-app中,所以路径用.就可以了

可以在控制台看到类似于以下的输出

Sending build context to Docker daemon 4.096kB 
Step 1/7 : FROM node:8 
 ---> 4f01e5319662 
Step 2/7 : WORKDIR /app 
 ---> Using cache 
 ---> 5c173b2c7b76 
Step 3/7 : COPY package.json /app 
 ---> Using cache 
 ---> ceb27a57f18e 
Step 4/7 : RUN npm install 
 ---> Using cache 
 ---> c1baaf16812a 
Step 5/7 : COPY . /app 
 ---> 4a770927e8e8 
Step 6/7 : EXPOSE 8081 
 ---> Running in 2b3f11daff5e 
Removing intermediate container 2b3f11daff5e 
 ---> 81a7ce14340a 
Step 7/7 : CMD node index.js 
 ---> Running in 3791dd7f5149 
Removing intermediate container 3791dd7f5149 
 ---> c80301fa07b2 
Successfully built c80301fa07b2 
Successfully tagged hello-world:latest

可以看到,它根据dockerfile中的命令以此运行,然后输出一个docker镜像。当第一次运行的时候可能需要一些时间,下次就可以使用缓存来加速了,下面查看刚才的images镜像

docker images

这个命令会显示在你电脑上存在的docker镜像,其中会有一条

REPOSITORY TAG IMAGE ID CREATED SIZE 
hello-world latest c80301fa07b2 22 minutes ago 896MB

运行docker容器

docker container run -p 4000:8081 hello-world

这条命令用来创建和运行一个docker容器

-p 4000:8081 -- 是一个发布(publish)标识,它将本机的 4000 端口映射到了容器中的 8081 端口。现在所有对本机 4000 端口的访问,都会被容器中的 8081 端口监听

hello-world -- 这个名字就是刚才用 docker build 命令时指定的镜像名称

你将会得到以下输出

app listening on port 8081!

如果你需要进入容器并且挂载一个 bash 终端,可以运行:

docker exec -ti <container id> /bin/bash

为了检查我们的容器是否运行,打开另一个命令行,然后输入

docker ps

可以看到以下输出

CONTAINER ID IMAGE COMMAND CREATED 
 `<container id>` hello-world "/bin/sh -c 'node in…" 11 seconds ago
 STATUS PORTS NAMES 
 Up 11 seconds 0.0.0.0:4000->8081/tcp some-random-name

这里可以看我们从 hello-world 镜像创建的容器,以及它的 <container id> ,它正在运行,并且监听了 8081 端口号

现在我们这个简单的 Node.js 应用就已经完全容器化了。你可以在浏览器访问 http://localhost:4000 ,应该可以看到以下画面

Hello World!

Tags:

最近发表
标签列表