一文搞定:用Docker部署并运行Node项目

14,634 阅读5分钟

什么是Docker

Docker是一个虚拟环境容器,可以将你的开发环境、代码、配置文件等一并打包到这个容器中,并发布和应用到任意平台中。

比如,你在本地用Node开发网站后台,开发测试完成后,就可以将Node代码及其依赖包、Node环境,数据库环境等打包到一个容器中,然后部署到任意你想部署到的机器上。而这个机器不需要事先安装node,数据库环境,这个容器是运行在Dokcer引擎中的,容器内部就是一个代码运行的环境。

Docker的三个概念

  1. 镜像(Image):类似于虚拟机中的镜像,是一个包含有文件系统的面向Docker引擎的只读模板。任何应用程序运行都需要环境,而镜像就是用来提供这种运行环境的。例如一个Ubuntu镜像就是一个包含Ubuntu操作系统环境的模板,同理在该镜像上装上Node软件,就可以称为Node镜像。
  2. 容器(Container):类似于一个轻量级的沙盒。容器是镜像创建的应用实例,可以将其看作一个极简的Linux系统环境,为代码运行提供运行环境。各个容器之间是是相互隔离的,互不影响。

注意:镜像本身是只读的,容器从镜像启动时,Docker在镜像的上层创建一个可写层,镜像本身不变。一个镜像可以有多个容器。镜像和容器的关系相当于class类和实例化对象

  1. 仓库(Repository):类似于代码仓库,这里是镜像仓库,是Docker用来集中存放镜像文件的地方。

下载一个Node镜像

  1. 安装docker

可以直接下载docker desktop,然后无脑安装

  1. 搜索并拉取node镜像

在这个网站可以搜索你想要的任何镜像--即任何运行环境 hub.docker.com/

在右上角搜索node

选择你要下载的node镜像,进去看看有哪些版本,选择一个你喜欢的

在控制台输入命令拉取镜像,我这里选择的是16版本。如果不标识版本,默认就是最新版least

docker pull node:16

实例化并运行node容器

打开desktop,可以看到已经有了node镜像,并且是16版本的

可以在命令行输入docker images查看本机有多少镜像

  1. 实例化并运行node容器。

下面这个命令效果是后台运行一个node容器,并且容器命名为myNode

docker run -dit --name myNode node:16

现在docker desktop中可以看到有个叫myNode的容器在运行

也可以通过命令行查看本机正在运行的容器docker ps

  1. 进入node容器的shell命令行
docker exec -it myNode /bin/bash

上面的命令效果是进入容器内部的环境,输入node,就可以进入node shell命令行

可以看出容器内部就是一个有着node环境的linux微型系统

方法二,在docker desktop中,选中运行的容器,也可以直接进入容器内部

让我们的js代码在docker中运行起来

  1. 准备一个node代码,代码很简单,任何访问这个server的请求,server都会返回hello nodejs in docker字符串

执行这段代码,运行正常

  1. 准备一个Dockerfile(首字母大写)

逻辑很简单

FROM:表示新建的iamge(镜像)需要在node环境中进行,那么就需要node镜像。

WORKDIR:声明了工作目录`/app`,即node代码在该目录下进行

COPY:作用是,将当前目录的所有代码都复制到工作目录下

CMD:后面跟着一句shell 命令,该命令在容器运行的时候会得到执行,即当容器运行的时候,就会启动一个监听端口为3000的服务器

3. 构建新镜像,依据Dockerfile

docker build -t my-docker-demo:1.0 .

  1. 实例化该镜像,并运行
docker run -d -p 3000:3000 --name myContainerDemo my-docker-demo:1.0

-p: 映射端口,因为运行的容器相当于一个微型的虚拟机,访问里面的应用服务需要提供端口号,这里将本机的3000端口映射容器的3000端口

  1. 访问运行的服务器

查看容器内部服务输出的日志

成功

如果将运行的命令改成 -p 3030:3000, 将本机的3030端口映射到容器内部的3000, 那么访问服务的时候就需要将端口号改成3030

容器不能重名,重新实例化一个新容器,要记得改名字

总结

以上就是docker运行node项目的基本用法。

下面是docker 的一些基本命令,供参考

与镜像相关

镜像的查询:docker search images-name,

拉取:docker pull iamges-name:version

查询本机镜像:docker images

删除:docker rmi images-name:version、docker rmi images-id

构建:docker build -t images-name:version -f dockerfile

与容器相关

查询本机正在的容器:docker ps

容器删除:docker rm container-name

容器的运行:docker run -d -p 8080:8080 --name container-name iamges-name

控制台进入:docker exec -it container-name

log的查询:docker logs -tf --tail 10 container-name

启动: docker start container-name

停止:docker stop container-name

重启:docker restart container-name

强制退出:docker kill container-name

Dockerfile语法

FROM:从仓库拉去镜像,js代码将建立在这个镜像所构建的环境之内

LABEL:dockerfile的标签,备注

ENV:设置变量

RUN:运行shell命令,一个RUN命令就是一层,建议减少分开的run命令

WORKDIR:设置代码运行的工作目录,并且shell命令将会在该目录下进行

COPY:复制目录,多用于将代码复制进工作目录内

EXPOSE:定义环境变量

ARG:构建时期传进去的变量

# ARG user

docker build --build-arg user=root -f dockerFile -t containerName

CMD:当依据镜像构建的容器运行时将会执行的命令,可以是shell命令的格式,也可以是数组格式