第2章 Docker应用实战-Docker部署MySql

第2章 Docker应用实战-Docker部署MySql

作者:王珂
邮箱:49186456@qq.com



前言

大家好,我是王珂老师,一个在IT行业摸爬滚打十多年的老兵。讲实战,重应用是我讲课唯一的追求。如果你感觉我讲的还不错,那么请点赞、收藏加关注,并转发给你身边的小伙伴,录视频不易,希望得到你支持与认可。

我们在CentOS环境操作系统上,使用Docker部署MySql。如果你使用的是Windows,可以在Windows操作系统上安装VMware虚拟机,具体步骤可以参考我的另一篇安装教程《第1章 Docker应用实战-基础环境准备》。


一、环境准备

  • CentOS7

  • Docker

  • Docker-Compose(如果想使用docker-compose命令部署时需要)

具体请参考《第1章 Docker应用实战-基础环境准备》

二、部署MySql

使用docker部署

2.1 快速部署单节点MySql

使用docker快速部署一个mysql,如果全部使用默认配置,执行以下命令即可

docker run --name mysql-8.0.21 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.21

部署完成后,mysql信息如下:

  • -p 3306:3306 暴露mysql端口 3306

  • 用户名: root

  • -e MYSQL_ROOT_PASSWORD=123456 mysql root 用户的密码

注意:以上部署的mysql的数据和配置文件都存储在容器中,当容器删除时,配置文件和数据都同时丢失。这种方式仅适合我们临时本地开发使用。

使用docker-compose部署

以下我们使用dokcer-compose创建mysql.

2.2 部署单节点MySql

  1. 创建目录

如果需要将数据和配置文件存储在宿主机上,假设使用目录/opt/docker-compose/mysql-8.0.21/,数据文件存储在其下data目录,配置文件存储在其下conf目录,因此我们首先创建以下目录

mkdir -p /opt/docker-compose/mysql-8.0.21/{data,conf}
  1. my.cnf

配置文件的内容

[mysqld]
# 设置日志格式,可选值:ROW(默认),STATEMENT,MIXED
binlog_format = STATEMENT

# 表不区分大小写
lower_case_table_names = 1

# 使用mysql_native_password密码策略,防止navicat连不上mysq18
default_authentication_plugin = mysql_native_password
  1. docker-compose.yml

docker-compose.yml文件的内容

version: "3"
services:
  mysql-8.0.21:
    image: mysql:8.0.21
    container_name: mysql-8.0.21
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: 123456
    volumes:
      - "./conf:/etc/mysql/conf.d"
      - "./data:/var/lib/mysql"
    privileged: true
    restart: always
  1. 执行部署

进入到docker-compose.yml文件所在目录,执行命令

docker-compose up -d

2.3 部署MySql主从集群

mysql版本选择8.0.21,容器规划

容器名称端口说明
mysql-8.0.21-master3316master节点
mysql-8.0.21-slave13326slave1节点

mysql-ms-8.0.21目录结构

  1. mysql-ms-8.0.21.yml
version: "3"
services:
  mysql-8.0.21-master:
    container_name: mysql-8.0.21-master
    image: mysql:8.0.21    
    ports:
      - "3316:3306"
    environment:
      MYSQL_ROOT_PASSWORD: 123456
    volumes:
      - "./master/conf/:/etc/mysql/conf.d"
      - "./master/data:/var/lib/mysql"
    privileged: true
    restart: always
  mysql-8.0.21-slave1:
    container_name: mysql-8.0.21-slave1
    image: mysql:8.0.21    
    ports:
      - "3326:3306"
    environment:
      MYSQL_ROOT_PASSWORD: 123456
    volumes:
      - "./slave1/conf:/etc/mysql/conf.d"
      - "./slave1/data:/var/lib/mysql"
    privileged: true
    restart: always
    depends_on:
      - mysql-8.0.21-master
  1. master

mysqld.cnf

[mysqld]
# 服务器ID
server-id = 1

# 设置日志格式,可选值:ROW(默认),STATEMENT,MIXED
binlog_format = STATEMENT

# 表不区分大小写
lower_case_table_names = 1

# 使用mysql_native_password密码策略,防止navicat连不上mysq18
default_authentication_plugin = mysql_native_password
  1. slave

mysqld.cnf

[mysqld]
# 服务器ID
server-id = 2

# 设置日志格式,可选值:ROW(默认),STATEMENT,MIXED
binlog_format = STATEMENT

# 表不区分大小写
lower_case_table_names = 1

# 使用mysql_native_password密码策略,防止navicat连不上mysq18
default_authentication_plugin = mysql_native_password
  1. 执行部署
docker-compose -f ./mysql-ms-8.0.21/mysql-ms-8.0.21.yml up -d
  1. 在master节点创建repl用户

先进入主服务器

docker exec -it mysql-8.0.21-master /bin/bash

登录mysql

mysql -uroot -p

创建repl用户

-- 创建repl用户
create user 'repl'@'%';
-- 设置密码
alter user 'repl'@'%' identified with mysql_native_password by '123456';
-- 授予复制权限
grant replication slave on *.* to 'repl'@'%';
-- 刷新
flush privileges;
  1. 查询master状态
show master status;

