MySQL 之使用Docker安装Mysql5.7

Ubuntu16安装Docker

Ubuntu自带的软件源列表更新很慢,所以我们切换成阿里提供的软件源列表。

# 备份自带的软件源列表
cp /etc/apt/sources.list /etc/apt/sources.list.back
# 删除自带的软件源列表文件
rm -rf /etc/apt/sources.list
# 新建软件源列表文件
vim /etc/apt/sources.list
# 将下面阿里提供的软件源列表内容复制到sources.list文件中
# deb cdrom:[Ubuntu 16.04 LTS _Xenial Xerus_ - Release amd64 (20160420.1)]/ xenial main restricted
deb-src http://archive.ubuntu.com/ubuntu xenial main restricted #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb http://mirrors.aliyun.com/ubuntu/ xenial multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse #Added by software-properties
deb http://archive.canonical.com/ubuntu xenial partner
deb-src http://archive.canonical.com/ubuntu xenial partner
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-security multiverse

下面正式安装Docker。
首先更新软件列表:apt-get update
安装Docker:apt-get install docker.io -y

查看Docker版本:docker version
如下图表示没有启动Docker服务。
在这里插入图片描述
启动Docker服务:service docker start
如下图表示Docker服务已启动。
在这里插入图片描述
查看容器状态:service docker status
在这里插入图片描述

Docker常用命令

查看正在运行的容器

# 查看正在运行的容器
docker ps
# 查看所有的容器,包括已经停止的。
docker ps -a 

查看所有镜像

docker images

拉取镜像

docker pull <镜像名:tag>
# 例如以下代码
docker pull mysql

停止、启动、杀死指定容器

docker start <容器名 or ID>
docker stop <容器名 or ID>
docker kill <容器名 or ID>

删除容器

docker rm -f <容器名 or ID>
# 删除所有容器
docker rm -f $(docker ps -a -q)

查看容器日志

docker logs -f <容器名 or ID>

进入容器

docker exec -it <容器名 or ID> bash

Docker搭建Mysql5.7服务

docker部署mysql并修改配置: https://blog.csdn.net/Madness_stone/article/details/124513179
拉取官方镜像

[mysqld]
lower_case_table_names=1
default-time-zone = Asia/Shanghai

docker cp /home/mysql.conf.d/mysqld.cnf  mysql3381:/etc/mysql/mysql.conf.d/mysqld.cnf
# 拉取 mysql 5.7
docker pull mysql:5.7   
# 拉取最新版mysql镜像
docker pull mysql       

在这里插入图片描述
创建一个Mysql容器

sudo docker run -p 3380:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

或者

docker run -p 3306:3306 --name mysql \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7
  • -v:挂载文件,启动的时候把容器中的文件映射到虚拟机文件当中
  • –name:容器名,此处命名为mysql
  • -e:配置信息,此处配置mysql的root用户的登陆密码
  • -p:端口映射,(3380)冒号前面是主机端口,(3306)冒号后面容器内部端口
  • -d:源镜像名,此处为 mysql:5.7

进入到容器docker exec -it mysql3380 bash
进入Mysql客户端: mysql -h127.0.0.1 -uroot -p123456 -P3306
在这里插入图片描述

注意:在容器中进入Mysql客户端用的是容器内部端口,主机是127.0.0.1;如果外部连接Mysql客户端,需要使用创建容器时指定主机端口的端口号,主机名是主机的IP地址。
在这里插入图片描述

Docker搭建Mysql8.0.20服务

# 拉取镜像
docker pull mysql:8.0.20

# 创建挂载使用到的目录
mkdir -vp /home/docker/mysql3380
cd /home/docker/mysql3380
mkdir data logs conf

# 创建mysql容器
docker run -d -p 3380:3306 --name mysql3380 -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0.20

# 拷贝mysql的配置文件和数据
# 复制配置文件
docker cp mysql3380:/etc/mysql /home/docker/mysql3380/conf
# 复制data文件
docker cp mysql3380:/var/lib/mysql /home/docker/mysql3380/data

# 停止并删除容器
docker stop mysql3380
docker rm -f mysql3380

