参考资料:https://hub.docker.com/_/mysql
我们选择5.7.x,在github上,可以看出,在我架设测试和写文章时,版本刚刚更新,最新版本是5.7.34.就在不到一天之前。
https://github.com/docker-library/mysql
一、拉取镜像
docker pull mysql:5.7.34
二、创建挂载文件夹
mkdir -p /var/docker/mysql/conf && mkdir -p /var/docker/mysql/data && chmod -R 777 /var/docker/mysql
三、运行容器
docker run --name mysql -itd \
-h mysql-server \
-e MYSQL_ROOT_PASSWORD=root \
-v /var/docker/mysql/conf:/etc/mysql/conf.d \
-v /var/docker/mysql/data:/var/lib/mysql \
-p 3306:3306 \
--user root:root \
mysql:5.7.34 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_general_ci
root用户的默认密码为 root。
四、进入容器,登录mysql。
docker exec -it mysql bash
mysql -uroot -proot
查看字符集。
show variables like 'character_set_%';
可以看出,默认的字符集是latin1,我们要将其修改为utf8mb4.
set names 'utf8mb4';
exit退出mysql和容器。
五、客户端远程连接。我们使用DataGrip来连接。我们的IP是192.168.0.78,在hosts中的映射域名为servers.chris.com. 密码root。
连接测试成功。
六、测试SQL导入。我们准备一个sql脚本文件test.sql,把它放在宿主机/var/share目录下。
create database if not exists db_test default character set utf8mb4 collate utf8mb4_general_ci;
use db_test;
create table if not exists tb_user
(
id int not null primary key auto_increment comment 'ID',
name varchar(20) not null comment '姓名',
age tinyint(3) comment '年龄',
address varchar(64) comment '地址'
);
insert into tb_user(name, age, address)
values ('Mike', 23, 'BeiJing'),
('Rose', 21, 'ShangHai'),
('John', 25, 'GuangZhou');
由于新版mysql规定mysqldump执行命令不能把密码暴露在命令行中,所以我们要把密码放在配置文件中。
vi /var/docker/mysql/conf/config.cnf
添加内容:
[client]
user=root
password=root
执行导入命令。
docker exec -i mysql sh -c 'exec mysql' --defaults-file=/var/docker/mysql/conf/config.cnf < /var/share/test.sql
看看结果。
七、测试导出
docker exec mysql sh -c 'exec mysqldump --all-databases' --defaults-file=/var/docker/mysql/conf/config.cnf > /var/share/export_result.sql
看看结果。
这是导出了所有的数据库表。如果要导出指定的库表数据,则执行:
docker exec mysql sh -c 'exec mysqldump -t db_test' --defaults-file=/var/docker/mysql/conf/config.cnf > /var/share/export_test_result.sql
此类导入导出的操作,具体参考mysqldump相关命令。
如果我们的容器出了什么问题,不能启动,我们可以删除容器,重新运行一个。我们会发现,我们对数据库所做的设置,以及脚本导入创建的数据库表记录全部都在。这就是我们为什么要用宿主机挂载配置文件和数据文件的原因。就算将来要换一个服务器,我们也可以很方便地实现数据移植。