专栏精选文章
- 《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 容器。
连接成功。