当前位置:   article > 正文

Docker安装最新版MySQL5.7(mysql-5.7.40)教程(参考Docker Hub)_docker安装mysql5.7

docker安装mysql5.7

一、前言

  MySQL官方安装包下载地址:
  https://dev.mysql.com/downloads/mysql/

 
  Docker Hub官方网址:
  https://hub.docker.com/

 
  【MySQL系列安装部署教程】

写最好的Docker安装最新版MySQL8(mysql-8.0.31)教程(参考Docker Hub和MySQL官方文档)
 
最新MySQL-5.7.40在云服务器Centos7.9安装部署

 
  笔者参考了Docker Hub中关于MySQL官方教程文档去写最新 MySQL5.7 容器安装部署教程,在此之前笔者写过一篇博客【写最好的Docker安装最新版MySQL8(mysql-8.0.31)教程(参考Docker Hub和MySQL官方文档)】,那篇博客写的很详细,有兴趣的读者可以去阅读,文章被华为云开发者联盟社区收录了。
 
  本文由 @大白有点菜 原创,请勿盗用,转载请说明出处!如果觉得文章还不错,请点点赞,加关注,谢谢!
 

二、安装部署

 

1、在Docker Hub中搜索关键字“mysql”,查看MySQL的最新稳定版,包含MySQL8和MySQL5.7系列。对应的MySQL页面有教程,读者也可自行去看,但是不是很完整,笔者的教程参考官网且有改动。

(1)Docker Hub中搜索“mysql”。
 
Docker Hub中搜索“mysql”

 
(2)选择官方的“mysql”。页面是MySQL在Docker中的版本的相关介绍,这里有这么一个规律:5.7.40, 5.7, 5, 5.7.40-oracle, 5.7-oracle, 5-oracle 其实都是同一个版本,它们的镜像ID都是相同在页面中放在同一行展示的,都是同一个版本,笔者验证过。页面同时也有操作教程。
 
  Docker Hub中MySQL介绍:https://hub.docker.com/_/mysql
 
选择官方的“mysql”
 
MySQL在Docker中的版本的相关介绍

 
MySQL在Docker中的操作教程

 

2、切换到“Tags”页面,复制指定的MySQL版本拉取命令,例如 docker pull mysql:5.7

 
拉取MySQL5.7最新的版本
 

3、先创建三个目录,创建MySQL容器时会挂载为容器的卷(Volume),用于Docker和宿主机(Centos)之间共享文件,包括配置文件、数据文件和日志文件。

 
  什么是卷(Volume)?命令 docker -v 中的“-v”就是这个卷,“-v”只是“--volume”的简写。
 
  Docker官方文档解释的含义:https://docs.docker.com/storage/volumes/
 
使用 -p 创建多级目录,即 mydata 目录下创建 mysql 目录, mysql 目录下又创建 log 、data 、conf 三个目录:

mkdir -p /mydata/mysql/log
mkdir -p /mydata/mysql/data
mkdir -p /mydata/mysql/conf
  • 1
  • 2
  • 3

创建多级目录

 

4、拉取MySQL5.7镜像。
docker pull mysql:5.7
  • 1

拉取MySQL5.7镜像

 

5、创建容器:使用自定义的 custom.cnf 配置文件。

 
(1)在 /mydata/mysql/conf/ 目录下创建自定义的 custom.cnf 配置文件。文件名随意,文件格式必须为 .cnf

vim /mydata/mysql/conf/custom.cnf
  • 1

创建自定义的 custom.cnf 配置文件

 
  Docker Hub中的MySQL教程文档有说到,在 /etc/mysql/conf.d/ 目录下新建自定义的配置文件 xxx.cnf也会被读取到,而且还是优先读取的。
 
Docker Hub中MySQL使用自定义配置文件1

 
Docker Hub中MySQL使用自定义配置文件2

 
(2)添加容器运行的配置参数。使用的是 utf8mb4 编码而不是 utf8 编码

