百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

实战:dockerfile 最小实践——koa 为例

ztj100 2025-09-01 19:30 11 浏览 0 评论

前言

最小实践,意味着将链路打通,站在更高的层面看问题,问题就变得清晰,此文笔者将带诸位实现一个最简单的 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

相关推荐

sharding-jdbc实现`分库分表`与`读写分离`

一、前言本文将基于以下环境整合...

三分钟了解mysql中主键、外键、非空、唯一、默认约束是什么

在数据库中,数据表是数据库中最重要、最基本的操作对象,是数据存储的基本单位。数据表被定义为列的集合,数据在表中是按照行和列的格式来存储的。每一行代表一条唯一的记录,每一列代表记录中的一个域。...

MySQL8行级锁_mysql如何加行级锁

MySQL8行级锁版本:8.0.34基本概念...

mysql使用小技巧_mysql使用入门

1、MySQL中有许多很实用的函数,好好利用它们可以省去很多时间:group_concat()将取到的值用逗号连接,可以这么用:selectgroup_concat(distinctid)fr...

MySQL/MariaDB中如何支持全部的Unicode?

永远不要在MySQL中使用utf8,并且始终使用utf8mb4。utf8mb4介绍MySQL/MariaDB中,utf8字符集并不是对Unicode的真正实现,即不是真正的UTF-8编码,因...

聊聊 MySQL Server 可执行注释,你懂了吗?

前言MySQLServer当前支持如下3种注释风格:...

MySQL系列-源码编译安装(v5.7.34)

一、系统环境要求...

MySQL的锁就锁住我啦!与腾讯大佬的技术交谈,是我小看它了

对酒当歌,人生几何!朝朝暮暮,唯有己脱。苦苦寻觅找工作之间,殊不知今日之事乃我心之痛,难道是我不配拥有工作嘛。自面试后他所谓的等待都过去一段时日,可惜在下京东上的小金库都要见低啦。每每想到不由心中一...

MySQL字符问题_mysql中字符串的位置

中文写入乱码问题:我输入的中文编码是urf8的,建的库是urf8的,但是插入mysql总是乱码,一堆"???????????????????????"我用的是ibatis,终于找到原因了,我是这么解决...

深圳尚学堂:mysql基本sql语句大全(三)

数据开发-经典1.按姓氏笔画排序:Select*FromTableNameOrderByCustomerNameCollateChinese_PRC_Stroke_ci_as//从少...

MySQL进行行级锁的?一会next-key锁,一会间隙锁,一会记录锁?

大家好,是不是很多人都对MySQL加行级锁的规则搞的迷迷糊糊,一会是next-key锁,一会是间隙锁,一会又是记录锁。坦白说,确实还挺复杂的,但是好在我找点了点规律,也知道如何如何用命令分析加...

一文讲清怎么利用Python Django实现Excel数据表的导入导出功能

摘要:Python作为一门简单易学且功能强大的编程语言,广受程序员、数据分析师和AI工程师的青睐。本文系统讲解了如何使用Python的Django框架结合openpyxl库实现Excel...

用DataX实现两个MySQL实例间的数据同步

DataXDataX使用Java实现。如果可以实现数据库实例之间准实时的...

MySQL数据库知识_mysql数据库基础知识

MySQL是一种关系型数据库管理系统;那废话不多说,直接上自己以前学习整理文档:查看数据库命令:(1).查看存储过程状态:showprocedurestatus;(2).显示系统变量:show...

如何为MySQL中的JSON字段设置索引

背景MySQL在2015年中发布的5.7.8版本中首次引入了JSON数据类型。自此,它成了一种逃离严格列定义的方式,可以存储各种形状和大小的JSON文档,例如审计日志、配置信息、第三方数据包、用户自定...

取消回复欢迎 发表评论: