先创建一个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!