什么是Docker
Docker是一个虚拟环境容器,可以将你的开发环境、代码、配置文件等一并打包到这个容器中,并发布和应用到任意平台中。
比如,你在本地用Node开发网站后台,开发测试完成后,就可以将Node代码及其依赖包、Node环境,数据库环境等打包到一个容器中,然后部署到任意你想部署到的机器上。而这个机器不需要事先安装node,数据库环境,这个容器是运行在Dokcer引擎中的,容器内部就是一个代码运行的环境。
Docker的三个概念
- 镜像(Image):类似于虚拟机中的镜像,是一个包含有文件系统的面向Docker引擎的只读模板。任何应用程序运行都需要环境,而镜像就是用来提供这种运行环境的。例如一个Ubuntu镜像就是一个包含Ubuntu操作系统环境的模板,同理在该镜像上装上Node软件,就可以称为Node镜像。
- 容器(Container):类似于一个轻量级的沙盒。容器是镜像创建的应用实例,可以将其看作一个极简的Linux系统环境,为代码运行提供运行环境。各个容器之间是是相互隔离的,互不影响。
注意:镜像本身是只读的,容器从镜像启动时,Docker在镜像的上层创建一个可写层,镜像本身不变。一个镜像可以有多个容器。镜像和容器的关系相当于class类和实例化对象
- 仓库(Repository):类似于代码仓库,这里是镜像仓库,是Docker用来集中存放镜像文件的地方。
下载一个Node镜像
- 安装docker
可以直接下载docker desktop,然后无脑安装
- 搜索并拉取node镜像
在这个网站可以搜索你想要的任何镜像--即任何运行环境 hub.docker.com/
在右上角搜索node
选择你要下载的node镜像,进去看看有哪些版本,选择一个你喜欢的
在控制台输入命令拉取镜像,我这里选择的是16版本。如果不标识版本,默认就是最新版least
docker pull node:16
实例化并运行node容器
打开desktop,可以看到已经有了node镜像,并且是16版本的
可以在命令行输入docker images查看本机有多少镜像
- 实例化并运行node容器。
下面这个命令效果是后台运行一个node容器,并且容器命名为myNode
docker run -dit --name myNode node:16
现在docker desktop中可以看到有个叫myNode的容器在运行
也可以通过命令行查看本机正在运行的容器docker ps
- 进入node容器的shell命令行
docker exec -it myNode /bin/bash
上面的命令效果是进入容器内部的环境,输入node,就可以进入node shell命令行
可以看出容器内部就是一个有着node环境的linux微型系统
方法二,在docker desktop中,选中运行的容器,也可以直接进入容器内部
让我们的js代码在docker中运行起来
- 准备一个node代码,代码很简单,任何访问这个server的请求,server都会返回
hello nodejs in docker字符串
执行这段代码,运行正常
- 准备一个Dockerfile(首字母大写)
逻辑很简单
FROM:表示新建的iamge(镜像)需要在node环境中进行,那么就需要node镜像。
WORKDIR:声明了工作目录`/app`,即node代码在该目录下进行
COPY:作用是,将当前目录的所有代码都复制到工作目录下
CMD:后面跟着一句shell 命令,该命令在容器运行的时候会得到执行,即当容器运行的时候,就会启动一个监听端口为3000的服务器
3. 构建新镜像,依据Dockerfile
docker build -t my-docker-demo:1.0 .
- 实例化该镜像,并运行
docker run -d -p 3000:3000 --name myContainerDemo my-docker-demo:1.0
-p: 映射端口,因为运行的容器相当于一个微型的虚拟机,访问里面的应用服务需要提供端口号,这里将本机的3000端口映射容器的3000端口
- 访问运行的服务器
查看容器内部服务输出的日志
成功
如果将运行的命令改成 -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命令的格式,也可以是数组格式