本文主要分享使用docker部署nodejs项目
使用docker部署项目主要分为三步

1.创建nodejs项目

编写package.json为项目安装依赖所用

{
  "name": "expressPro",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.16.3"
  }
}

服务启动文件server.js

var express = require('express');
var app = express();

app.use(express.static('dist'));//表示dist目录下的为静态资源

var server = app.listen(3333, function () {
  var host = server.address().address;
  var port = server.address().port;

  console.log('Example app listening at http://%s:%s', host, port);
});

至此我们完成了nodejs项目开启一个简单web服务的功能

2.编写Dockerfile以及dockerignore

Dockerfile

#引用镜像
FROM node:8.9.4-alpine
#作者
MAINTAINER mkq
#执行命令,创建文件夹
RUN mkdir -p /usr/src/workPlace_express/expressPro

#将dist目录拷贝到镜像里
COPY ./dist /usr/src/workPlace_express/expressPro/dist/
COPY package.json /usr/src/workPlace_express/expressPro
COPY server.js /usr/src/workPlace_express/expressPro

#指定工作目录
WORKDIR /usr/src/workPlace_express/expressPro


#安装依赖及构建node应用
RUN npm install
#配置环境变量
 ENV HOST 0.0.0.0
 ENV PORT 3333
#定义程序默认端口
EXPOSE 3333
#运行程序命令
CMD ["node","server.js"]

dockerignore

# Logs
logs
*.log
npm-debug.log*

# Runtime data
pids
*.pid
*.seed

# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov

# Coverage directory used by tools like istanbul
coverage

# nyc test coverage
.nyc_output

# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
.grunt

# node-waf configuration
.lock-wscript

# Compiled binary addons (http://nodejs.org/api/addons.html)
build/Release

# Dependency directories
node_modules
jspm_packages

# Optional npm cache directory
.npm

# Optional REPL history
.node_repl_history
.idea
.node_modules
node_modules
.vscode

至此打包镜像准备工作完毕

3.打包镜像

在Dockerfile同级路径下执行如下命令构建镜像

# docker build -t docker_demo1 .

注意后面的.不能省略
不出意外的话我们就构建docker镜像成功了。然后可以使用如下命令查看已构建的镜像

   docker images

在这里插入图片描述
镜像构建完成之后我们就可以通过镜像启动一个容器了,使用如下命令

docker run -d -p 9000:3333 docker_demo1

-d表示后台运行。-p表示指定端口映射,此例中是将宿主机器的9000端口映射到3333,3333端口也就是我们的Dockerfile对外暴露的接口。
然后我们可以使用如下命令查看已启动的容器

docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5512f616077d docker_demo “node server.js” 22 hours ago Up 22 hours 0.0.0.0:9000->3333/tcp reverent_driscoll
a76391d51230 docker_demo “node server.js” 22 hours ago Up 22 hours 0.0.0.0:3333->3333/tcp lucid_edison

至此已经用docker部署了一个node应用。我们便可以通过宿主主机的ip:9000访问到容器上3333端口上的服务了。

4.docker 常用命令

 1. docker images [options "o">] [name]

-a 列出所有镜像(含过程镜像);

-f 过滤镜像,如: -f ['dangling=true'] 只列出满足
dangling=true 条件的镜像;

--no-trunc 可显示完整的镜像ID;

-q 仅列出镜像ID。

--tree 以树状结构列出镜像的所有提交历史。
2. docker ps

列出所有运行中容器。

 

-a 列出所有容器(含沉睡镜像);

--before="nginx" 列出在某一容器之前创建的容器,接受容器名称和ID作为参数;

--since="nginx" 列出在某一容器之后创建的容器,接受容器名称和ID作为参数;

-f [exited=<int>] 列出满足
exited=<int> 条件的容器;

-l 仅列出最新创建的一个容器;

--no-trunc 显示完整的容器ID;

-n=4 列出最近创建的4个容器;

-q 仅列出容器ID;

-s 显示容器大小。



3. docker rmi
docker rmi [options "o">] <image>  "o">[image...]
docker rmi nginx:latest postgres:latest python:latest


从本地移除一个或多个指定的镜像。
-f 强行移除该镜像,即使其正被使用;

--no-prune 不移除该镜像的过程镜像,默认移除。

要删除全部image的话

docker rmi $(docker images -q)

4. docker rm
docker rm [options "o">] <container>  "o">[container...]
docker rm nginx-01 nginx-02 db-01 db-02
sudo docker rm -l /webapp/redis



-f 强行移除该容器,即使其正在运行;

-l 移除容器间的网络连接,而非容器本身;

-v 移除与容器关联的空间。



docker rm $(docker ps -aq) :删除所有容器
       docker stop [NAME]/[CONTAINER ID]:将容器退出。

docker kill [NAME]/[CONTAINER ID]:强制停止一个容器。
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