【Docker】Docker安装MySQL,并解决中文乱码和配置数据备份同步到宿主机

请添加图片描述


专栏精选文章

  1. 《Docker是什么?Docker从介绍到Linux安装图文详细教程》
  2. 《30条Docker常用命令图文举例总结》
  3. 《Docker如何构建自己的镜像?从镜像构建到推送远程镜像仓库图文教程》
  4. 《Docker多个容器和宿主机之间如何进行数据同步和数据共享?容器数据卷从介绍到常用操作图文教程》



前言

笔者这里演示 MySQL 5.7 版本的安装。
你是否遇到使用 Docker 安装 MySQL 5.7 插入中文会乱码?
你是否担心 MySQL 容器被删除后数据丢失?
你是否想知道 MySQL 容器内的数据如何实时地同步出宿主机?
恭喜你,看完本篇文章,你将解决上述所有问题。


1. 搜索镜像

Docker Hub 上查找 MySQL 镜像。

image-20221213092057955


2. 拉取镜像

$ docker pull mysql:5.7

image-20221213092621328


3. 查看镜像

$ docker images -a

image-20221213092707318


4. 创建容器

对于像 MySQL 这样稍微复杂的软件,如果你不知道如何运行该镜像来创建容器,可以查看官网【Overview】下面的介绍。

image-20221213093337318

【注意】

  • 请确保你的 Linux 电脑上原来没有安装运行过 MySQL ,否则会有冲突。通过下面的命令来查看。

    $ ps -ef | grep mysqld
    

    image-20221213093621472

    如上图所示你的 Linux 电脑原来没有运行 MySQL 。如果有,请移步这篇文章《Linux下如何安装MySQL以及远程登录保姆级教程》来进行卸载。

  • 请确保你的 Linux 宿主机上的防火墙是关闭的或者 3306 端口是开放的。


【大坑一】

MySQL 5.7 默认字符集是 latin1 ,不支持中文,必须改成 UTF-8 字符集。

SHOW VARIABLES LIKE 'character%';

image-20221213095751596

【大坑二】

刚刚创建容器时,没有加容器数据卷,MySQL 容器 mysql1 中的数据库无法实时备份和同步到宿主机上,如果容器被删除,那么其中的所有数据库和数据表都会丢失,这是非常严重的安全隐患。如果你对【容器数据卷】感到陌生,可以参考学习我的这篇博文:《Docker多个容器和宿主机之间如何进行数据同步和数据共享?容器数据卷从介绍到常用操作图文教程》

下面我们针对这两个大坑来重新演示真正企业级 MySQL 容器是怎么创建的。


4.1 创建容器

$ docker run -d -p 3306:3306 --privileged=true \
-v /xsh/mysql/log/:/var/log/mysql \
-v /xsh/mysql/data/:/var/lib/mysql \
-v /xsh/mysql/conf/:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=xsh981104 \
--name=mysql2 \
mysql:5.7

其中,--privileged=true 表示开启容器数据卷的权限;这次创建 MySQL 中,增加了 3 个容器数据卷。

-v /xsh/mysql/log/:/var/log/mysql 表示同步 MySQL 的日志到宿主机;

-v /xsh/mysql/data/:/var/lib/mysql 表示同步 MySQL 的数据到宿主机;

-v /xsh/mysql/conf/:/etc/mysql/conf.d 表示同步 MySQL 的配置到宿主机。

-e MYSQL_ROOT_PASSWORD 设置的是 MySQL 的 root 用户的登录密码。

image-20221213101431946

查看正在运行的容器。

image-20221213101527423
以前台交互式进入 MySQL 容器 mysql1

$ docker exec -it mysql1 /bin/bash

image-20221213094537817

进入 MySQL 终端。

$ mysql -uroot -p

image-20221213094703382

成功进入了 MySQL 的客户端终端,后面的操作就与你原来学的 MySQL 操作一样。

SHOW DATABASES;

image-20221213094854367

查看宿主机上的数据卷同步目录,发现已经成功从 MySQL 容器内同步到宿
主机外了。

$ ls -l /xsh/mysql

image-20221213101710073


4.2 解决中文乱码

我们通过创建 my.cnf 里面配置 MySQL 的默认字符集为 UTF-8,然后通过容器数据卷同步给 MySQL 容器实例。

在宿主机上进入 MySQL 容器数据卷的配置目录 /xsh/mysql/conf

$ cd /xsh/mysql/conf

image-20221213102115909

发现里面为空。在这个目录下创建 my.cnf 配置文件。

$ vim my.cnf

然后把下面这段内容粘贴进去。

[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8

image-20221213102444184

:wq 保存退出。


4.3 重启MySQL容器生效

重启MySQL容器实例,再重新进入并查看 MySQL 容器的字符集。

$ docker restart mysql2

image-20221213102741862

以前台交互式进入 MySQL 容器 mysql2

$ docker exec -it mysql2 /bin/bash

进入 MySQL 终端。

$ mysql -uroot -p

查看 MySQL 5.7 容器的字符集是否已经改为 UTF-8 。

SHOW VARIABLES LIKE 'character%';

image-20221213103041528

已经成功改为 UTF-8 字符集了。


4.4 建库建表测试中文

创建测试数据库。

CREATE DATABASE IF NOT EXISTS testdb01;

image-20221213103422497

切换进数据库 testdb01

USE testdb01;

image-20221213103518352

创建测试数据表。

CREATE TABLE test1(
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
last_name VARCHAR(15)
);

image-20221213103856049

往数据表 test1 插入中文数据测试是否有乱码。

INSERT INTO test1(last_name) VALUES
('Mike'),
('张三');

image-20221213104434552

没有乱码,MySQL 5.7 的字符集修改成功。

【结论】

Docker 安装完 MySQL 并 run 出容器实例后,推荐先修改完字符集编码后再建库建表和插入数据。


4.5 容器数据卷的容灾性

在实际开发中,我一再强调创建 MySQL 容器时必须挂载容器数据卷。这样,即使 MySQL 容器被删除,宿主机中的数据卷目录仍保存有数据备份。只要再次把被删除的 MySQL 容器创建出来,那么宿主机就可以自动把数据同步回这个 MySQL 容器中。

【举例】

我把 MySQL 容器 mysql2 删除,这时容器内的数据库和数据表都一并被删除。

$ docker rm -f mysql2

image-20221213110729286

但是由于我挂载了容器数据卷,这个容器的数据在宿主机中都有完整备份。

image-20221213110936400

这时我再次把被删除的 MySQL 容器实例创建出来。

$ docker run -d -p 3306:3306 --privileged=true \
-v /xsh/mysql/log/:/var/log/mysql \
-v /xsh/mysql/data/:/var/lib/mysql \
-v /xsh/mysql/conf/:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=xsh981104 \
--name=mysql2 \
mysql:5.7

image-20221213111053394

image-20221213111107957

以前台交互式进入 MySQL 容器 mysql2

$ docker exec -it mysql2 /bin/bash

进入 MySQL 终端。

$ mysql -uroot -p

查看 MySQL 5.7 容器之前在宿主机中的数据有没有自动同步回来。

SHOW DATABASES;

image-20221213111318094

USE testdb01;
SELECT * FROM test1;

image-20221213111419501

MySQL 数据会在容器再次创建时自动同步回来,并且与宿主机的数据卷同步也会自动回复。因此,在创建 MySQL 容器实例时必须挂载数据卷。


4.6 远程连接数据库

接下来我们使用 Windows 客户端 SQLyog 远程连接这个 MySQL 容器。

image-20221213095130021

连接成功。

image-20221213095157013

image-20221213095238842

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

自牧君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值