# Prisma 简介

Prisma 是一个开源的 Node.js ORM(对象关系映射)工具,它使得开发者能够使用 TypeScript 或 JavaScript 来安全、可靠地查询数据库。Prisma 简化了数据库访问层,使开发者能够将更多的精力集中在业务逻辑上,而不是编写和维护复杂的 SQL 查询。

# Prisma 的主要特点

  1. 类型安全:Prisma 使用 TypeScript 作为主要的开发语言,提供了强大的类型检查,确保数据库查询和模型定义在类型上是一致的。
  2. 自动迁移:Prisma 可以自动处理数据库迁移,根据模型定义来更新数据库结构。
  3. 清晰的错误提示:当查询出错时,Prisma 会提供清晰的错误提示,帮助开发者快速定位问题。
  4. 关系管理:Prisma 支持复杂的关系模型,如一对一、一对多、多对多等,并提供了方便的关系查询 API。

# Prisma 的使用方法

# 1. 安装 Prisma CLI

首先,你需要在项目中安装 Prisma CLI。你可以使用 npm 或 yarn 来安装:

npm install -g prisma
# 或者
yarn global add prisma
1
2
3

# 2. 初始化 Prisma

在你的项目根目录下运行以下命令来初始化 Prisma:

npx prisma init
1

这将在你的项目中创建一个名为 prisma 的目录,其中包含 Prisma 的配置文件 schema.prisma。

# 3. 定义数据模型

在 schema.prisma 文件中,你可以定义你的数据模型。例如:

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

generator client {
  provider = "prisma-client-js"
}

model User {
  id        Int      @id @default(autoincrement())
  email     String   @unique
  name      String?
  posts     Post[]
}