# 重新创建容器(指定数据卷)
docker run -d -p 3380:3306 \
--name mysql3380 \
--privileged=true \
--restart=unless-stopped \
-v /home/docker/mysql3380/conf/mysql/conf.d:/etc/mysql/conf.d \
-v /home/docker/mysql3380/logs:/var/log/mysql \
-v /home/docker/mysql3380/data/mysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:8.0.20

# 不允许远程连接解决方法
docker exec -it mysql /bin/bash
mysql -u root -p
use mysql 
# 更新root - localhost 为 root - %
update user set host = '%' where user = 'root' and host='localhost'; 
# 设置允许远程用户访问
GRANT ALL ON *.* TO 'root'@'%'; 
flush privileges;# 刷新权限
#更新用户加密方式,mysql8默认的加密方式
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '密码';

Docker搭建Mysql主从复制

上面我们已经创建了一个Mysql服务,这里作为主从中的master服务。

创建Mysql的slave服务

下面用同样的方式创建一个Mysql的slave服务。

# 注意修改主机端口号和容器名
sudo docker run -p 3381:3306 --name mysql3381 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

在这里插入图片描述
配置主从之前我们需要知道服务器的IP地址。

docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql3380
docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql3381

在这里插入图片描述
Master 服务器地址是 172.17.0.4 ,Slave 服务器地址是 172.17.0.5,MySQL 的端口号都为 3306。

配置master服务器

进入到 Master 服务器:docker exec -it mysql3380 bash
进入Mysql客户端: mysql -h127.0.0.1 -uroot -p123456 -P3306

修改配置文件: /etc/mysql/my.cnf

[mysqld]
## 设置server_id,一般设置为IP,同一局域网内注意要唯一
server_id=100  
## 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
binlog-ignore-db=mysql  
## 开启二进制日志功能,可以随便取,最好有含义(关键就是这里了)
log-bin=edu-mysql-bin  
## 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M  
## 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format=mixed  
## 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
expire_logs_days=7  
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062  

一般docker容器中没有vi或者其它相应的文本编辑器,如果只是为了修改这个配置文件就安装一个vi,太麻烦了,下面是另一种方案。
通过docker cp把这个文件拷贝出来: docker cp mysql3380:/etc/mysql/my.cnf /home/
再拷贝回去:docker cp /home/my.cnf mysql3380:/etc/mysql/

在容器中重启Mysql服务: service mysql restart
这个命令会使得容器停止,重新启动容器就可以了。

创建数据同步用户:

CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';   

配置slave服务器

进入到 Master 服务器:docker exec -it mysql3381 bash
进入Mysql客户端: mysql -h127.0.0.1 -uroot -p123456 -P3306

[mysqld]
## 设置server_id,一般设置为IP,注意要唯一
server_id=101  
## 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
binlog-ignore-db=mysql  
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=edu-mysql-slave1-bin  
## 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M  
## 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format=mixed  
## 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
expire_logs_days=7  
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062  
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin  
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1  
## 防止改变数据(除了特殊的线程)
read_only=1  

配置完成后重启mysql,和配置 Master 一样,会使容器停止,需要启动容器。

完成Master和Slave链接

在 Master 进入 MySQL, 然后执行命令: show master status;
在这里插入图片描述
记录下 File 和 Position 字段的值,后面会用到。

然后到 Slave 中进入 mysql,执行命令:

change master to master_host='172.17.0.4', 
master_user='slave', 
master_password='123456', 
master_port=3306, 
master_log_file='edu-mysql-bin.000001', 
master_log_pos=2395, 
master_connect_retry=30;  
  • master_host: Master 的IP地址
  • master_user: 在 Master 中授权的用于数据同步的用户
  • master_password: 同步数据的用户的密码
  • master_port: Master 的数据库的端口号
  • master_log_file: 指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
  • master_log_pos: 从哪个 Position 开始读,即上文中提到的 Position 字段的值
  • master_connect_retry: 当重新建立主从连接时,如果连接失败,重试的时间间隔,单位是秒,默认是60秒。

执行以下命令,开始开启主从同步: start slave;

在 Slave 的 MySQL 终端执行查看主从同步状态: show slave status \G;
在这里插入图片描述
SlaveIORunning 和 SlaveSQLRunning 是No,表明 Slave 还没有开始复制过程。相反 SlaveIORunning 和 SlaveSQLRunning 是Yes表明已经开始工作了,因为我已经运行过了,所以我的显示的都是 Yes。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值