数据库
一般来说我们的容器大部分都需要使用数据库,只是一些比较简单的容器使用的是内置的SQLite,但是如果是比较复杂一点的容器会改成其他数据库的比如 MySQL或PostgreSQL。
今天我们就来了解了解这些数据库。
# 基础知识
1.SQLite/ MySQL/PostgreSQL
它们都是关系型数据库体系,用于管理数据的存储、查询和权限控制。
- MySQL / PostgreSQL:服务型数据库(需要独立数据库服务)
- SQLite:嵌入式数据库(数据通常存为本地文件)
2.数据库(Database)
- 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。一个数据库里面可以包含多张数据表。
- 一个数据库服务中通常可以创建多个数据库。
- 可类比为 Excel 工作簿。
3.数据表(Table)
- 数据表是数据库中真正存放数据的结构,按“行 + 列”组织。
- 一个数据库里可以有多张表。
- 可类比为 Excel 工作表。
4.常见使用方式
- 通过 SQL 语句 操作(增删改查)
- 通过图形化工具操作,如:Navicat
Navicat Premium Lite (opens new window) 是 Navicat 的精简版,最多可使用5个Navicat Premium Lite免费用户账户,对于没有太高需求的用户来说可以使用它。
# MySQL
# docker-compose
services:
mysql:
image: mysql:latest
container_name: mysql
restart: always
ports:
- 3306:3306
volumes:
- ./log:/var/log/mysql # 映射日志目录
- ./data:/var/lib/mysql # 映射数据目录
environment:
- MYSQL_ROOT_PASSWORD=mysql123456 # root用户密码
- TZ=Asia/Shanghai # 设置容器时区,也可以挂载通过/etc/localtime:/etc/localtime:ro
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# 连接数据库
连接命令:mysql -u 用户名 -p -h 远程主机IP -P 端口号
注意:-p(小写)表示的是密码,-P(大写)表示的是端口
# 用默认root 用户连接
mysql -u root -p
# 连接 192.168.31.15 上端口为13306的 test_db 数据库,用户名 test_user
mysql -u test_user -p -h 192.168.31.15 -P 13306 -D test_db
1
2
3
4
5
6
2
3
4
5
6
连接类参数:用于指定连接的用户、主机、端口、密码等核心信息,是使用mysql命令的基础。
| 短参数 | 长参数 | 说明 | 示例 |
|---|---|---|---|
| -u | --user=用户名 | 指定连接MySQL的用户名 | mysql -u root mysql --user=root |
| -p | --password[=密码] | 指定密码(推荐不加密码,回车后输入更安全) | 安全写法回车输密码:mysql -u root -p 不推荐密码明文暴露: mysql -u root -p123456 |
| -h | --host=主机IP | 指定连接的 MySQL 服务器地址(本地默认 127.0.0.1) | 远程连接:mysql -u test -p -h 192.168.1.100 |
| -P | --port=端口号 | 指定 MySQL 服务的端口(默认3306) | 连接 3307 端口: mysql -u root -p -P 3307 |
| -D | --database=库名 | 连接后直接切换到指定数据库(无需再执行USE) | 连接后直接进入 test_db 库: mysql -u root -p -D test_db |
| --protocol=协议 | 指定连接协议(tcp/udp/socket 等) | 强制 TCP 连接: mysql -u root -p --protocol=tcp |
连接成功后的基础操作:
# 查看 MySQL 系统状态(版本、连接数等)
STATUS;
\s
# 查看当前 bind_address 配置,如果只为127.0.0.1表示仅允许本地回环连接,远程主机无法访问
SHOW VARIABLES LIKE 'bind_address';
# 查看当前连接的数据库,若返回 NULL,说明未选中任何库,需执行 USE 数据库名 切换
SELECT DATABASE();
# 列出所有用户
SELECT user, host FROM mysql.user;
# 列出所有数据库
SHOW DATABASES;
# 列出当前库的所有表
SHOW TABLES;
# 切换数据库
USE 库名;
\u 数据库名
# 查看表结构(字段 / 类型 / 约束)
DESC 表名;
DESCRIBE 表名;
# 退出 MySQL 交互界面
\q
exit
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
31
32
33
34
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
34

