拉取镜像需要魔法,我通过 Win 主机拉取 MySQL 镜像,再上传到 Linux 虚拟机内;
我的 Linux 环境是通过 VMware Workstation 安装的 Rocky Linux 10 虚拟机;

  1. 拉取 mysql:latest 镜像,本文对应的版本是 mysql:9.4.0 ,执行命令,如下
docker pull mysql:latest
# 或指定具体版本号 9.4.0
# docker pull mysql:9.4.0

在这里插入图片描述
在这里插入图片描述

  1. 导出镜像,执行命令,如下
docker save mysql:latest > mysql_latest.tar
# linux 环境中如果有 gzip 命令,还可以执行以下命令进行压缩
# 注:mysql:9.4.0 镜像已经很小了,再进行压缩其实没太大必要,这里只是为了记录
# docker save mysql:latest | gzip > mysql_latest.tar.gz

在这里插入图片描述

  1. 上传到 Linux 虚拟机内 /opt/docker-temp,导入镜像,执行命令,如下
ll /opt/docker-temp
# /opt/docker-temp 目录不存在的话,则需要创建
# sudo mkdir /opt/docker-temp
# 如果操作用户是非 root 用户,则需要修改所有者
# sudo chown -R $USER:$USER
cd /opt/docker-temp
docker load < mysql_latest.tar

在这里插入图片描述

  1. 创建 /opt/mysql /opt/mysql/conf /opt/mysql/init 目录,用以放置 mysql 相关文件,执行命令,如下
sudo mkdir -p /opt/mysql
sudo mkdir -p /opt/mysql/conf
sudo mkdir -p /opt/mysql/init
sudo chown -R $USER:$USER /opt/mysql

在这里插入图片描述

  1. /opt/mysql/conf 目录下创建 my.cnf 文件,文件内容如下
    sudo vim /opt/mysql/conf/my.cnf
[mysqld]
# 基础运行配置
user=mysql
pid-file=/var/run/mysqld/mysqld.pid
socket=/var/run/mysqld/mysqld.sock
datadir=/var/lib/mysql
default_time_zone='+8:00'

# 网络与连接配置
port=3306
max_connections=200
max_connect_errors=10000

# 内存与缓存配置
tmp_table_size=32M
max_heap_table_size=32M
join_buffer_size=128M
sort_buffer_size=2M
read_buffer_size=1M
read_rnd_buffer_size=2M

# 存储引擎配置
default_storage_engine=InnoDB
innodb_buffer_pool_size=4G
innodb_buffer_pool_instances=4
innodb_read_io_threads=8
innodb_write_io_threads=8
innodb_purge_threads=4

# 字符集与校验
character_set_server=utf8mb4
collation_server=utf8mb4_unicode_ci

# 二进制日志配置
server-id=1
log_bin=/var/lib/mysql/mysql-bin
binlog_format=ROW
log_bin_trust_function_creators=1

# 安全与约束配置
lower_case_table_names=1
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
explicit_defaults_for_timestamp=ON

[client]
default_character_set=utf8mb4

  1. /opt 目录下创建 docker-compose.yaml 文件,添加 mysql 配置文件引入,文件内容如下
    sudo vim /opt/docker-compose.yaml
name: zhe

include:
  - /opt/mysql/mysql-compose.yaml

  1. /opt/mysql 目录下创建 mysql-compose.yaml 文件,添加 mysql 配置,文件内容如下
    sudo vim /opt/mysql/mysql-compose.yaml
services:
  mysql:
    image: mysql:latest
    container_name: mysql
    restart: on-failure:30
    privileged: true
    environment:
      - TZ=Asia/Shanghai
      - MYSQL_ROOT_PASSWORD=123456
    ports:
      - "3306:3306"
    volumes:
      - /opt/mysql/conf:/etc/mysql/conf.d
      - /opt/mysql/data:/var/lib/mysql
      - /opt/mysql/init:/docker-entrypoint-initdb.d

  1. /opt/opt/mysql 目录下,启动 mysql 容器,执行命令,如下
cd /opt
# 修改所属者
sudo chown -R $USER:$USER /opt/mysql
docker compose up -d mysql

在这里插入图片描述

  1. 查看 mysql 启动状态,执行命令,如下
docker ps

在这里插入图片描述

目录 /opt/mysql/init 是放置 MySQL 容器初始创建时需要初始化的操作,支持 .sh .sql .sql.gz 等文件,以 demo.sql 文件为示例

  1. 创建 /opt/mysql/init/demo.sql 文件,内容如下
    vim /opt/mysql/init/demo.sql
-- 创建数据库(如果不存在),使用 utf8mb4 字符集以支持中文和特殊字符
CREATE DATABASE IF NOT EXISTS zhe_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 创建用户并设置密码
CREATE USER IF NOT EXISTS 'zhe_user'@'%' IDENTIFIED BY '123456';

-- 授予用户对 zhe_db 数据库的所有权限
GRANT ALL PRIVILEGES ON zhe_db.* TO 'zhe_user'@'%';

-- 刷新权限使授权生效
FLUSH PRIVILEGES;

-- 切换到 zhe_db 数据库
USE zhe_db;

-- 创建 user 表
CREATE TABLE IF NOT EXISTS `user` (
    `id` INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户ID,主键',
    `name` VARCHAR(50) NOT NULL COMMENT '用户姓名',
    `gender` ENUM('M','F') COMMENT '性别:M-男,F-女',
    `age` INT UNSIGNED COMMENT '年龄',
    `mobile_number` VARCHAR(11) UNIQUE COMMENT '手机号码',
    `address` TEXT COMMENT '住址',
    `id_number` CHAR(18) UNIQUE COMMENT '身份证号码',
    `created_by` BIGINT UNSIGNED NOT NULL COMMENT '创建人用户ID',
    `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `updated_by` BIGINT UNSIGNED NOT NULL COMMENT '更新人用户ID',
    `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    `is_deleted` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '逻辑删除标记:0-未删除,1-已删除'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户信息表';

-- 初始化插入 1 条示例数据
INSERT INTO `user` (
    `id`,
    `name`,
    `gender`,
    `age`,
    `mobile_number`,
    `address`,
    `id_number`,
    `created_by`,
    `updated_by`
) VALUES (
     1001,
    '张三',
    'M',
    28,
    '13800138000',
    '北京市海淀区某某街道123号',
    '110101199501011234',
    0,
    0
);
  1. 停止 MySQL 容器,并删除数据目录,重新启动容器,执行命令,如下
cd /opt/mysql
docker compose stop mysql
sudo rm -rf data
docker compose up -d mysql

在这里插入图片描述

  1. 连接 MySQL,用户名/密码:zhe_user/123456,查询 user 表,如下

在这里插入图片描述

  1. 查询数据,执行 SQL 如下
SELECT * FROM user;

在这里插入图片描述

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