[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

[mysqld]
init_connect="SET collation_connection = utf8mb4_unicode_ci"
init_connect="SET NAMES utf8mb4"
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

添加容器运行的配置参数

 
(3)创建容器并运行。

docker run --name mysql -v /mydata/mysql/log:/var/log/mysql -v /mydata/mysql/data:/var/lib/mysql -v /mydata/mysql/conf:/etc/mysql/conf.d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
  • 1

创建MySQL5.7容器并运行
 

6、禁用 root 账户被外部工具连接。

 
  进入到容器里,连接mysql,删除mysql数据库user表中 user=“root”,host="%"的那条记录。因为这条数据会允许 root 账户被允许外部工具(如Navicat或SQLyog)连接,实际上,应该禁止这么做,正确做法是只允许 root 账户本地连接。如果想 root 账户继续被外部工具连接,那就把root密码设置得更复杂,过于简单不安全!
 
允许 root 账户被允许外部工具(如Navicat或SQLyog)连接
 
(1)进入到MySQL容器中并连接MySQL服务器。

docker exec -it fd4 /bin/bash
  • 1
mysql -u root -p123456
  • 1

进入到MySQL容器中并连接MySQL服务器

 
(2)切换到 mysql 数据库,并查看 user 表。

use mysql;
  • 1
select user,host from user;
  • 1

请添加图片描述

 
(3)删除mysql数据库user表中 user=“root”,host="%"的那条记录,并刷新权限。

delete user from mysql.user where user='root' and host='%';
  • 1
flush privileges;
  • 1

删除mysql数据库user表中 user="root",host="%"的那条记录,并刷新权限
 
(4)再测试连接,发现连接失败。
 
禁止 root 账户被允许外部工具(如Navicat或SQLyog)连接
 

7、创建新账户供外部工具连接。可参考文章【如何优雅地创建MySQL账户供外部工具连接】。

(1)使用 CREATE 创建账户,例如对应mysql.user表中,字段user为 dbydc ,字段host为 % ,账号密码为 123456 ,“%”代表任何主机。使用 GRANT 授予账户特定权限
 
  1)创建用户和密码

CREATE USER 'dbydc'@'%' IDENTIFIED BY '123456';
  • 1

create user 'dbydc'@'%' identified by '123456';
  • 1

  2)授予账户特定权限。ALL 和 ALL PRIVILEGES 是一样的,可简写为 ALL

GRANT ALL ON *.* TO 'dbydc'@'%' WITH GRANT OPTION;
  • 1

grant all on *.* to 'dbydc'@'%' with grant option;
  • 1

 
(2)刷新账号权限。

FLUSH PRIVILEGES;
  • 1

flush privileges;
  • 1

 
(3)使用Navicat工具测试连接,账户“dbydc”是正常连接的。
 
使用Navicat工具测试连接,账户“dbydc”是正常连接的
 

8、设置容器自启动。
docker update --restart=always mysql
  • 1

设置容器自启动

 

9、容器的启动、停止、删除、重新启动、查看运行状态。

(1)启动容器

docker start mysql
  • 1

docker start 容器ID
  • 1

(2)停止容器

docker stop mysql
  • 1

docker stop 容器ID
  • 1

(3)删除容器

docker rm mysql
  • 1

docker rm 容器ID
  • 1

(4)重新启动容器

docker restart mysql
  • 1

docker restart 容器ID
  • 1

(5)查看容器运行状态
 
查看所有容器的运行状态,包括运行的和停止的

docker ps -a
  • 1

查看所有运行中的容器的状态,不包括停止的

docker ps
  • 1

 

10、创建数据库并验证功能。

(1)创建 dbydc1 数据库,数据表为 tb_account 和 tb_user。

