简单版:
分为简单版跟实际版:
简单版用于快速体验docker部署mysql环境。
实际版用于模拟真实docker部署mysql环境。
1、拉取mysql
# 可指定mysql版本
docker pull mysql:5.7
# 拉取完成后查看本地是否存在mysql镜像
docker images
2、运行mysql
# 3307是主机使用的端口号,因为主机已安装mysql,所以3306端口冲突,我改成3307了
# 3306是容器的mysql端口
# root密码是123456
docker run -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
# mysql容器启动完成后,请检查是否成功启动
docker ps
3、进入mysql容器
docker exec -it 容器ID /bin/bash
4、在mysql容器内,执行mysql命令
# 登录mysql账号
mysql -uroot -p
# 进入mysql命令行后,执行建库建表语句
create database testDB;
use testDB;
create table t1(id int ,name varchar(20));
insert into t1 values(1,'z3');
select * from t1;
上述中描述在docker的mysql容器里
- 创建名为testDB的数据库,
- 并创建了t1表,
- 在表中新建了id=1,name=z3的数据。
那么docker里的mysql容器如何连接到本机的数据库呢?
5、查询宿主机的ip(就是开启docker的那台)
# 输入ifconfig,并寻找ens33下的ip。
ifconfig
6、来到本机navicat进行连接(就是你自己的电脑)
- 连接名随便取取
- 主机用上面复制的ip
- 端口号用宿主机的3307
- 用户名密码root 123456
进来后就会发现数据库就是docker里容器创建的那个数据库,数据也在。
在navicat插入一条新数据,然后再回到docker容器里面查询数据库看。
查询出来,数据是同步的。
至此docker部署简单版的mysql搭建完成。
为什么说是简单版?
因为还存在很多bug,实际中大多数不会这样用。
bug例如:
1、不能插入中文字符。(insert into t1 values(3,'王五');)
2、若mysql容器宕机,则导致数据丢失。
实际版:
首先咱们先把简单版的mysql容器删掉先。
1、docker ps (列出正在运行的容器,复制mysql容器id)
2、docker rm -f 容器id (删除容器)
1、拉取mysql,使用容器卷,保证mysql容器宕机数据也会有备份。
docker run -d -p 3307:3306 --privileged=true -v /lingon/mysql/log:/var/log/mysql -v /lingon/mysql/data:/var/lib/mysql -v /lingon/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.7
# docker run -d -p 3307:3306 --privileged=true
# -v /lingon/mysql/log:/var/log/mysql
# -v /lingon/mysql/data:/var/lib/mysql
# -v /lingon/mysql/conf:/etc/mysql/conf.d
# -e MYSQL_ROOT_PASSWORD=123456
# --name mysql mysql:5.7
2、新建my.cnf
# 去到配置文件夹
cd/lingon/mysql/conf/
# 新建my.cnf,里面输入下面这一串命令
vim my.cnf
# 粘贴上这一段命令
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8
# 检查配置是否生效
cat my.cnf
3、修改配置文件后,重启mysql容器
docker restart mysql
4、检查是否成功配置utf-8格式
# 进入mysql容器
docker exec -it mysql /bin/bash
# 登录mysql
mysql -uroot -p
# 查看字符编码,若显示为utf-8,则表示中文乱码成功修复。
show variables like 'character%';
5、可自行去本机的navicat进行验证,在这里就不多赘述了。
至此!实际版解决了简单版所拥有的一些问题(中文乱码,数据备份),
实际开发中也几乎用的都是这种方法,大家一起加油哇!