Docker实现MySQL主从复制以及SpringBoot项目的容器化部署

177 阅读4分钟

本文主要记录本人初学Docker实现MySQL主从复制以及SpringBoot项目的容器化部署的实现历程。

Docker实现MySQL主从复制

配置两个MySQL容器并启动

首先新建master和slave文件夹:

image.png

其目录结构如下:

image.png image.png

然后在master/conf/ 路径下创建 my.cnf 里面内容如下:

[mysqld]
## 同一局域网内注意要唯一
server-id=1024
## 开启二进制日志功能,可以随便取(关键)
log-bin=mysql-bin
secure_file_priv=/var/lib/mysql
default_authentication_plugin=mysql_native_password  #设置密码规则
max_connections=1000 #最大连接数设置 根据实际需要 自行调整

在slave /conf/路径下 创建 my.cnf 内容如下

[mysqld]
## 设置server_id,注意要唯一
server-id=1022 
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin   
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin
secure_file_priv=/var/lib/mysql
default_authentication_plugin=mysql_native_password  #设置密码规则
max_connections=1000 #最大连接数设置 根据实际需要 自行调整

然后利用镜像分别启动两个容器,一个master 一个slave , master端口为3339,slave为3340 对应的root密码为123456,映射配置文件和数据存储目录到mysql

启动 Master

 docker run --name master -p 3339:3306  \
 -v "$PWD/master/conf/my.cnf":/etc/mysql/my.cnf \
 -v "$PWD/master/data":/var/lib/mysql \
 -e MYSQL_ROOT_PASSWORD=123456 -d mysql

启动Slave

  docker run --name slave -p 3340:3306 \
 -v "$PWD/slave/conf/my.cnf":/etc/mysql/my.cnf \
 -v "$PWD/slave/data":/var/lib/mysql \
 -e MYSQL_ROOT_PASSWORD=123456 -d mysql

连接测试成功以后,进行MySQL主从复制的配置:

image.png

MySQL主从数据同步的配置

这里我使用navicat连接之前启动好的MySQL容器

image.png

创建一个slave账户 并授权

右键进入命令行

image.png

分别执行下面两条语句可以创建一个slave账户,并授权

image.png

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

在Master进入mysql,执行show master status;

在Master进入mysql,执行show master status;

image.png

在linux服务器查看master容器的ip地址:

image.png

在slave容器的MySQL中执行以下命令

在slave容器的MySQL中执行以下命令:

change master to master_host='172.17.0.2', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000012', master_log_pos= 7673, master_connect_retry=30;
  • master_port: Master的端口号,指的是容器的端口号.
  • master_user:用于数据同步的用户
  • master_password:用于同步的用户的密码
  • master_log_file:指定Slave从哪个日志文件开始复制数据,即上文中提到的File字段的值
  • master_log_pos:从哪个Position开始读,即上文中提到的Position字段的值
  • master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒

查看slave的状态:

docker exec -it slave mysql -uroot -p123456
show slave status \G

出现以下情形说明主从复制配置成功:

image.png

修改MySQL容器内存的大小

主从复制比较占用内存,但是我的服务器本身性能比较差内存较小,当MySQL占用内存过大就会导致服务器宕机,故需要修改Docder容器的内存大小。

find / -name hostconfig.json #全局搜索hostconfig.json文件,文件的最后一级目录就是容器id

image.png

找到MySQL容器ID对应的hostconfig.json文件,修改Memory的大小。这里Memory的值为700×1024×1024

image.png

Docker实现SpringBoot项目的部署

首先把SpringBoot项目打成jar包并编写一个DockerFile:

DockerFile

FROM java:8

COPY  *.jar /app.jar

CMD ["--server.port=80"]

EXPOSE 80

ENTRYPOINT ["java","-jar","/app.jar"]

然后将它们放到同一个目录下,执行下面语句让它变成一个Docker镜像:

docker build -t heu_canteen .

运行Docker镜像并且进行菜品图片目录的挂载:

docker run -d -p 89:80 --name heu_canteen -v "/usr/local/temp_picture/dish_picture":/usr/local/temp_picture/dish_picture heu_canteen

修复邮件发送失败的问题

之前项目中配置了qq邮箱的smtp邮件发送服务,部署到云服务器前都是可以正常发送和接收的,而现在邮件发送不成功。

于是来到容器内部查看控制台打印的日志:

docker attach heu_canteen

看到了这样的报错:

image.png

经过查阅以后发现,这是云服务器禁用了25端口导致的。

我们改用465端口,它是为SMTPS(SMTP-over-SSL)协议服务开放的,这是SMTP协议基于SSL安全协议之上的一种变种协议,它继承了SSL安全协议的非对称加密的高度安全可靠性,可防止邮件泄露。SMTPS和SMTP协议一样,也是用来发送邮件的,只是更安全些。

修改项目的yaml

# 邮箱配置
mail:
  host: smtp.qq.com  # 发送邮件的服务器地址
  username: 1429379279@qq.com # 开启 IMAP/SMTP服务 的qq邮箱的账号
  password: qpgxgbjhwabzbagd  # 开启 IMAP/SMTP服务 获得的授权码,而不是qq邮箱的登录密码
  default-encoding: UTF-8
  port: 465
  properties:
    mail:
      smtp:
        socketFactory:
          class: javax.net.ssl.SSLSocketFactory
          port: 465
        ssl:
          enable: true

重新打成jar包,并制作Docker镜像,邮件可以正常发送了。