model Post {
  id        Int      @id @default(autoincrement())
  title     String
  content   String?
  published Boolean  @default(false)
  author    User?    @relation(fields: [authorId], references: [id])
  authorId  Int?
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

在上面的例子中,我们定义了两个模型:User 和 Post。User 和 Post 之间有一个一对多的关系。

# 4. 生成 Prisma 客户端

运行以下命令来根据数据模型定义生成 Prisma 客户端:

npx prisma generate
1

这将生成一个名为 @prisma/client 的 npm 包,你可以在你的代码中引入并使用它。

# 5. 执行数据库迁移

当你修改了数据模型并重新生成了 Prisma 客户端后,你需要执行数据库迁移来更新数据库结构:

npx prisma migrate dev
1

# 6. 查询数据库

在你的代码中,你可以引入 Prisma 客户端并使用它来查询数据库。例如:

import { PrismaClient } from '@prisma/client';

const prisma = new PrismaClient();

async function main() {
  const allUsers = await prisma.user.findMany();
  console.log(allUsers);
}

main()
  .catch((e) => {
    throw e;
  })
  .finally(async () => {
    await prisma.$disconnect();
  });
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 常见问题解决方案

  1. 数据库连接问题:确保你的数据库 URL 是正确的,并且数据库服务是运行中的。同时,检查防火墙和网络设置,确保你的应用可以连接到数据库。
  2. 迁移冲突:如果你在尝试执行迁移时遇到了冲突,可能是因为你的数据模型定义与当前的数据库结构不一致。你可以尝试使用 prisma migrate resolve 命令来解决冲突。
  3. 类型错误:如果你在查询数据库时遇到了类型错误,可能是因为你的查询语句与数据模型定义不匹配。检查你的查询语句和数据模型定义,确保它们是一致的。

# Prisma 数据模型字段解释

在定义 Prisma 数据模型时,每个字段都代表数据库表中的一个列,用于存储特定类型的数据。字段的定义包括字段名、数据类型、约束等。下面是一些在 Prisma 数据模型中常见的字段定义及其代表的意义:

  1. 字段名 (Field Name): 字段名是数据库表中列的名称。它应该清晰地描述该列存储的数据类型。例如,name、email、age 等。

  2. 数据类型 (Data Type): 数据类型指定了字段中可以存储的数据种类。Prisma 支持多种数据类型,如:

    • String:文本字符串。
    • Int:整数。
    • BigInt:大整数。
    • Float:浮点数。
    • Decimal:定点数,用于精确的小数运算。
    • DateTime:日期和时间。
    • Boolean:布尔值(true 或 false)。
    • Enum:枚举类型,用于预定义的值集合。
    • Json:JSON 数据。
    • 关系字段(如 User[] 或 Post?):表示与其他模型的关联。
  3. 约束 (Constraints): 约束是对字段数据的限制条件。Prisma 支持多种约束,包括:

    • @id:标识字段为主键。
    • @unique:确保字段中的每个值都是唯一的。
    • @default(...):为字段设置默认值。
    • @map(...):为字段指定数据库中的列名。
    • @createdAt 和 @updatedAt:自动处理记录的创建和更新时间戳。
    • 关系约束(如 @relation(...)):定义与其他模型的关系的细节。
  4. 可选性 (Optionality): 字段可以是可选的(字段名后加问号,如 name?),也可以是必填的。可选字段意味着在创建或更新记录时可以不提供该字段的值。

  5. 关系字段 (Relational Fields): 关系字段表示当前模型与其他模型之间的关系。例如,一个 User 模型可能有一个 posts 字段,它是一个 Post[] 类型,表示用户发布的所有帖子。这种关系字段在 Prisma 中通过数组类型或可选的单个类型来表示。

  6. 字段属性 (Field Attributes): 某些字段类型可能具有额外的属性,如 @db.VarChar(255) 用于指定 String 字段的最大长度。

下面是一个简单的 Prisma 数据模型示例,展示了字段定义及其意义:

model User {
  id        Int      @id @default(autoincrement()) // 主键,自增整数
  email     String   @unique // 唯一字符串,用于存储用户的电子邮件地址
  name      String?          // 可选的字符串,用于存储用户的名字
  age       Int?             // 可选的整数,用于存储用户的年龄
  createdAt DateTime @default(now()) // 自动设置为当前时间的创建时间戳
  posts     Post[]           // 与Post模型的一对多关系,存储用户发布的帖子列表
}

model Post {
  id        Int      @id @default(autoincrement()) // 主键,自增整数
  title     String   // 必填字符串,用于存储帖子的标题
  content   String?  // 可选的字符串,用于存储帖子的内容
  published Boolean  @default(false) // 布尔值,表示帖子是否已发布
  authorId  Int      // 外键,引用User模型的id字段
  author    User     @relation(fields: [authorId], references: [id]) // 与User模型的关系的引用
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

在上面的例子中,User 模型有 id、email、name、age、createdAt 和 posts 字段,而 Post 模型有 id、title、content、published、authorId 和 author 字段。每个字段都有其特定的类型和约束,以满足应用的需求。

# Prisma CLI 常用命令

以下是一些常用的 Prisma CLI 命令及其详解。

# 1. prisma init

功能:初始化一个新的 Prisma 项目。

用法:npx prisma init

这个命令将创建一个新的 prisma 目录,并在其中生成 schema.prisma 文件,这是定义数据库模型的地方。

# 2. prisma generate

功能:根据 schema.prisma 文件生成 Prisma 客户端代码。

用法:npx prisma generate

此命令将生成 TypeScript 或 JavaScript 的 Prisma 客户端,该客户端包含了用于查询和操作数据库的所有必要类型和函数。

# 3. prisma migrate

功能:管理数据库迁移。

子命令:

  • prisma migrate dev:基于 schema.prisma 和当前数据库状态生成并应用迁移。
  • prisma migrate reset:重置数据库到初始状态。
  • prisma migrate save --name=MyMigration:保存一个迁移文件,但不应用它。
  • prisma migrate up:应用最新的迁移。
  • prisma migrate down:回滚到上一个迁移。
  • prisma migrate list:列出所有的迁移。

# 4. prisma studio

功能:启动 Prisma Studio,一个基于浏览器的数据库可视化工具。

用法:npx prisma studio

Prisma Studio 允许开发者在浏览器中直接查询和修改数据库,而无需编写任何代码。

# 5. prisma db pull

功能:从现有数据库反向生成 Prisma schema。

用法:npx prisma db pull

这个命令会读取数据库的结构,并尝试生成一个与之匹配的 schema.prisma 文件。

# 6. prisma format

功能:格式化 schema.prisma 文件。

用法:npx prisma format

这个命令可以帮助你按照 Prisma 的最佳实践来格式化你的 schema 文件。

# 7. prisma validate

功能:验证 schema.prisma 文件的语法和一致性。

用法:npx prisma validate

这个命令会在你尝试生成或迁移之前检查你的 schema 文件是否有任何错误。

# 8. prisma db push

注意

该命令可能会导致数据丢失,使用前要谨慎。

功能:将 Prisma schema 应用到数据库。

用法:npx prisma db push

这个命令会读取 schema.prisma 文件,并尝试将定义的结构应用到数据库中。注意,这可能会导致数据丢失,所以在使用之前要谨慎。

# 其他命令和选项

Prisma CLI 还提供了其他命令和选项,如配置数据库连接、查看帮助文档等。你可以通过运行 npx prisma --help 或访问 Prisma 的官方文档来获取完整的命令列表和更多详细信息。

总的来说,Prisma CLI 提供了一套强大的命令行工具,帮助开发者更高效地管理数据库和 Prisma schema。通过熟悉这些命令,你可以更加顺畅地使用 Prisma 进行数据库开发。

# MinIO(Node.js 客户端)

# 一、安装 MinIO Node.js 客户端

首先,你需要在你的 Node.js 项目中安装 MinIO 的客户端库。在你的项目目录下打开终端,然后运行以下命令:

npm install --save minio
1

这将会安装 minio 库到你的 node_modules 文件夹中,并将其添加到你的 package.json 文件的依赖列表中。

# 二、创建 MinIO 客户端

在你的 Node.js 代码中,你需要创建一个 MinIO 客户端实例,以便与 MinIO 服务器进行通信。这通常涉及到提供 MinIO 服务器的地址、端口、访问密钥和秘密密钥等信息。以下是一个简单的示例:

const Minio = require('minio');

let minioClient = new Minio.Client({
  endPoint: 'your-minio-endpoint', // 替换为你的 MinIO 服务器的地址
  port: 9000, // 替换为你的 MinIO 服务器的端口
  useSSL: false, // 如果你的 MinIO 服务器使用 HTTPS,则设置为 true
  accessKey: 'your-access-key', // 替换为你的访问密钥
  secretKey: 'your-secret-key', // 替换为你的秘密密钥
});
1
2
3
4
5
6
7
8
9

# 三、使用 MinIO 客户端进行操作

一旦你有了 MinIO 客户端实例,你就可以使用它来执行各种对象存储操作,如创建桶、上传文件、下载文件、删除文件等。以下是一些示例:

1. 创建桶

minioClient.makeBucket('my-bucket', 'us-east-1', function(err, res) {
  if (err) {
    return console.log(err)
  }
  console.log(res)
});
1
2
3
4
5
6

2. 上传文件

const fs = require('fs');
const filePath = '/path/to/your/file';

minioClient.fPutObject('my-bucket', 'my-object', fs.createReadStream(filePath), { contentType: 'application/octet-stream', metadata: { 'x-amz-meta-mykey': 'myvalue' } }, function(err, etag) {
  if (err) return console.log(err)
  console.log(etag)
});
1
2
3
4
5
6
7

3. 下载文件

minioClient.getObject('my-bucket', 'my-object', function(err, dataStream) {
  if (err) return console.log(err)
  dataStream.pipe(fs.createWriteStream('/path/to/destination/file'));
});
1
2
3
4

4. 删除文件

minioClient.removeObject('my-bucket', 'my-object', function(err) {
  if (err) return console.log(err)
  console.log('Removed successfully')
});
1
2
3
4

这些只是 MinIO Node.js 客户端的基本用法。MinIO 提供了丰富的 API,可以满足各种复杂的对象存储需求。你可以查阅 MinIO 的官方文档以获取更详细的信息和示例。

注意:在使用 MinIO Node.js 客户端时,请确保你的 MinIO 服务器已经正确配置并正在运行,且你的访问密钥和秘密密钥是正确的。此外,对于生产环境,建议使用 HTTPS 来保护你的通信安全。

# log4js 详解

log4js 是一个强大的 Node.js 日志库,它基于 Java 的 log4j 库,为 Node.js 应用提供灵活的日志记录功能。log4js 允许开发者定义不同级别的日志,例如:debug、info、warn、error 等,并且可以将日志输出到不同的目的地,如控制台、文件、数据库等。

# 1. 安装 log4js

使用 npm 可以轻松安装 log4js:

npm install log4js
1

# 2. 基本配置和使用

在 Node.js 项目中,你通常需要创建一个配置文件来定义 log4js 的行为。以下是一个基本的配置示例:

const log4js = require('log4js')
const logLayout = {
  type: 'pattern',
  pattern: '[%[%p%]] %d{yyyy-MM-dd hh:mm:ss} %h %[%f{2}:%l%] %m%n'
}

log4js.configure({
  appenders: {
    console: { type: 'console', layout: logLayout },
    file: {
      type: 'dateFile',
      filename: 'logs/app',
      encoding: 'utf-8',
      pattern: 'yyyy-MM-dd.log',
      layout: {
        type: 'pattern',
        pattern: '[%p] %d{yyyy-MM-dd hh:mm:ss} %h %f{2}:%l %m%n'
      },
      alwaysIncludePattern: true,
      numBackups: 90,
      keepFileExt: true // 保留扩展名
    }
  },
  categories: {
    default: {
      appenders: ['console', 'file'],
      level: 'debug',
      enableCallStack: true
    }
  }
})

module.exports = log4js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

在上面的代码中,我们首先引入了 log4js 库,然后配置了两个 appender:一个用于输出到控制台,另一个用于输出到文件。

# 3. 配置选项

log4js 提供了丰富的配置选项,允许你精细控制日志的行为。例如,你可以为每个 appender 设置不同的布局(layout),控制日志的格式;你还可以设置日志的滚动策略,当日志文件达到一定大小或时间时,自动滚动创建新的日志文件。

# 常见问题解决方案

  1. 日志级别不生效:如果你将日志级别设置为 'info',那么所有级别为 'info'、'warn' 和 'error' 的日志都会被输出,而级别为 'debug' 的日志则不会。确保你设置的日志级别满足你的需求。
  2. 日志文件没有生成:可能是因为文件路径不正确或没有足够的写入权限。检查你的文件路径是否正确,并确保 Node.js 进程有权限在该路径下创建和写入文件。
  3. 控制台日志重复输出:可能是因为你在配置中启用了多个控制台 appender。检查你的配置,确保只启用了一个控制台 appender。

以上就是对 log4js 的详细解释、使用方法以及常见问题的解决方案。log4js 是一个非常强大且灵活的日志库,通过合理的配置和使用,可以极大地提升 Node.js 应用的日志管理能力。

# ioredis

ioredis 是一个全功能的 Redis 客户端,用于 Node.js 环境。它支持 Redis 的所有命令,提供连接池、自动重连、Pub/Sub、Lua 脚本、事务、管道等功能,并且它是基于纯 JavaScript 实现的,无需任何依赖。

ioredis 的主要特点包括:

  1. 高性能:基于纯 JavaScript 实现,利用 Node.js 的非阻塞 I/O 特性,实现了高效的并发处理。
  2. 连接池:支持连接池功能,可以复用连接,减少创建和销毁连接的开销。
  3. 自动重连:当与 Redis 服务器的连接断开时,会自动尝试重新连接。
  4. Pub/Sub:支持 Redis 的发布/订阅模式,方便实现实时通信功能。
  5. Lua 脚本:支持执行 Redis 的 Lua 脚本,实现复杂的业务逻辑。
  6. 事务:支持 Redis 的事务功能,确保一系列命令的原子性执行。

# 基本使用

安装 ioredis:

npm install ioredis
1

在 Node.js 中使用 ioredis:

const Redis = require('ioredis');

// 创建一个 Redis 客户端实例
const redis = new Redis({
  port: 6379,          // Redis 端口
  host: '127.0.0.1',   // Redis 主机地址
  password: 'yourpassword', // 密码(如果 Redis 服务器设置了密码的话)
  db: 0,               // 使用的数据库索引
});

// 使用客户端实例执行命令
redis.set('foo', 'bar', function (err, result) {
  if (err) {
    console.error('Error setting value in Redis:', err);
    return;
  }
  console.log('Value set in Redis:', result);
});

// 获取值
redis.get('foo', function (err, result) {
  if (err) {
    console.error('Error getting value from Redis:', err);
    return;
  }
  console.log('Value from Redis:', result);
});

// 当不再需要客户端时,关闭连接
redis.quit();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

# 常用 API

ioredis 提供了丰富的 API 来操作 Redis 数据。以下是一些常用的 API 和它们的用法:

  1. set(key, value, [options], callback):设置 key 的值为 value。
  2. get(key, callback):获取 key 的值。
  3. hset(key, field, value, [options], callback):将哈希表 key 中的字段 field 的值设为 value。
  4. hget(key, field, callback):获取存储在哈希表 key 中的字段 field 的值。
  5. lpush(key, ...values, [options], callback):将一个或多个值 value 插入到列表 key 的表头。
  6. rpop(key, callback):移除并获取列表 key 的表尾元素。
  7. sadd(key, ...members, [options], callback):向集合 key 添加一个或多个 member 元素,如果 member 已经存在于集合中,则忽略。
  8. smembers(key, callback):返回集合 key 中的所有成员。
  9. zadd(key, score, member, [[score2, member2], ...], [options], callback):将一个或多个 member 元素及其 score 值加入到有序集合 key 中。
  10. zrange(key, start, stop, [WITHSCORES], callback):返回有序集合 key 中,指定区间内的成员。其中成员的位置按 score 值递增(从小到大)来排序,具有相同 score 值的成员按字典序排列。

除了上述基本的 CRUD 操作外,ioredis 还支持发布/订阅、事务、Lua 脚本执行等高级功能。

# 更多 API

连接与断开

  1. connect():手动连接到 Redis 服务器。
  2. disconnect():断开与 Redis 服务器的连接。
  3. end() 或 quit():关闭连接并结束 Redis 客户端。

键操作

  1. del(key, [key...], callback):删除一个或多个 key。
  2. exists(key, callback):检查 key 是否存在。
  3. expire(key, seconds, callback):为 key 设置过期时间(以秒为单位)。
  4. ttl(key, callback):获取 key 的剩余过期时间。
  5. type(key, callback):返回 key 的类型。

列表操作

  1. rpush(key, ...values, [options], callback):将一个或多个值插入到列表 key 的表尾。
  2. lrange(key, start, stop, callback):获取列表 key 中指定范围内的元素。
  3. lindex(key, index, callback):获取列表 key 中指定索引的元素。
  4. lrem(key, count, value, callback):移除列表 key 中等于 value 的元素。count 的值决定了移除的个数和方向。

集合操作

  1. srem(key, ...members, callback):移除集合 key 中的一个或多个 member 元素。
  2. sismember(key, member, callback):判断 member 元素是否是集合 key 的成员。
  3. scard(key, callback):返回集合 key 的元素个数。

有序集合操作

  1. zrem(key, ...members, callback):移除有序集合 key 中的一个或多个成员。
  2. zrevrange(key, start, stop, [WITHSCORES], callback):返回有序集合 key 中,指定区间内的成员,成员的位置按 score 值递减(从大到小)来排序。
  3. zscore(key, member, callback):返回有序集合中指定成员的分数值。

发布/订阅

  1. subscribe(channel, [channel...], callback):订阅一个或多个频道。
  2. unsubscribe(channel, [channel...], callback):退订一个或多个频道。
  3. psubscribe(pattern, [pattern...], callback):订阅一个或多个符合给定模式的频道。
  4. punsubscribe(pattern, [pattern...], callback):退订一个或多个符合给定模式的频道。

事务

  1. multi([options]):标记一个事务块的开始。
  2. exec(callback):执行所有事务块内的命令。
  3. discard():取消事务,放弃执行事务块内的所有命令。

Lua 脚本

  1. eval(script, numKeys, key1, key2, ..., arg1, arg2, ..., callback):执行 Lua 脚本。
  2. evalsha(sha1, numKeys, key1, key2, ..., arg1, arg2, ..., callback):执行 Lua 脚本的 SHA1 校验和。

其他

  1. ping([callback]):发送一个 PING 命令到服务器。
  2. dbsize([callback]):返回当前数据库的 key 数量。
  3. flushdb([options], callback):删除当前数据库中的所有 key。
  4. flushall([options], callback):删除所有数据库中的所有 key。

完整的 API 列表和详细文档可以在 ioredis 的官方文档中找到。随着 ioredis 的版本更新,可能会有新的 API 被添加或旧的 API 被修改,建议经常查阅官方文档以获取最新的信息。

# Docker 容器常用操作

要重启 Docker 镜像,首先需要明确的是,Docker 镜像本身并不运行,而是基于镜像创建并启动的容器在运行。因此,重启 Docker 镜像实际上是指重启运行该镜像的容器。

# 1. 查看正在运行的容器

使用 docker ps 命令可以查看当前正在运行的容器及其相关信息,包括容器 ID 和名称:

docker ps
1

如果容器当前不在运行状态,可以使用 docker ps -a 来列出所有容器,包括停止的容器。

# 2. 重启容器

使用 docker restart 命令加上容器的 ID 或名称来重启容器:

docker restart <container_id_or_name>
1

这个命令会停止指定的容器(如果它正在运行)并立即重新启动它。重启过程会保持容器使用的任何数据卷和网络设置不变,这意味着容器内的数据和配置将被保留。

# 3. (可选)如果镜像有更新

如果你想要基于更新后的镜像来重启容器,那么你需要先停止并删除旧的容器,然后基于新的镜像创建并启动新的容器:

# 停止并删除正在运行的容器
docker stop <container_id_or_name>
docker rm <container_id_or_name>

# 基于新的镜像创建并启动容器
docker run -d <options> <new_image_name_or_id>
1
2
3
4
5
6

请注意,如果你需要经常重启容器,可能需要检查应用程序或容器配置是否有问题,因为频繁重启通常不是最佳实践。如果想要重启的是 Docker 服务本身(而非容器),则需要使用系统服务管理工具(如 Linux 上的 systemctl)。

# 使用 Dockerfile 部署 Node.js 项目

为了在 Docker 中部署 Node.js 项目,你需要创建一个 Dockerfile,它是一个文本文件,定义了构建 Docker 镜像的步骤。以下是一个基本的 Dockerfile 示例:

# 使用官方Node.js基础镜像
FROM node:16

# 设置工作目录
WORKDIR /usr/src/app

# 复制package.json文件和package-lock.json文件(如果存在)
COPY package*.json ./

# 安装项目依赖
RUN npm install

# 复制项目文件到工作目录
COPY . .

# 暴露容器端口
EXPOSE 8080

# 运行Node.js应用
CMD ["node", "app.js"]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

确保你的 Node.js 项目中有 package.json 文件,并且应用的入口文件是 app.js。

接下来,构建 Docker 镜像:

docker build -t node-app .
1

然后,运行容器:

docker run -p 8080:8080 -d node-app
1

这里,-t node-app 给镜像命名为 node-app,-p 8080:8080 将容器的 8080 端口映射到主机的 8080 端口,-d 表示后台运行。确保你的 Node.js 应用监听的端口与 EXPOSE 指令中指定的端口相匹配。

# Dockerfile 构建与运行完整流程

  1. 编写 Dockerfile:在项目的根目录下创建一个名为 Dockerfile 的文件(注意没有扩展名),定义构建镜像所需的步骤和配置。例如:

    # 使用官方Node.js镜像作为基础镜像
    FROM node:latest
    
    # 设置工作目录为/app
    WORKDIR /app
    
    # 将当前目录内容复制到容器的/app内
    COPY . /app
    
    # 安装依赖
    RUN npm install
    
    # 对外暴露的端口号
    EXPOSE 3000
    
    # 定义容器启动后执行的命令
    CMD [ "npm", "start" ]
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
  2. 构建镜像:打开终端,导航到包含 Dockerfile 的目录,并运行以下命令来构建镜像:

    docker build -t my-nodejs-app:v1 .
    
    1
  3. 查看构建的镜像:

    docker images
    
    1
  4. 运行容器:

    docker run -d -p 8080:3000 my-nodejs-app:v1
    
    1

    这条命令会在后台启动一个容器,并将主机的 8080 端口映射到容器的 3000 端口。

  5. 查看运行的容器:

    docker ps
    
    1
  6. (可选)连接到容器:如果需要,你可以使用 docker exec 命令连接到正在运行的容器内部:

    docker exec -it <container_id_or_name> /bin/bash
    
    1

# 安装 MySQL 客户端(CentOS)

mysql: command not found 这个错误表明你的系统中没有安装 MySQL 客户端,或者 MySQL 客户端没有正确添加到系统的 PATH 环境变量中。在 CentOS 上,你可以按照以下步骤来安装 MySQL 客户端:

  1. 安装 MySQL 服务端和客户端:

    通常,当你安装 MySQL 服务端时,客户端也会一起安装。你可以使用 yum 来安装 MySQL 社区版:

    sudo yum install -y mysql-server mysql
    
    1

    在某些情况下,你可能需要启用 MySQL 的 yum 仓库。对于 MySQL 8.0,你可以使用以下命令:

    sudo yum localinstall https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
    sudo yum install -y mysql-community-server
    
    1
    2
  2. 检查 MySQL 服务状态:

    sudo systemctl status mysqld
    
    1

    如果服务没有运行,你可以启动它:

    sudo systemctl start mysqld
    
    1
  3. 验证 MySQL 客户端安装:

    mysql --version
    
    1

    如果命令能够正确显示 MySQL 的版本信息,那么说明 MySQL 客户端已经成功安装。

  4. 设置开机自启(可选):

    sudo systemctl enable mysqld
    
    1
  5. 安全安装:

    MySQL 安装完成后,通常建议运行 mysql_secure_installation 脚本来加强安全性,包括设置 root 密码、删除匿名用户、禁止 root 用户远程登录等:

    sudo mysql_secure_installation
    
    1

如果你已经按照上述步骤操作,但仍然遇到 mysql: command not found 的错误,那么请检查你的 PATH 环境变量,确保包含了 MySQL 客户端的安装路径。你可以通过 echo $PATH 命令查看当前的 PATH 设置。

Last Updated: 8/31/2026, 4:09:09 AM