如何在CentOS上构建MySQL的docker镜像
前言
本文以构建MySQL5.7.35版本为例
1. 编写Dockerfile
# 使用官方 MySQL 5.7 镜像作为基础镜像
FROM mysql:5.7.35
# 设置 MySQL 环境变量
ENV MYSQL_ROOT_PASSWORD=P@ssw0rd
ENV MYSQL_DATABASE=cargodb
ENV MYSQL_USER=user
ENV MYSQL_PASSWORD=P@ssw0rd
# 复制自定义的初始化 SQL 脚本到容器中
COPY init.sql /docker-entrypoint-initdb.d/
# 暴露 MySQL 服务的端口
EXPOSE 3306
上述 Dockerfile 使用官方 MySQL 5.7.35 镜像作为基础,设置了一些环境变量,包括 root 用户的密码、数据库名、以及新建的用户和密码。它还将一个自定义的初始化 SQL 脚本 init.sql 复制到容器的 /docker-entrypoint-initdb.d/ 目录中,以在容器启动时执行
2.创建初始化 SQL 脚本
在你的项目目录下创建一个 init.sql 文件,用于定义初始化数据库的 SQL 语句。这里是一个简单的例子:
DROP TABLE IF EXISTS `admin`;
CREATE TABLE `admin` (
`id` int(0) NOT NULL AUTO_INCREMENT COMMENT '编号',
`admin_name` varchar(25) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL COMMENT '账户名',
`admin_nickname` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT '' COMMENT '昵称',
`admin_password` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL COMMENT '密码',
`admin_profile_picture_src` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '头像地址',
`del` tinyint(1) NULL DEFAULT 0 COMMENT '删除标识(1删除 0未删除)',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci COMMENT = '管理员' ROW_FORMAT = Dynamic;
INSERT INTO `admin` VALUES (1, 'admin', 'admin', '123456', '86ed0506-be90-4808-89da-3b169973249a.jpg', 0);
因此在此容器运行后会自动创建好user用户,cargodb,并执行init.sql
3.构建 Docker 镜像
在包含 Dockerfile 和 init.sql 文件的目录下执行以下命令:
docker build -t mysql-5.7:5.7 .
此命令会根据Dockerfile文件生成一个name为mysql-5.7的image
4.运行 MySQL Docker 容器
执行如下命令:
docker run -d -p 3306:3306 --name mysql-5.7 -v /mysql:/var/lib/mysql mysql-5.7:5.7
解释一下上述命令:
- -d: 让容器在后台运行。
- -p 3306:3306: 映射容器的 MySQL 端口到主机的 3306 端口。
- –name mysql-5.7: 指定容器的名称为 mysql-5.7。
- -v /mysql:/var/lib/mysql: 挂载主机上的 /mysq目录到容器中的 /var/lib/mysql 目录。这是 MySQL 数据目录的默认位置。
注意:执行此命令时确保iptables(firewalld)正常运行,否则可能会报错;
可以使用工具连接数据库,可以看到库和表都已经创建好了
同时/mysql目录下也有了MySQL的文件
注意:mysql挂载的目录不能有其他文件,否则会报以下错误
5.导出MySQL Docker镜像
执行命令以下命令,会保存一个tar文件
docker save -o mysql-5.7.tar mysql-5.7:5.7
6.导入 MySQL 镜像
执行命令:
docker load -i mysql-5.7.tar
7.在目标主机上运行 MySQL 容器
执行命令:
docker run -d -p 3306:3307 --name mysql-5.7 -v /mysql:/var/lib/mysql mysql-5.7:5.7
注意:此处是暴露宿主机的3307端口