docker部署一个node项目

545 阅读5分钟

image.png

继上篇 docker 初识 如何安装docker后,继续学习使用docker部署一个本地node项目的demo;
第一次玩这个东西遇见了很多问题,也借鉴了网上很多资料才实践完成,本人才疏学浅,谨以此篇记录自己的学习过程,大佬勿喷;别人的永远是别人的,只有自己亲自尝试一遍学会了才能变成自己的东西,加油!

如果文章对你有用麻烦点赞或收藏支持哈~
点击链接 学习交流群(前端微信群) 加微信拉你进 前端学习交流群

docker 构建镜像

docker 支持自己构建镜像,还支持将自己构建的镜像上传至公共仓库,镜像构建可以通过以下两种方式来实现:

  • docker commit: 从容器创建一个新的镜像
  • docker build:配合 Dockerfile 文件创建镜像

本篇我们使用 Dockerfile 配置文件打包node项目为镜像并且发布到dockerhub私有仓库上

准备项目

首先你需要有一个项目,本地现有项目或者github获取都可以

编写 Dockerfile文件

Dockerfile 就是镜像的配置文件;Dockerfile文件里是一条条能被Linux执行的命令,docker能根据该文件构建镜像。
该文件必须和项目文件放在一起,一般放在项目根目录下;

根目录创建 Dockerfile 内容如下,注意首字母大写

# FROM 表示设置要制作的镜像基于哪个镜像,FROM指令必须是整个Dockerfile的第一个指令,如果指定的镜像不存在默认会自动从Docker Hub上下载。
# 这里指定node:16.13.2版本镜像; node:latest latest表示版本是最新
FROM node:16.13.2

# 创建容器内的项目存放目录
RUN mkdir -p /home/nodeApp

# 指定工作目录为 容器内/home/nodeApp
WORKDIR /home/nodeApp

# 先拷贝package.json和package-lock.json到工作目录(此步骤是为了能应用包缓存)
COPY package*.json /home/nodeApp/

# 最后拷贝项目文件到工作目录
# 将Dockerfile当前目录下需要的文件拷贝至容器内项目目录 
COPY devTest /home/nodeApp/
# 安装项目依赖
RUN npm install

# 容器对外暴露的端口号,要和node项目配置的端口号一致
EXPOSE 2022

# 容器启动时执行的命令
CMD [ "node", "./test.js" ]
# or
# CMD npm run test

构建镜像

  • 将代码打包构建成镜像
    切换到Dockerfile所在的位置执行:

    # -t表示指定镜像的名字,不能有大写字母
    # :v1.0 指定版本
    # 注意这个 . 点
    docker build -t node01 .
    # or
    docker build -t node01:v1.0 .
    

    终端会按照Dockerfile内的指令一条条执行并显示过程

    image.png

  • 打包镜像报错解决

    failed to solve with frontend dockerfile.v0: failed to create LLB definition: unexpected status code [manifests 16.13.2]: 403 Forbidden

    解决方案1: 设置中修改改字段为: false

    image.png 解决方案2: 科学上网

  • 查看是否成功 image.png 这个过程需要一会,出现下图表示构建成功

    image.png

启动容器

docker images 查看镜像,发现有了刚刚我们打包的镜像 image.png

  • 打包镜像tag为 none问题

    有时发现打包后的镜像名称和tag为:none ,这个问题是可能是因为这个镜像在打包过程中某个步骤报错,导致打包失败了。
    先删除容器 -> 再删除镜像 -> 重新打包

  • 启动容器
    使用刚刚创建的 node01 镜像启动并创建一个容器:
    docker run -itd -p 2000:2022 --name node-container1 e9259daa586a

    -p 宿主机端口:容器端口
    node-container1: 容器名称
    e9259daa586a: 镜像id或者名称

    启动后查看 容器运行 情况: docker ps

    image.png 不出意外的话就可以通过: http://127.0.0.1:2000 访问到我们容器中的 node 服务了

    image.png

  • 容器启动成功,访问失败问题

    容器启动成功后,发现使用宿主机ip+端口 无法访问到容器的服务!
    docker ps 查看虽然容器启动成功,但是不代表容器中的服务一定是成功的!

    问题排查:

    • 查询当前容器日志:
      docker logs node-container1
    • 检查 Dockerfile 文件的每一行命令是否执行成功(比如有copy命令是否执行,如果能登录到容器需检查对应目录是否有copy的文件)

复用镜像

想要复用上面我们打包的镜像首先要推送镜像到 dockerhub

推送镜像

  • 注册账号 首先去docker官网 注册账号,并且创建一个仓库,后续推送镜像到此仓库

  • 终端登录docker官方
    docker login 输入用户名和密码
    docker logout 登出
    出现下图为登录成功 image.png

  • 给镜像打标签
    一定要打上tag,并带上dockerhub的账号,不然没办法上传到dockerhub上的。

    修改为规范的镜像(公开仓库):
    docker tag node01:latest 1234/node-test:0.0.1

    node01:latest是当前本地用户的镜像的 “名字:TAG”
    1234是自己的dockerhub账号
    redis:0.0.1是我们自己定义的镜像名和版本号

打标签为私人仓库方式:
docker tag node01:latest 用户名/私人仓库名称:0.0.1

  • 推送镜像到私有仓库
    docker images image.png 将打好tag的镜像推送到dockerhubs私有仓库:my-images :
    docker push sisi001/my-images:0.0.1

    image.png

拉取仓库镜像使用

`docker pull sisi001/my-images:0.0.1`  

image.png 现在我们就可以使用dockerhub私有仓库的node项目的镜像,启动一个新容器去访问node服务啦~