实战:dockerfile 最小实践——koa 为例
wptr33 2025-05-22 14:11 40 浏览
前言
最小实践,意味着将链路打通,站在更高的层面看问题,问题就变得清晰,此文笔者将带诸位实现一个最简单的 koa 服务,并将其部署至服务器上。
先决知识:对docker 有一定的了解
实现思路
第一步:先启动一个 koa 应用,
第二步:再生成一个 dockerfile ,并编写它
第三步:基于 dockerfile 生成镜像(docker build)
第四步:基于此镜像生成(run)一个容器,检查在本机上是否跑的通
第五步:如果通,就导出此镜像
第六步:xshell 连接服务器上(假设服务器上已安装 docker),导入此镜像,通过此镜像生成一容器
这就是最小实现
这里还有一种实现方式:
在第五步时,把它发布到远端仓库,第六步,从远端拉取到镜像,但缺点是,你的镜像要公开(只有一个私有名额)
第一步:先启动一个 koa 应用
新建一个 dockerfile_koa_demo 文件,npm init -y 生成 package.json。下载 koa 包,新建 app.js
mkdir dockerfile_koa_demo
cd dockerfile_koa_demo
npm init -y
npm i koa --save
touch app.js再编写 app.js
const Koa = require('koa');
const app = new Koa();
app.use(async (ctx) => {
ctx.body = 'hello, docker';
});
app.listen(3010, () => {
console.log('3010端口已启动');
});修改 package.json 的 script
...
"scripts": {
"start": "nodemon app.js"
},
...启动脚本
npm run start看到如下图所示:
浏览器访问正常
第二步:写个 Dockerfile 文件
新建一个 Dockerfile 文件
touch Dockerfile编写 Dockerfile
# base image
# FROM
FROM node
# 复制文件到容器
ADD . /home/www
# 进入工作目录
WORKDIR /home/www
# 安装项目依赖包
RUN npm install --registry=https://registry.npm.taobao.org
# 暴露 端口
EXPOSE 3010
# 开始命令
CMD ["node", "./app.js"]
第二步写完了
第三步:基于 dockerfile 生成镜像
为了加快构建速度,我们先生成 .dockerignore ,并往里写上 node_modules
touch .dockerignore在 .dockerignore 里写入 node_modules ,意思是说当你 docker build 的时候忽略 node_modules 文件,加快构建速度
通过命令行生成镜像,命名 johan/koa_server:v1.0.0
docker build . -t johan/koa_server:v1.0.0
# -t 就是给镜像起名效果如下图所示:
查看镜像是否有了
docker images第四步:基于此镜像生成一容器
命令行生成一容器
docker run -d --name koa_server_container -p 3010:3010 johan/koa_server:v1.0.0
# -d 后台运行
# --name 给容器起名字
# -p 本机端口隐射镜像中的端口查看镜像是否生成
docker ps -a在浏览器中输入http://localhost:3010/ ,bingo
第五步:导出此镜像
docker save johan/koa_server:v1.0.0 > koa_server.tar第六步:在服务器上跑通
这里我们假设服务器上已经安装了 docker 以及 lrzsz 包(本文具体不展开)
通过 xshell 连接服务器,通过命令 rz 上传 tar 包
rz解开此压缩包(导入)
docker load < koa_server.tar基于此容器生成容器
docker run -d --name koa_server_container -p 3010:3010 johan/koa_server:v1.0.0并查看跑通的容器
docker ps -a在浏览器中输入域名,bingo
以上就是一个 dockerfile 的最小实现,是不是很简单。当然,你可以在第五步时将镜像上传至docker hub,第六步从 dockerfile 拉取镜像,再生成容器。如下
另一种方法第五步:上传镜像
命令行登录 dockerhub(首先要先注册)
docker login给镜像命名
docker tag johan/koa_server:v1.0.0 johanbo/koa_server:v1.0.0将镜像上传至 docker hub
docker push johanbo/koa_server:v1.0.0另一种方法第六步:拉取镜像
登录服务器,并拉取镜像
docker pull johanbo/koa_server:v1.0.0注意:这里需要打标签,否则会默认拉取 latest
启动容器
docker run -d --name koa_server_container -p 3010:3010 johan/koa_server:v1.0.0在浏览器中输入域名,bingo
注意:服务器开发端口需要去云服务商那里开发相应端口(安全组配置规则)
后续
你可以在 dockerfile 里配置你所需的环境变量,镜像生成的容器是个 "mini 服务器",怎么倒腾都行,和整个服务器没有关系,所以你的应用不受环境影响。
在这里说一个痛点:即使你解决了环境问题,但是 CICD 也是个问题,如何更快捷地集成呢?接下来的一节我会介绍下,docker 与 jenkins 的结合,通过 docker 生成 jenkins,jenkins 赋能 CICD
相关推荐
- oracle数据导入导出_oracle数据导入导出工具
-
关于oracle的数据导入导出,这个功能的使用场景,一般是换服务环境,把原先的oracle数据导入到另外一台oracle数据库,或者导出备份使用。只不过oracle的导入导出命令不好记忆,稍稍有点复杂...
- 继续学习Python中的while true/break语句
-
上次讲到if语句的用法,大家在微信公众号问了小编很多问题,那么小编在这几种解决一下,1.else和elif是子模块,不能单独使用2.一个if语句中可以包括很多个elif语句,但结尾只能有一个...
- python continue和break的区别_python中break语句和continue语句的区别
-
python中循环语句经常会使用continue和break,那么这2者的区别是?continue是跳出本次循环,进行下一次循环;break是跳出整个循环;例如:...
- 简单学Python——关键字6——break和continue
-
Python退出循环,有break语句和continue语句两种实现方式。break语句和continue语句的区别:break语句作用是终止循环。continue语句作用是跳出本轮循环,继续下一次循...
- 2-1,0基础学Python之 break退出循环、 continue继续循环 多重循
-
用for循环或者while循环时,如果要在循环体内直接退出循环,可以使用break语句。比如计算1至100的整数和,我们用while来实现:sum=0x=1whileTrue...
- Python 中 break 和 continue 傻傻分不清
-
大家好啊,我是大田。...
- python中的流程控制语句:continue、break 和 return使用方法
-
Python中,continue、break和return是控制流程的关键语句,用于在循环或函数中提前退出或跳过某些操作。它们的用途和区别如下:1.continue(跳过当前循环的剩余部分,进...
- L017:continue和break - 教程文案
-
continue和break在Python中,continue和break是用于控制循环(如for和while)执行流程的关键字,它们的作用如下:1.continue:跳过当前迭代,...
- 作为前端开发者,你都经历过怎样的面试?
-
已经裸辞1个月了,最近开始投简历找工作,遇到各种各样的面试,今天分享一下。其实在职的时候也做过面试官,面试官时,感觉自己问的问题很难区分候选人的能力,最好的办法就是看看候选人的github上的代码仓库...
- 面试被问 const 是否不可变?这样回答才显功底
-
作为前端开发者,我在学习ES6特性时,总被const的"善变"搞得一头雾水——为什么用const声明的数组还能push元素?为什么基本类型赋值就会报错?直到翻遍MDN文档、对着内存图反...
- 2023金九银十必看前端面试题!2w字精品!
-
导文2023金九银十必看前端面试题!金九银十黄金期来了想要跳槽的小伙伴快来看啊CSS1.请解释CSS的盒模型是什么,并描述其组成部分。...
- 前端面试总结_前端面试题整理
-
记得当时大二的时候,看到实验室的学长学姐忙于各种春招,有些收获了大厂offer,有些还在苦苦面试,其实那时候的心里还蛮忐忑的,不知道自己大三的时候会是什么样的一个水平,所以从19年的寒假放完,大二下学...
- 由浅入深,66条JavaScript面试知识点(七)
-
作者:JakeZhang转发链接:https://juejin.im/post/5ef8377f6fb9a07e693a6061目录...
- 2024前端面试真题之—VUE篇_前端面试题vue2020及答案
-
添加图片注释,不超过140字(可选)...
- 今年最常见的前端面试题,你会做几道?
-
在面试或招聘前端开发人员时,期望、现实和需求之间总是存在着巨大差距。面试其实是一个交流想法的地方,挑战人们的思考方式,并客观地分析给定的问题。可以通过面试了解人们如何做出决策,了解一个人对技术和解决问...
- 一周热门
- 最近发表
-
- oracle数据导入导出_oracle数据导入导出工具
- 继续学习Python中的while true/break语句
- python continue和break的区别_python中break语句和continue语句的区别
- 简单学Python——关键字6——break和continue
- 2-1,0基础学Python之 break退出循环、 continue继续循环 多重循
- Python 中 break 和 continue 傻傻分不清
- python中的流程控制语句:continue、break 和 return使用方法
- L017:continue和break - 教程文案
- 作为前端开发者,你都经历过怎样的面试?
- 面试被问 const 是否不可变?这样回答才显功底
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)
