一、前言

  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”。
 

(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
 

 

2、切换到“Tags”页面,复制指定的MySQL版本拉取命令,例如 docker pull mysql:5.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

4、拉取MySQL5.7镜像。

docker pull mysql:5.7

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

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

vim /mydata/mysql/conf/custom.cnf

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

(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

(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

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

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

 
(1)进入到MySQL容器中并连接MySQL服务器。

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

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

use mysql;
select user,host from user;

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

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


 
(4)再测试连接,发现连接失败。
 

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

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

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

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

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

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

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

(2)刷新账号权限。

FLUSH PRIVILEGES;

flush privileges;

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

8、设置容器自启动。

docker update --restart=always mysql

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

(1)启动容器

docker start mysql

docker start 容器ID

(2)停止容器

docker stop mysql

docker stop 容器ID

(3)删除容器

docker rm mysql

docker rm 容器ID

(4)重新启动容器

docker restart mysql

docker restart 容器ID

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

docker ps -a

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

docker ps

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

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

/*Navicat Premium Data TransferSource Server         : Docker-MySQL5.7-192.168.52.136Source Server Type    : MySQLSource Server Version : 50740Source Host           : 192.168.52.136:3306Source Schema         : dbydc1Target Server Type    : MySQLTarget Server Version : 50740File Encoding         : 65001Date: 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;

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

/*Navicat Premium Data TransferSource Server         : Docker-MySQL5.7-192.168.52.136Source Server Type    : MySQLSource Server Version : 50740Source Host           : 192.168.52.136:3306Source Schema         : dbydc2Target Server Type    : MySQLTarget Server Version : 50740File Encoding         : 65001Date: 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;

(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;"'


 
  还有另外一种写法,就是不用执行 “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;"'


 
  插入数据的语法是怎么写的呢?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;"'

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

(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

(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

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

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

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

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

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

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

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

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

14、MySQL数据库还原。

(1)还原所有数据库。

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

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

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

(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

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

 

 

Docker安装最新版MySQL5.7(mysql-5.7.40)教程(参考Docker Hub)相关推荐

  1. 写最好的Docker安装最新版MySQL8(mysql-8.0.31)教程(参考Docker Hub和MySQL官方文档)

    一.前言   MySQL官方安装包下载地址:   https://dev.mysql.com/downloads/mysql/     Docker Hub官方网址:   https://hub.do ...

  2. 史上最详细Docker安装最新版Minio 带详解 绝对值得收藏!!! 让我们一起学会使用minio搭建属于自己的文件服务器!!走上白嫖之路!解决启动了但是浏览器访问不了的原因

    让我们一起学会使用minio搭建属于自己的文件服务器!!走上白嫖之路! WARNING: Console endpoint is listening on a dynamic port (34451) ...

  3. 搭建阿里云Linux版服务器+使用docker安装EMQ、Node-RED、MySQL+本地Navicat访问数据库(增删改查)——详细流程

    搭建阿里云Linux版服务器+使用docker安装EMQ.Node-RED.MySQL+本地Navicat访问数据库 云服务器基础搭建 注册云服务器 XShell简介 部署EMQ 部署docker 物 ...

  4. Docker 安装最新版禅道16.5版本 原创

    Docker 安装最新版禅道16.5版本 原创 1下载禅道 2运行镜像 3.查看启动日志,可以看到启动成功: 下载禅道 docker pull idoop/zentao; 2.运行镜像 docker ...

  5. 使用docker安装mysql8及mysql5.7

    使用系统:centos7.6 1.安装命令 1.1安装mysql8 mkdir -p /usr/local/mysql/conf.d mkdir -p /usr/local/mysql/logs mk ...

  6. 搭建宝塔面板 安装docker 安装青龙面板及xdd-plus机器人 对接诺兰等教程

    一 .宝塔安装 yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0. ...

  7. Linux / Windows系统中安装最新版 ElasticSearch (es)搜索引擎 超详细图文教程【一看就懂】

    "You Know, for Search"  相信来到这里的朋友们已经对ElasticSearch(es)有了一个大致的了解.关于Elasticsearch的介绍就不在此做过多赘 ...

  8. 安装新版的winetricks_Wine安装最新版QQ(8.9.2)的简单教程

    本教程为本人在看了许多前辈有关WineQQ的文章后整理出来的,只保留最必须的步骤,略去多余步骤. 到目前为止,关于WineQQ的安装的文章我已经写了3篇了,分别是ukylin论坛中的WineQQ7.8 ...

  9. Docker安装最新版ES8.4.1

    最近在看谷粒商城视频,昨天用docker搭建最新的es8.4.1遇到了许多问题,记录下. 1.拉取最新ES镜像 docker pull elasticsearch:8.4.1 2.创建宿主机文件夹与d ...

  10. docker安装最新版Jenkins:拉取镜像/创建容器

    拉取最新版Jenkins镜像: 创建Jenkins容器: 需要进入到容器内部获取初始化密码:

最新文章

  1. 开发过程中快速抓包并解析
  2. android 属性动画失败,AndroidAnimationExercise
  3. JZOJ 5281. 【NOIP提高组模拟A组8.15】钦点
  4. 牛津大学231页博士论文全面阐述神经微分方程(NDE),Jeff Dean点赞
  5. [svc]cfssl模拟https站点-探究浏览器如何校验证书
  6. Java枚举根据key获取value
  7. java 所有子类_java 查找类的所有子类
  8. php标准库string,PHP中的一些标准库
  9. 电脑网络基础知识:ipconfig/all命令及nslookupDns查询命令
  10. python数据挖掘笔记】二十.KNN最近邻分类算法分析详解及平衡秤TXT数据集读取
  11. 华为鸿蒙系统深度体验报告,堪比苹果IOS的存在!
  12. 全职宝妈做自媒体怎么样
  13. 奇安信代码安全实验室招贤纳士
  14. spring源码:循环依赖源码学习
  15. CUDA编程入门极简教程
  16. 死亡之ping (ping of death)
  17. 关闭apache自动目录列表功能的三种方法
  18. 【反欺诈场景剖析】虚假账号的产生和流转
  19. 用winpcap实现局域网DNS欺骗之一(基础知识)
  20. Fate原理(面试必备)

热门文章

  1. 微博遭鹿晗恋情暴击瘫痪,如何把微博服务器搞炸的?
  2. linux下好用的python编辑器_分享|Linux上几款好用的字幕编辑器
  3. 很老很老的老偏方,小病一扫光
  4. python 白色怎么表示_在numpy中创建“白色”图像(2D图像)
  5. css实现遮罩层动画
  6. 华为交换机SNMPv2配置步骤
  7. Personalized Defect Prediction
  8. wifi自动连接,断开连接,打开和关闭,亲测有效
  9. 使用屏幕录制专家--录制视频技巧
  10. 2019大数据未来七大发展方向