本文主要记录本人初学Docker实现MySQL主从复制以及SpringBoot项目的容器化部署的实现历程。
Docker实现MySQL主从复制
配置两个MySQL容器并启动
首先新建master和slave文件夹:
其目录结构如下:
然后在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主从复制的配置:
MySQL主从数据同步的配置
这里我使用navicat连接之前启动好的MySQL容器
创建一个slave账户 并授权
右键进入命令行
分别执行下面两条语句可以创建一个slave账户,并授权
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
在Master进入mysql,执行show master status;
在Master进入mysql,执行show master status;
在linux服务器查看master容器的ip地址:
在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
出现以下情形说明主从复制配置成功:
修改MySQL容器内存的大小
主从复制比较占用内存,但是我的服务器本身性能比较差内存较小,当MySQL占用内存过大就会导致服务器宕机,故需要修改Docder容器的内存大小。
find / -name hostconfig.json #全局搜索hostconfig.json文件,文件的最后一级目录就是容器id
找到MySQL容器ID对应的hostconfig.json文件,修改Memory的大小。这里Memory的值为700×1024×1024
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
看到了这样的报错:
经过查阅以后发现,这是云服务器禁用了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镜像,邮件可以正常发送了。