/*
 Navicat Premium Data Transfer

 Source Server         : Docker-MySQL5.7-192.168.52.136
 Source Server Type    : MySQL
 Source Server Version : 50740
 Source Host           : 192.168.52.136:3306
 Source Schema         : dbydc1

 Target Server Type    : MySQL
 Target Server Version : 50740
 File Encoding         : 65001

 Date: 10/12/2022 13:08:57
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for tb_account
-- ----------------------------
DROP TABLE IF EXISTS `tb_account`;
CREATE TABLE `tb_account`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '账户名称',
  `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '密码',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;

-- ----------------------------
-- Records of tb_account
-- ----------------------------
INSERT INTO `tb_account` VALUES (1, 'dbydc', '123456');
INSERT INTO `tb_account` VALUES (2, 'jmx', '654321');

-- ----------------------------
-- Table structure for tb_user
-- ----------------------------
DROP TABLE IF EXISTS `tb_user`;
CREATE TABLE `tb_user`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '姓名',
  `age` int(11) NULL DEFAULT NULL COMMENT '年龄',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;

-- ----------------------------
-- Records of tb_user
-- ----------------------------
INSERT INTO `tb_user` VALUES (1, '大白有点菜', 18);
INSERT INTO `tb_user` VALUES (2, 'CSDN新人', 20);
INSERT INTO `tb_user` VALUES (3, '君莫笑', 30);

SET FOREIGN_KEY_CHECKS = 1;
  • 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
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55

 
(2)创建 dbydc2 数据库,数据表为 tb_user。

/*
 Navicat Premium Data Transfer

 Source Server         : Docker-MySQL5.7-192.168.52.136
 Source Server Type    : MySQL
 Source Server Version : 50740
 Source Host           : 192.168.52.136:3306
 Source Schema         : dbydc2

 Target Server Type    : MySQL
 Target Server Version : 50740
 File Encoding         : 65001

 Date: 10/12/2022 13:26:03
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for tb_user
-- ----------------------------
DROP TABLE IF EXISTS `tb_user`;
CREATE TABLE `tb_user`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '姓名',
  `age` int(11) NULL DEFAULT NULL COMMENT '年龄',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;

-- ----------------------------
-- Records of tb_user
-- ----------------------------
INSERT INTO `tb_user` VALUES (1, '大白有点菜666', 20);
INSERT INTO `tb_user` VALUES (2, 'CSDN新人777', 25);
INSERT INTO `tb_user` VALUES (3, '君莫笑888', 26);

SET FOREIGN_KEY_CHECKS = 1;
  • 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
  • 35
  • 36
  • 37
  • 38

 
(3)在不进入容器的情况下查询数据库的表数据。
 
  通过 shell 方式运行mysql,-e 参数后面加上要执行的指令,等同于mysql连接后输入的指令一样。此处先切换到 dbydc1 数据库,再查询 tb_account 和 tb_user 两个数据表的所有数据。

docker exec -i mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e "use dbydc1;" -e "select * from tb_account;" -e "select * from tb_user;"'
  • 1

在不进入容器的情况下查询数据库dbydc1的表数据1
 
  还有另外一种写法,就是不用执行 “use dbydc1;”这条指令去切换数据库,直接在 “select * from tb_account;” 后面加 dbydc1 数据库即可。

docker exec -i mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e "select * from tb_account;" dbydc1 -e "select * from tb_user;"'
  • 1

在不进入容器的情况下查询数据库dbydc1的表数据2
 
  插入数据的语法是怎么写的呢?SQL语句 insert into tb_user(name,age) values("西门吃鸡", 36); 中有双引号,需要使用斜杠“\”来转义

docker exec -i mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e "use dbydc1;" -e "insert into tb_user(name,age) values(\"西门吃鸡\", 36);" -e "select * from tb_user;"'
  • 1

插入数据
 

13、MySQL数据库备份。

 
  MySQL官方文档备份数据库:
  https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html#option_mysqldump_databases

 
(1)创建数据备份目录 db_backup

mkdir -p /mydata/db_backup
  • 1

(2)备份所有数据库。参数 --all-databases 代表所有数据库。备份sql文件名称随意,如 all-databases.sql

docker exec mysql sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > /mydata/db_backup/all-databases.sql
  • 1

(3)同时备份多个指定的数据库。参数 --databases 后面可以指定数据库名称,支持1个或以上。备份sql文件名称随意,如 multi-databases.sql

docker exec mysql sh -c 'exec mysqldump --databases dbydc1 dbydc2 -uroot -p"$MYSQL_ROOT_PASSWORD"' > /mydata/db_backup/multi-databases.sql
  • 1

(4)备份一个数据库。这里有两种方式,但是,只有加了参数 --databases 才能被正确地还原!
  1)有参数 --databases ,可以被还原,最好使用这种方式。

docker exec mysql sh -c 'exec mysqldump --databases dbydc1 -uroot -p"$MYSQL_ROOT_PASSWORD"' > /mydata/db_backup/dbydc1.sql
  • 1

  2)无参数 --databases ,不能被还原,不要使用这种方式。MySQL官网有写到可以这么做,但是经过笔者验证和查询官网资料,这方式无法达到还原效果。笔者的专业技能有限,可能是支持还原的,但暂时写不出来这样的指令。

docker exec mysql sh -c 'exec mysqldump dbydc1 -uroot -p"$MYSQL_ROOT_PASSWORD"' > /mydata/db_backup/dbydc1.sql
  • 1

(5)笔者试过以下的指令去还原数据,但是发现,根本行不通:

docker exec -i mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e "use dbydc1;"' < /mydata/db_backup/dbydc1.sql
  • 1

(6)备份指定的数据表。这种方式笔者验证过,无法还原。

docker exec mysql sh -c 'exec mysqldump dbydc1 tb_user -uroot -p"$MYSQL_ROOT_PASSWORD"' > /mydata/db_backup/tb_user.sql
  • 1

 

14、MySQL数据库还原。

(1)还原所有数据库。

docker exec -i mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"' < /mydata/db_backup/all-databases.sql
  • 1

(2)还原集合的数据库。

docker exec -i mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"' < /mydata/db_backup/multi-databases.sql
  • 1

(3)还原一个数据库。这里注意,必须是前面加了 --databases 参数 mysqldump 出来的sql文件才会被正常还原!其实呢,使用 mysql 客户端方式去还原sql文件,sql文件中必须要有 CREATE DATABASEUSE 这两个语句,只有加了参数 --all-databases--databases 的才会正常被加载。

docker exec -i mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"' < /mydata/db_backup/dbydc1.sql
  • 1

 
  【MySQL官方加载备份的sql格式文件说明文档】:
  https://dev.mysql.com/doc/refman/5.7/en/reloading-sql-format-dumps.html

 
加载备份的sql格式文件1
 
加载备份的sql格式文件2
 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/689429
推荐阅读
相关标签
  

闽ICP备14008679号