一、前言
??MySQL官方安裝包下載地址:
??https://dev.mysql.com/downloads/mysql/
?
??Docker Hub官方網(wǎng)址:
??https://hub.docker.com/
?
??【MySQL系列安裝部署教程】
寫最好的Docker安裝最新版MySQL8(mysql-8.0.31)教程(參考Docker Hub和MySQL官方文檔)
?
最新MySQL-5.7.40在云服務(wù)器Centos7.9安裝部署
?
??筆者參考了Docker Hub中關(guān)于MySQL官方教程文檔去寫最新 MySQL5.7
容器安裝部署教程,在此之前筆者寫過一篇博客【寫最好的Docker安裝最新版MySQL8(mysql-8.0.31)教程(參考Docker Hub和MySQL官方文檔)】,那篇博客寫的很詳細,有興趣的讀者可以去閱讀,文章被華為云開發(fā)者聯(lián)盟社區(qū)收錄了。
?
??本文由 @大白有點菜 原創(chuàng),請勿盜用,轉(zhuǎn)載請說明出處!如果覺得文章還不錯,請點點贊,加關(guān)注,謝謝!
?
二、安裝部署
?
1、在Docker Hub中搜索關(guān)鍵字“mysql”,查看MySQL的最新穩(wěn)定版,包含MySQL8和MySQL5.7系列。對應(yīng)的MySQL頁面有教程,讀者也可自行去看,但是不是很完整,筆者的教程參考官網(wǎng)且有改動。
(1)Docker Hub中搜索“mysql”。
?
?
(2)選擇官方的“mysql”。頁面是MySQL在Docker中的版本的相關(guān)介紹,這里有這么一個規(guī)律: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、先創(chuàng)建三個目錄,創(chuàng)建MySQL容器時會掛載為容器的卷(Volume),用于Docker和宿主機(Centos)之間共享文件,包括配置文件、數(shù)據(jù)文件和日志文件。
?
??什么是卷(Volume)?命令 docker -v
中的“-v
”就是這個卷,“-v
”只是“--volume
”的簡寫。
?
??Docker官方文檔解釋卷
的含義:https://docs.docker.com/storage/volumes/
?
使用 -p
創(chuàng)建多級目錄,即 mydata
目錄下創(chuàng)建 mysql
目錄, mysql 目錄下又創(chuàng)建 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、創(chuàng)建容器
:使用自定義的 custom.cnf 配置文件。
?
(1)在 /mydata/mysql/conf/
目錄下創(chuàng)建自定義的 custom.cnf
配置文件。文件名隨意,文件格式必須為 .cnf
。
vim /mydata/mysql/conf/custom.cnf
?
??Docker Hub中的MySQL教程文檔有說到,在 /etc/mysql/conf.d/ 目錄下新建自定義的配置文件 xxx.cnf
也會被讀取到,而且還是優(yōu)先讀取
的。
?
?
?
(2)添加容器運行的配置參數(shù)。使用的是 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)創(chuàng)建容器并運行。
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數(shù)據(jù)庫user表中 user=“root”,host="%"的那條記錄。因為這條數(shù)據(jù)會允許 root 賬戶被允許外部工具(如Navicat或SQLyog)連接,實際上,應(yīng)該禁止這么做,正確做法是只允許 root 賬戶本地連接。如果想 root 賬戶繼續(xù)被外部工具連接,那就把root密碼設(shè)置得更復雜,過于簡單不安全!
?
?
(1)進入到MySQL容器中并連接MySQL服務(wù)器。
docker exec -it fd4 /bin/bash
mysql -u root -p123456
?
(2)切換到 mysql 數(shù)據(jù)庫,并查看 user 表。
use mysql;
select user,host from user;
?
(3)刪除mysql數(shù)據(jù)庫user表中 user=“root”,host="%"的那條記錄,并刷新權(quán)限。
delete user from mysql.user where user='root' and host='%';
flush privileges;
?
(4)再測試連接,發(fā)現(xiàn)連接失敗。
?
?
7、創(chuàng)建新賬戶供外部工具連接。可參考文章【如何優(yōu)雅地創(chuàng)建MySQL賬戶供外部工具連接】。
(1)使用 CREATE 創(chuàng)建賬戶
,例如對應(yīng)mysql.user
表中,字段user
為 dbydc ,字段host
為 % ,賬號密碼
為 123456 ,“%
”代表任何主機。使用 GRANT 授予賬戶特定權(quán)限
。
?
??1)創(chuàng)建用戶和密碼
CREATE USER 'dbydc'@'%' IDENTIFIED BY '123456';
或
create user 'dbydc'@'%' identified by '123456';
??2)授予賬戶特定權(quán)限。ALL 和 ALL PRIVILEGES 是一樣的
,可簡寫為 ALL
。
GRANT ALL ON *.* TO 'dbydc'@'%' WITH GRANT OPTION;
或
grant all on *.* to 'dbydc'@'%' with grant option;
?
(2)刷新賬號權(quán)限。
FLUSH PRIVILEGES;
或
flush privileges;
?
(3)使用Navicat工具測試連接,賬戶“dbydc”是正常連接的。
?
?
8、設(shè)置容器自啟動。
docker update --restart=always mysql
?
9、容器的啟動、停止、刪除、重新啟動、查看運行狀態(tài)。
(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)查看容器運行狀態(tài)
?
查看所有容器的運行狀態(tài),包括運行的和停止的
:
docker ps -a
查看所有運行中的容器的狀態(tài),不包括停止的
:
docker ps
?
10、創(chuàng)建數(shù)據(jù)庫并驗證功能。
(1)創(chuàng)建 dbydc1 數(shù)據(jù)庫,數(shù)據(jù)表為 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;
?
(2)創(chuàng)建 dbydc2 數(shù)據(jù)庫,數(shù)據(jù)表為 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;
?
(3)在不進入容器的情況下查詢數(shù)據(jù)庫的表數(shù)據(jù)。
?
??通過 shell 方式運行mysql,-e 參數(shù)后面加上要執(zhí)行的指令,等同于mysql連接后輸入的指令一樣。此處先切換到 dbydc1 數(shù)據(jù)庫,再查詢 tb_account 和 tb_user 兩個數(shù)據(jù)表的所有數(shù)據(jù)。
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;"'
?
??還有另外一種寫法,就是不用執(zhí)行 “use dbydc1;”這條指令去切換數(shù)據(jù)庫,直接在 “select * from tb_account;” 后面加 dbydc1 數(shù)據(jù)庫即可。
docker exec -i mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e "select * from tb_account;" dbydc1 -e "select * from tb_user;"'
?
??插入數(shù)據(jù)的語法是怎么寫的呢?SQL語句 insert into tb_user(name,age) values("西門吃雞", 36);
中有雙引號,需要使用斜杠“\
”來轉(zhuǎn)義
。
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數(shù)據(jù)庫備份。
?
??MySQL官方文檔備份數(shù)據(jù)庫:
??https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html#option_mysqldump_databases
?
(1)創(chuàng)建數(shù)據(jù)備份目錄 db_backup
mkdir -p /mydata/db_backup
(2)備份所有數(shù)據(jù)庫。參數(shù) --all-databases
代表所有數(shù)據(jù)庫。備份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)同時備份多個指定的數(shù)據(jù)庫。參數(shù) --databases
后面可以指定數(shù)據(jù)庫名稱,支持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)備份一個數(shù)據(jù)庫。這里有兩種方式,但是,只有加了參數(shù) --databases 才能被正確地還原!
??1)有參數(shù)
--databases ,可以被還原,最好使用這種方式。
docker exec mysql sh -c 'exec mysqldump --databases dbydc1 -uroot -p"$MYSQL_ROOT_PASSWORD"' > /mydata/db_backup/dbydc1.sql
??2)無參數(shù)
--databases ,不能被還原,不要使用這種方式。MySQL官網(wǎng)有寫到可以這么做,但是經(jīng)過筆者驗證和查詢官網(wǎng)資料,這方式無法達到還原效果。筆者的專業(yè)技能有限,可能是支持還原的,但暫時寫不出來這樣的指令。
docker exec mysql sh -c 'exec mysqldump dbydc1 -uroot -p"$MYSQL_ROOT_PASSWORD"' > /mydata/db_backup/dbydc1.sql
(5)筆者試過以下的指令去還原數(shù)據(jù),但是發(fā)現(xiàn),根本行不通:
docker exec -i mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e "use dbydc1;"' < /mydata/db_backup/dbydc1.sql
(6)備份指定的數(shù)據(jù)表。這種方式筆者驗證過,無法還原。
docker exec mysql sh -c 'exec mysqldump dbydc1 tb_user -uroot -p"$MYSQL_ROOT_PASSWORD"' > /mydata/db_backup/tb_user.sql
?
14、MySQL數(shù)據(jù)庫還原。
(1)還原所有數(shù)據(jù)庫。
docker exec -i mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"' < /mydata/db_backup/all-databases.sql
(2)還原集合的數(shù)據(jù)庫。
docker exec -i mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"' < /mydata/db_backup/multi-databases.sql
(3)還原一個數(shù)據(jù)庫。這里注意,必須是前面加了 --databases 參數(shù) mysqldump 出來的sql文件才會被正常還原!
其實呢,使用 mysql 客戶端方式去還原sql文件,sql文件中必須要有 CREATE DATABASE
和 USE
這兩個語句,只有加了參數(shù) --all-databases
和 --databases
的才會正常被加載。文章來源:http://www.zghlxwxcb.cn/news/detail-422832.html
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
?
?
?文章來源地址http://www.zghlxwxcb.cn/news/detail-422832.html
到了這里,關(guān)于Docker安裝最新版MySQL5.7(mysql-5.7.40)教程(參考Docker Hub)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!