【AI 总结】Use containerized databases
Use containerized databases | AI 总结
运行本地容器化数据库
主流数据库(如 MySQL、PostgreSQL、MongoDB)均有 Docker 官方镜像,可在 Docker Hub 搜索获取,镜像页面包含详细配置说明(以 MySQL 镜像为例)。支持通过 CLI 或 Docker Desktop GUI 两种方式运行容器:
- CLI 方式:执行命令 各参数含义如下:
1
docker run --name my-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -e MYSQL_DATABASE=mydb -d mysql:latest--name my-mysql:为容器命名,便于后续引用;-e MYSQL_ROOT_PASSWORD=my-secret-pw:设置 MySQL 根密码,需替换为安全密码;-e MYSQL_DATABASE=mydb:(可选)创建指定名称的数据库,可自定义数据库名;-d:以分离模式运行容器,即后台运行;mysql:latest:指定使用最新版本的 MySQL 镜像。
- GUI 方式:在 Docker Desktop 仪表盘全局搜索 “mysql”,选中镜像后点击 “Run”,在 “Run a new container” 弹窗中展开 “Optional settings”,配置容器名(my-mysql)、环境变量(MYSQL_ROOT_PASSWORD、MYSQL_DATABASE),最后点击 “Run”。
- 验证容器运行状态:执行
docker ps(CLI)或在 Docker Desktop “Container” 视图(GUI)查看。
访问容器化数据库的 Shell
需先确保数据库容器已运行,可通过 CLI 或 GUI 访问 Shell,用于管理数据库、执行命令等:
- CLI 方式:执行
docker exec -it my-mysql bash,-it保证终端可交互,my-mysql为容器名,bash表示在容器内打开 bash shell,执行exit可返回本地终端。 - GUI 方式:在 Docker Desktop “Containers” 视图,找到目标容器,在 “Actions” 列选择 “Show container actions”,再点击 “Open in terminal”。
- 示例操作:进入 Shell 后,可执行
mysql -u root -p,输入密码后通过SHOW DATABASES;查看数据库列表。
从主机连接容器化数据库
需将容器内端口映射到主机端口,以 MySQL 默认端口 3306 为例,步骤如下:
- 清理旧容器:先停止并删除之前运行的容器,CLI 执行
docker rm --force my-mysql,或在 GUI “Containers” 视图点击 “Delete” 图标。 - 运行带端口映射的容器:
- CLI 方式:执行
1
docker run -p 3307:3306 --name my-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -e MYSQL_DATABASE=mydb -d mysql:latest-p 3307:3306表示将主机 3307 端口映射到容器 3306 端口; - GUI 方式:运行容器时在 “Optional settings” 中设置 “Host port”(3307,对应容器 3306/tcp 端口),其他配置同前。
- CLI 方式:执行
- 验证与连接:CLI 执行
docker ps或在 GUI“Port (s)” 列查看端口映射,主机上的应用可通过localhost:3307访问容器内 MySQL 服务。
从另一个容器连接容器化数据库
通过 Docker 网络实现容器间通信,无需将数据库暴露到主机网络,步骤如下:
- 清理旧容器:同 “从主机连接” 步骤 1。
- 创建并使用 Docker 网络:
- 执行
docker network create my-network创建名为 “my-network” 的网络; - 运行数据库容器并指定网络:
1
docker run --name my-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -e MYSQL_DATABASE=mydb --network my-network -d mysql:latest - 运行其他容器(以 phpMyAdmin 为例)并指定同一网络:
1
docker run --name my-phpmyadmin -d --network my-network -p 8080:80 -e PMA_HOST=my-mysql phpmyadmin-p 8080:80用于主机访问该容器,PMA_HOST=my-mysql指定数据库容器名。
- 执行
- 验证通信:访问
http://localhost:8080,用 “root” 和 “my-secret-pw” 登录 phpMyAdmin,查看是否能连接到 MySQL 并显示数据库。同一网络(my-network)内的应用可通过my-mysql:3306访问数据库服务。
在卷中持久化数据库数据
通过 Docker 卷存储数据库文件,确保数据在容器重启、删除后不丢失,步骤如下:
- 清理旧容器:同前。
- 运行带卷挂载的容器并验证数据持久化:
- CLI 方式:
- 运行容器:
1
docker run --name my-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -e MYSQL_DATABASE=mydb -v my-db-volume:/var/lib/mysql -d mysql:latest-v my-db-volume:/var/lib/mysql表示将 “my-db-volume” 卷挂载到容器/var/lib/mysql目录(MySQL 数据存储路径),卷不存在时 Docker 会自动创建; - 创建测试数据:
1
docker exec my-mysql mysql -u root -pmy-secret-pw -e "CREATE TABLE IF NOT EXISTS mydb.mytable (column_name VARCHAR(255)); INSERT INTO mydb.mytable (column_name) VALUES ('value');" - 删除旧容器:
1
docker rm --force my-mysql - 启动新容器并挂载同一卷: (无需重复设置环境变量,配置已保存在卷中);
1
docker run --name my-mysql -v my-db-volume:/var/lib/mysql -d mysql:latest - 验证数据: 应能看到之前插入的数据。
1
docker exec my-mysql mysql -u root -pmy-secret-pw -e "SELECT * FROM mydb.mytable;"
- 运行容器:
- GUI 方式:运行容器时在 “Optional settings” 中添加 “Volumes”(
my-db-volume映射到/var/lib/mysql),后续创建数据、删除容器、重新运行容器并验证数据的操作,通过 GUI 终端和 “Containers” 视图完成,逻辑与 CLI 一致。
- CLI 方式:
构建自定义数据库镜像
可自定义镜像以包含额外配置、脚本或工具,示例为构建含表初始化脚本的 MySQL 镜像:
- 清理旧容器:同前。
- 构建与运行自定义镜像:
- 创建 Dockerfile:在项目目录新建
Dockerfile,内容为其中1
2
3
4# syntax=docker/dockerfile:1
FROM mysql:latest
ENV MYSQL_DATABASE mydb
COPY ./scripts/ /docker-entrypoint-initdb.d/COPY指令将主机./scripts/目录下的文件(.sh、.sql、.sql.gz格式)复制到容器/docker-entrypoint-initdb.d/目录,容器首次启动时会执行这些脚本; - 创建初始化脚本:在
Dockerfile所在目录新建scripts子目录,创建create_table.sql,内容为最终目录结构为1
2
3
4CREATE TABLE IF NOT EXISTS mydb.myothertable (
column_name VARCHAR(255)
);
INSERT INTO mydb.myothertable (column_name) VALUES ('other_value');your-project-directory/下含scripts/(内有create_table.sql)和Dockerfile; - 构建镜像:在终端进入
Dockerfile所在目录,执行1
docker build -t my-custom-mysql .-t my-custom-mysql为镜像命名,.指定构建上下文为当前目录; - 运行自定义镜像: (无需重复设置
1
docker run --name my-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d my-custom-mysqlMYSQL_DATABASE,已在 Dockerfile 中定义); - 验证:执行
docker ps确认容器运行,再通过查看初始化脚本是否生效。1
docker exec my-mysql mysql -u root -pmy-secret-pw -e "SELECT * FROM mydb.myothertable;"
- 创建 Dockerfile:在项目目录新建
使用 Docker Compose 运行数据库
Docker Compose 可一键配置、管理多容器应用,示例为同时运行 MySQL 和 phpMyAdmin 容器:
- 创建 Compose 文件:在项目目录新建
compose.yaml,内容为其中1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22services:
db:
image: mysql:latest
environment:
MYSQL_ROOT_PASSWORD: my-secret-pw
MYSQL_DATABASE: mydb
ports:
- 3307:3306
volumes:
- my-db-volume:/var/lib/mysql
phpmyadmin:
image: phpmyadmin/phpmyadmin:latest
environment:
PMA_HOST: db
PMA_PORT: 3306
MYSQL_ROOT_PASSWORD: my-secret-pw
ports:
- 8080:80
depends_on:
- db
volumes:
my-db-volume:db服务为 MySQL 数据库,配置镜像、环境变量、端口映射(主机 3307: 容器 3306)和卷挂载;phpmyadmin服务依赖db服务,通过PMA_HOST: db(服务名)连接数据库,depends_on确保db服务先启动;volumes定义my-db-volume卷。 - 运行与管理 Compose 应用:
- 进入
compose.yaml所在目录,执行docker compose up启动服务; - 访问
http://localhost:8080,用 “root” 和 “my-secret-pw” 登录 phpMyAdmin 操作数据库; - 按
ctrl + c停止容器。
- 进入
【AI 总结】Use containerized databases
https://blog.lllllan.cn/docker/image/database/