±--------------±---------±-------------±-----------------±------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
±--------------±---------±-------------±-----------------±------------------+
| binlog.000002 | 1047 | | | |
±--------------±---------±-------------±-----------------±------------------+
1 row in set (0.00 sec)

  1. 配置slave服务器同步

先进入slave服务器

docker exec -it mysql-8.0.21-slave1 /bin/bash

登录mysql

mysql -uroot -p

配置主从

change master to master_host='192.168.1.17',master_user='repl',master_password='123456',master_port=3316,master_log_file='binlog.000002',master_log_pos=1047;

启动主从复制

start slave;

查看主从状态

show slave status \G;

mysql> show slave status \G;
*************************** 1. row ***************************

           Slave_IO_State: Waiting for master to send event
              Master_Host: 192.168.1.17
              Master_User: repl
              Master_Port: 3316
            Connect_Retry: 60
          Master_Log_File: binlog.000002
      Read_Master_Log_Pos: 1047
           Relay_Log_File: 7c2969b69424-relay-bin.000002
            Relay_Log_Pos: 321
    Relay_Master_Log_File: binlog.000002
         Slave_IO_Running: Yes
        Slave_SQL_Running: Yes

总结

以上就是本章节课程的主要内容,希望能够对您有所帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
1. 安装Docker 如果您还没有安装Docker,请按照官方文档的说明安装Docker。 2. 创建Docker网络 为了使主从复制工作,我们需要为Docker容器创建一个网络。在命令行中运行以下命令: ``` sudo docker network create mysql_network ``` 3. 启动主数据库 我们将使用官方的MySQL Docker镜像来启动主数据库。在命令行中运行以下命令: ``` sudo docker run -d --name mysql_master --net mysql_network -e MYSQL_ROOT_PASSWORD=password mysql:latest --server-id=1 --log-bin=mysql-bin --binlog-do-db=mydb ``` 这将启动一个名为mysql_master的Docker容器,并将其连接到我们创建的mysql_network网络中。我们还指定了一个root用户的密码,并为该容器分配了一个server-id,以便在创建从数据库时使用。 我们还使用了两个MySQL选项来启用二进制日志记录和仅记录mydb数据库的事务。 4. 启动从数据库 现在我们需要启动另一个MySQL容器作为从数据库。在命令行中运行以下命令: ``` sudo docker run -d --name mysql_slave --net mysql_network -e MYSQL_ROOT_PASSWORD=password mysql:latest --server-id=2 --log-bin=mysql-bin --binlog-do-db=mydb --relay-log=mysql-relay-bin --log-slave-updates=1 --read-only=1 --slave-skip-errors=all --skip-slave-start ``` 这将启动一个名为mysql_slave的Docker容器,并将其连接到我们创建的mysql_network网络中。我们还指定了一个root用户的密码,并为该容器分配了一个server-id。 我们还使用了一些MySQL选项来启用二进制日志记录和仅记录mydb数据库的事务。我们还启用了中继日志记录和从服务器更新主服务器的日志记录。我们还将容器设置为只读模式,并跳过任何从数据库错误。最后,我们将跳过从服务器的启动。 5. 配置主数据库 现在我们需要登录主数据库并为它创建一个用于从服务器的用户。在命令行中运行以下命令: ``` sudo docker exec -it mysql_master mysql -u root -p ``` 输入我们在启动容器时指定的root密码,这将进入MySQL shell。在MySQL shell中,运行以下命令: ``` GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY 'password'; FLUSH PRIVILEGES; SHOW MASTER STATUS; ``` 这将创建一个名为slave_user的用户并授予其复制权限。我们还刷新了特权表以确保更改生效。最后,我们显示了主服务器的状态,以便稍后配置从服务器。 请注意,我们在第一行中使用了“%”通配符,以便从任何位置连接到主服务器。在生产环境中,您应该更明确地指定从服务器的IP地址。 6. 配置从数据库 现在我们需要登录从数据库并配置它以连接到主服务器。在命令行中运行以下命令: ``` sudo docker exec -it mysql_slave mysql -u root -p ``` 输入我们在启动容器时指定的root密码,这将进入MySQL shell。在MySQL shell中,运行以下命令: ``` CHANGE MASTER TO MASTER_HOST='mysql_master', MASTER_USER='slave_user', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=0; START SLAVE; ``` 这将配置从服务器以连接到我们的主数据库,并指定将从哪个二进制日志文件开始复制。我们还启动从服务器以开始复制。 请注意,我们在第一行中使用了主服务器的容器名称(mysql_master)作为主机名。在Docker网络中,容器可以使用其名称进行通信。 7. 测试主从复制 现在,我们已经成功配置了主从复制,我们可以测试它是否正常工作。在MySQL shell中,运行以下命令: ``` USE mydb; CREATE TABLE test (id INT PRIMARY KEY); INSERT INTO test VALUES (1); ``` 这将在主服务器上创建一个名为test的表,并将一行插入其中。我们可以使用以下命令在从服务器上检查是否成功复制: ``` USE mydb; SELECT * FROM test; ``` 如果一切正常,您应该看到与主服务器上插入的相同的行。 现在,我们已经成功地使用Docker部署MySQL主从复制。请记住,这只是一个简单的示例,用于演示如何设置主从复制。在生产环境中,您应该仔细考虑安全性和高可用性等问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值