继上篇 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内的指令一条条执行并显示过程
-
打包镜像报错解决
failed to solve with frontend dockerfile.v0: failed to create LLB definition: unexpected status code [manifests 16.13.2]: 403 Forbidden
解决方案1: 设置中修改改字段为: false
解决方案2: 科学上网
-
查看是否成功
这个过程需要一会,出现下图表示构建成功
启动容器
docker images 查看镜像,发现有了刚刚我们打包的镜像
-
打包镜像tag为 none问题
有时发现打包后的镜像名称和tag为:none ,这个问题是可能是因为这个镜像在打包过程中某个步骤报错,导致打包失败了。
先删除容器 -> 再删除镜像 -> 重新打包 -
启动容器
使用刚刚创建的 node01 镜像启动并创建一个容器:
docker run -itd -p 2000:2022 --name node-container1 e9259daa586a-p 宿主机端口:容器端口
node-container1: 容器名称
e9259daa586a: 镜像id或者名称启动后查看 容器运行 情况:
docker ps不出意外的话就可以通过:
http://127.0.0.1:2000访问到我们容器中的 node 服务了 -
容器启动成功,访问失败问题
容器启动成功后,发现使用宿主机ip+端口 无法访问到容器的服务!
docker ps 查看虽然容器启动成功,但是不代表容器中的服务一定是成功的!问题排查:
- 查询当前容器日志:
docker logsnode-container1 - 检查 Dockerfile 文件的每一行命令是否执行成功(比如有copy命令是否执行,如果能登录到容器需检查对应目录是否有copy的文件)
- 查询当前容器日志:
复用镜像
想要复用上面我们打包的镜像首先要推送镜像到 dockerhub
推送镜像
-
注册账号 首先去docker官网 注册账号,并且创建一个仓库,后续推送镜像到此仓库
-
终端登录docker官方
docker login输入用户名和密码
docker logout登出
出现下图为登录成功 -
给镜像打标签
一定要打上tag,并带上dockerhub的账号,不然没办法上传到dockerhub上的。修改为规范的镜像(公开仓库):
docker tag node01:latest 1234/node-test:0.0.1node01:latest是当前本地用户的镜像的 “名字:TAG”
1234是自己的dockerhub账号
redis:0.0.1是我们自己定义的镜像名和版本号
打标签为私人仓库方式:
docker tag node01:latest 用户名/私人仓库名称:0.0.1
-
推送镜像到私有仓库
docker images将打好tag的镜像推送到dockerhubs私有仓库:my-images :
docker push sisi001/my-images:0.0.1
拉取仓库镜像使用
`docker pull sisi001/my-images:0.0.1`
现在我们就可以使用dockerhub私有仓库的node项目的镜像,启动一个新容器去访问node服务啦~