
专栏精选文章
- 《Docker是什么?Docker从介绍到Linux安装图文详细教程》
- 《30条Docker常用命令图文举例总结》
- 《Docker如何构建自己的镜像?从镜像构建到推送远程镜像仓库图文教程》
- 《Docker多个容器和宿主机之间如何进行数据同步和数据共享?容器数据卷从介绍到常用操作图文教程》
本期目录
- 专栏精选文章
- 前言
- 1. 搜索镜像
- 2. 拉取镜像
- 3. 查看镜像
- 4. 创建容器
- 4.1 创建容器
- 4.2 解决中文乱码
- 4.3 重启MySQL容器生效
- 4.4 建库建表测试中文
- 4.5 容器数据卷的容灾性
- 4.6 远程连接数据库
前言
笔者这里演示 MySQL 5.7 版本的安装。
你是否遇到使用 Docker 安装 MySQL 5.7 插入中文会乱码?
你是否担心 MySQL 容器被删除后数据丢失?
你是否想知道 MySQL 容器内的数据如何实时地同步出宿主机?
恭喜你,看完本篇文章,你将解决上述所有问题。
1. 搜索镜像
在 Docker Hub 上查找 MySQL 镜像。

2. 拉取镜像
$ docker pull mysql:5.7

3. 查看镜像
$ docker images -a

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

【注意】
-
请确保你的 Linux 电脑上原来没有安装运行过 MySQL ,否则会有冲突。通过下面的命令来查看。
$ ps -ef | grep mysqld
如上图所示你的 Linux 电脑原来没有运行 MySQL 。如果有,请移步这篇文章《Linux下如何安装MySQL以及远程登录保姆级教程》来进行卸载。
-
请确保你的 Linux 宿主机上的防火墙是关闭的或者 3306 端口是开放的。
【大坑一】
MySQL 5.7 默认字符集是 latin1 ,不支持中文,必须改成 UTF-8 字符集。
SHOW VARIABLES LIKE 'character%';

【大坑二】
刚刚创建容器时,没有加容器数据卷,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 用户的登录密码。

查看正在运行的容器。

以前台交互式进入 MySQL 容器 mysql1 。
$ docker exec -it mysql1 /bin/bash

进入 MySQL 终端。
$ mysql -uroot -p

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

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

4.2 解决中文乱码
我们通过创建 my.cnf 里面配置 MySQL 的默认字符集为 UTF-8,然后通过容器数据卷同步给 MySQL 容器实例。
在宿主机上进入 MySQL 容器数据卷的配置目录 /xsh/mysql/conf 。
$ cd /xsh/mysql/conf

发现里面为空。在这个目录下创建 my.cnf 配置文件。
$ vim my.cnf
然后把下面这段内容粘贴进去。
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8

按 :wq 保存退出。
4.3 重启MySQL容器生效
重启MySQL容器实例,再重新进入并查看 MySQL 容器的字符集。
$ docker restart mysql2

以前台交互式进入 MySQL 容器 mysql2 。
$ docker exec -it mysql2 /bin/bash
进入 MySQL 终端。
$ mysql -uroot -p
查看 MySQL 5.7 容器的字符集是否已经改为 UTF-8 。
SHOW VARIABLES LIKE 'character%';

已经成功改为 UTF-8 字符集了。
4.4 建库建表测试中文
创建测试数据库。
CREATE DATABASE IF NOT EXISTS testdb01;

切换进数据库 testdb01 。
USE testdb01;

创建测试数据表。
CREATE TABLE test1(
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
last_name VARCHAR(15)
);

往数据表 test1 插入中文数据测试是否有乱码。
INSERT INTO test1(last_name) VALUES
('Mike'),
('张三');

没有乱码,MySQL 5.7 的字符集修改成功。
【结论】
Docker 安装完 MySQL 并 run 出容器实例后,推荐先修改完字符集编码后再建库建表和插入数据。
4.5 容器数据卷的容灾性
在实际开发中,我一再强调创建 MySQL 容器时必须挂载容器数据卷。这样,即使 MySQL 容器被删除,宿主机中的数据卷目录仍保存有数据备份。只要再次把被删除的 MySQL 容器创建出来,那么宿主机就可以自动把数据同步回这个 MySQL 容器中。
【举例】
我把 MySQL 容器 mysql2 删除,这时容器内的数据库和数据表都一并被删除。
$ docker rm -f mysql2

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

这时我再次把被删除的 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


以前台交互式进入 MySQL 容器 mysql2 。
$ docker exec -it mysql2 /bin/bash
进入 MySQL 终端。
$ mysql -uroot -p
查看 MySQL 5.7 容器之前在宿主机中的数据有没有自动同步回来。
SHOW DATABASES;

USE testdb01;
SELECT * FROM test1;

MySQL 数据会在容器再次创建时自动同步回来,并且与宿主机的数据卷同步也会自动回复。因此,在创建 MySQL 容器实例时必须挂载数据卷。
4.6 远程连接数据库
接下来我们使用 Windows 客户端 SQLyog 远程连接这个 MySQL 容器。

连接成功。















![[附源码]Python计算机毕业设计动物保护资讯推荐网站Django(程序+LW)](https://img-blog.csdnimg.cn/9f0fcde6dd024dc3ae41a1d00bf9ba82.png)
![RabbitMQ[3]-RabbitMQ如何保证消息的可靠性投递与消费?](https://img-blog.csdnimg.cn/img_convert/8f84583ad6db6d0b172b63465d87c3a6.jpeg)