# PostgreSQL
# docker-compose
services:
pgsql:
image: postgres:17-alpine
container_name: pgsql
restart: unless-stopped
network_mode: bridge
ports:
- 5432:5432
volumes:
- ./data:/var/lib/postgresql/data
environment:
POSTGRES_USER: postgres # 默认管理员用户
POSTGRES_PASSWORD: postgres1234 # 默认管理员用户密码
POSTGRES_DB: postgres # 数据库名
POSTGRESQL_WAL_COMPRESSION: lz4 # WAL 日志的压缩方式设置为 lz4
POSTGRESQL_MAX_CONNECTIONS: 2048 # 数据库允许的最大连接数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# psql
psql 是 PostgreSQL(PG)官方自带的命令行交互式客户端工具。
常见参数:
| 参数 | 全称 | 作用 |
|---|---|---|
| -U <用户名> | User | 指定连接 PG 的用户名(默认系统当前用户名) |
| -h <地址> | Host | 指定 PG 服务器地址(默认 127.0.0.1) |
| -p <端口> | Port | 指定 PG 端口(默认 5432) |
| -d <库名> | Database | 指定要连接的数据库名,不指定会默认尝试连接和「当前登录用户名同名」的数据库 |
| -c | Command | 非交互执行指定 SQL 语句,执行后立即退出(适合脚本) |
| -f <文件> | File | 执行指定 SQL 文件中的所有语句(常用于导入备份、执行脚本) |
| -V | Version | 查看 psql 版本 |
# 连接数据库
连接命令:psql -U 用户名 -h 地址 -p 端口 -d 数据库名
# 用默认 postgres 用户连接默认 postgres 数据库
psql -U postgres
# 连接 192.168.31.15 上端口为15432的 newapi 数据库,用户名 postgres
psql -U postgres -h 192.168.31.15 -p 15432 -d newapi
1
2
3
4
5
2
3
4
5
连接成功后的基础操作:
# 查看当前连接的数据库
SELECT current_database();
# 列出所有用户
\du
SELECT usename FROM pg_user;
# 列出所有数据库
\l
SELECT datname FROM pg_database;
# 列出当前库的所有表
\dt
SELECT tablename FROM pg_tables;
# 切换数据库
\c 数据库名
# 查看表结构(字段 / 类型 / 约束)
\d 表名
# 退出 psql 交互界面
\q
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

# 创建数据库用户
创建名为 testdbuser 的数据库用户,并设置密码为 test888。
# 命令行模式(无需进入psql,直接在系统终端执行)
psql -U postgres -c 'CREATE USER testdbuser WITH LOGIN PASSWORD "test888";'
# psql交互模式
CREATE USER testdbuser WITH LOGIN PASSWORD 'test888';
1
2
3
4
5
2
3
4
5
# 创建数据库
创建名为 testdb、所有者为 testdbuser 的数据库。
# 命令行模式(无需进入psql,直接在系统终端执行)
psql -U postgres -c 'CREATE DATABASE testdb OWNER testdbuser;'
# psql交互模式
CREATE DATABASE testdb OWNER testdbuser;
1
2
3
4
5
2
3
4
5
# 数据导出
pg_dump:PostgreSQL 自带的备份工具,专门用来导出数据库的结构/数据。最小有效命令:pg_dump -U 用户名 -d 数据库名 -f 备份文件路径
# 导出所有数据库结构 + 数据
pg_dump -U postgres -d 库名 -f xxxx.sql
# 只导出数据
pg_dump -U postgres -d 库名 --data-only -f xxxx.sql
1
2
3
4
5
2
3
4
5
| 参数 | 作用 |
|---|---|
| -U | 指定数据库用户名 |
| -d | 指定数据库名,必填 |
| -f | 指定导出文件名 |
| -h | 指定数据库服务器地址(默认本地 127.0.0.1) |
| -p | 指定数据库端口(默认 5432),端口修改过必用 |
| -t | 表名。只导出指定单张表的结构 + 数据,避免全库导出) |
| -n | 模式名。导出指定 Schema(PG 的逻辑分组,默认 public)的内容 |
| -c | 导出的 SQL 中添加「先删除表 / 数据」的语句(导入时自动清理旧数据) |
| -C | 导出的 SQL 中添加「创建数据库」的语句(导入时无需提前建库) |
| -F c | 导出为二进制格式(比 SQL 小、导入更快,后缀建议 .dump) |
| --data-only | 只导出数据(不含结构) |
| --schema-only | 只导出表结构(不含数据) |
# 数据导入
注意:
- 只有用
pg_dump -F c/-F t/-F d导出的备份,才能用 pg_restore 恢复;纯 SQL 文件只能用 psql 导入;
- pg_restore是PostgreSQL 自带的恢复工具,专门用于恢复由 pg_dump 以「非纯文本格式」(如自定义格式、tar 格式、目录格式)导出的备份文件。
- 导入前需确保目标数据库已创建(比如
testdb需先执行psql -U admin -c "CREATE DATABASE testdb;");
# SQL 文件
psql -U admin -h 127.0.0.1 -p 5432 -d testdb -f /tmp/testdb_full.sql
# 导入二进制备份文件
pg_restore -U admin -d testdb -v /tmp/testdb.dump
1
2
3
4
5
6
2
3
4
5
6
# redis缓存
compose:
services:
redis:
image: redis:latest
container_name: redis
restart: always
ports:
- 6379:6379
volumes:
- ./data:/data
command: redis-server --appendonly yes --requirepass yourpassword
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
上次更新: 2026/03/14, 16:23:09