09-Docker安装Mysql

简介: 本文介绍Docker安装MySQL 5.7的完整流程,涵盖单机部署与主从复制。通过容器卷映射解决中文乱码与数据持久化问题,并详细配置主从同步,实现高可用架构,适用于生产环境部署参考。(238字)

Docker 安装 Mysql

以安装 Mysql 5.7为例:

docker pull mysql:5.7

Mysql 单机

简单版 Mysql 5.7 安装

简单的启动Mysql容器:

需要使用 -e 配置环境变量 MYSQL_ROOT_PASSWORD(mysql root用户的密码)

docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7

简单版的Mysql会存在以下问题:

● 中文乱码
● 没有容器卷映射

启动docker容器后,可以正常的连接、创建数据库,创建表,插入数据。但是插入中文则会报错。

例如:

-- 创建db01数据库
create database db01;
-- 切换到db01;
use db01;
-- 创建表
create table t1(id int, name varchar(20));

-- 插入英文可以正常插入
insert into t1 values(1, 'abc');

-- 插入中文报错
insert into t1 values(2, '张三');

这是因为docker默认的字符集的问题,可以在mysql中使用以下命令查看数据库字符集:

show variables like 'character%';

返回的字符集中,character_set_database、character_set_server等都为latin1字符集,所以会报错。

而且因为启动容器时没有配置容器卷映射,当容器意外被删时,数据无法找回。

实际应用版 Mysql 5.7安装

启动 Mysql 容器,并配置容器卷映射:

docker run -d -p 3306:3306 \
--privileged=true \
-v /app/mysql/log:/var/log/mysql \
-v /app/mysql/data:/var/lib/mysql \
-v /app/mysql/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=root \
--name mysql \
mysql:5.7

在/app/mysql/conf下新建 my.cnf,通过容器卷同步给mysql实例,解决中文乱码问题:

[client]
default-character-set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8

重启mysql容器,使得容器重新加载配置文件:

docker restart mysql

此时便解决了中文乱码(中文插入报错)问题。

而且因为启动时将容器做了容器卷映射,将mysql的配置(映射到/app/mysql/conf)、数据(映射到/app/mysql/data)、日志(映射到/app/mysql/log)都映射到了宿主机实际目录,所以即使删除了容器,也不会产生太大影响。只需要再执行一下启动Mysql容器命令,容器卷还按相同位置进行映射,所有的数据便都可以正常恢复。

Mysql 主从复制安装

安装主服务器容器实例(端口号3307):

  1. 启动容器实例
    docker run -p 3307:3306 \

       --name mysql-master \
       --privileged=true \
       -v /app/mysql-master/log:/var/log/mysql \
       -v /app/mysql-master/data:/var/lib/mysql \
       -v /app/mysql-master/conf:/etc/mysql \
       -e MYSQL_ROOT_PASSWORD=root \
       -d mysql:5.7
    
  2. 进入/app/mysql-master/conf,新建my.cnf配置文件:
    [mysqld]

    设置server_id, 同一个局域网中需要唯一

    server_id=101

    指定不需要同步的数据库名称

    binlog-ignore-db=mysql

    开启二进制日志功能

    log-bin=mall-mysql-bin

    设置二进制日志使用内存大小(事务)

    binlog_cache_size=1M

    设置使用的二进制日志格式(mixed,statement,row)

    binlog_format=mixed

    二进制日志过期清理时间。默认值为0,表示不自动清理

    expire_logs_days=7

    跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断

    如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致

    slave_skip_errors=1062

  3. 重启容器实例
    docker restart mysql-master

  4. 进入容器实例内
    docker exec -it mysql-master /bin/bash

  5. 登录mysql,创建数据同步用户
    -- 首先使用 mysql -uroot -p 登录mysql
    -- 创建数据同步用户
    create user 'slave'@'%' identified by '123456';
    -- 授权
    grant replication slave, replication client on . to 'slave'@'%';
    flush privileges;

安装从服务器容器实例(端口号3308):

  1. 启动容器服务:
    docker run -p 3308:3306 \

       --name mysql-slave \
       --privileged=true \
       -v /app/mysql-slave/log:/var/log/mysql \
       -v /app/mysql-slave/data:/var/lib/mysql \
       -v /app/mysql-slave/conf:/etc/mysql \
       -e MYSQL_ROOT_PASSWORD=root \
       -d mysql:5.7
    
  2. 进入/app/mysql-slave/conf目录,创建my.cnf配置文件:
    [mysqld]

    设置server_id, 同一个局域网内需要唯一

    server_id=102

    指定不需要同步的数据库名称

    binlog-ignore-db=mysql

    开启二进制日志功能,以备slave作为其它数据库实例的Master时使用

    log-bin=mall-mysql-slave1-bin

    设置二进制日志使用内存大小(事务)

    binlog_cache_size=1M

    设置使用的二进制日志格式(mixed,statement,row)

    binlog_format=mixed

    二进制日志过期清理时间。默认值为0,表示不自动清理

    expire_logs_days=7

    跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断

    如:1062错误是指一些主键重复,1032是因为主从数据库数据不一致

    slave_skip_errors=1062

    relay_log配置中继日志

    relay_log=mall-mysql-relay-bin

    log_slave_updates表示slave将复制事件写进自己的二进制日志

    log_slave_updates=1

    slave设置只读(具有super权限的用户除外)

    read_only=1

  3. 修改完配置需要重启slave容器实例
    docker restart mysql-slave

在主数据库中查看主从同步状态:

  1. 进入主数据库容器:
    docker exec -it mysql-master /bin/bash

  2. 进入Mysql
    mysql -uroot -p

  3. 查看主从同步状态
    show master status;

主要查看返回结果的文件名File、当前位置Position

进入从数据库容器,配置主从复制:

  1. 进入从数据库容器:
    docker exec -it mysql-slave /bin/bash

  2. 进入数据库
    mysql -uroot -p

  3. 配置从数据库所属的主数据库:
    -- 格式:
    -- change master to master_host='宿主机ip',master_user='主数据库配置的主从复制用户名',master_password='主数据库配置的主从复制用户密码',master_port=宿主机主数据库端口,master_log_file='主数据库主从同步状态的文件名File',master_log_pos=主数据库主从同步状态的Position,master_connect_retry=连接失败重试时间间隔(秒);

change master to master_host='192.168.xxx.xxx',master_user='slave',master_password='123456',master_port=3307,master_log_file='mall-mysql-bin.000001',master_log_pos=769,master_connect_retry=30;

  1. 查看主从同步状态:

    \G 可以将横向的结果集表格转换成纵向展示。

    slave status的字段比较多,纵向展示比友好

    show slave status \G;

除了展示刚刚配置的主数据库信息外,主要关注 Slave_IO_Running、Slave_SQL_Running。目前两个值应该都为 No,表示还没有开始。

  1. 开启主从同步:
    start slave;

  2. 再次查看主从同步状态,Slave_IO_Running、Slave_SQL_Running都变为Yes。

主从复制测试:

  1. 在主数据库上新建库、使用库、新建表、插入数据
    create database db01;
    use db01;
    create table t1 (id int, name varchar(20));
    insert into t1 values (1, 'abc');

  2. 在从数据库上使用库、查看记录
    show databases;
    use db01;
    select * from t1;

相关文章
|
弹性计算 安全 Ubuntu
docker启动容器提示read init-p: connection reset by peer: unknown问题
docker启动容器提示read init-p: connection reset by peer: unknown问题
|
Ubuntu Linux
Linux(21) Linux自定义开机启动脚本或命令
Linux(21) Linux自定义开机启动脚本或命令
1125 3
|
3月前
|
jenkins Java 持续交付
Jenkins前置配置
本文介绍Jenkins与GitLab集成的完整配置流程:包括GitLab账号创建、SSH密钥配置、API Token生成,Jenkins中GitLab连接、凭据管理、全局Git信息设置,以及节点服务器环境搭建(JDK、Maven、Node、Docker等),并详细说明Jenkins节点通过SSH方式接入的步骤,实现自动化拉取代码、构建打包与持续集成。
|
3月前
|
缓存 前端开发 JavaScript
头条面经
涵盖前端、网络、JS核心、框架及算法等多方面知识,包括深拷贝、双向绑定、HTTP缓存、跨域、Vue原理、TCP/UDP、设计模式、事件循环、类型判断、闭包、原型链、性能优化等高频面试题,全面考察技术深度与综合能力。
|
8月前
|
Kubernetes Ubuntu 网络安全
Ubuntu系统关闭防火墙的正确方式
Ubuntu系统关闭防火墙的正确方式
1726 2
|
5月前
|
运维 Ubuntu 关系型数据库
MySQL包安装 -- Debian系列(Apt资源库安装MySQL)
本文介绍了在Debian系列系统(如Ubuntu、Debian 11/12)中通过APT仓库安装MySQL 8.0和8.4版本的完整步骤,涵盖添加官方源、配置国内镜像、安装服务及初始化设置,并验证运行状态,适用于各类Linux运维场景。
1761 0
MySQL包安装 -- Debian系列(Apt资源库安装MySQL)
|
12月前
|
Ubuntu 关系型数据库 MySQL
容器技术实践:在Ubuntu上使用Docker安装MySQL的步骤。
通过以上的操作,你已经步入了Docker和MySQL的世界,享受了容器技术给你带来的便利。这个旅程中你可能会遇到各种挑战,但是只要你沿着我们划定的路线行进,你就一定可以达到目的地。这就是Ubuntu、Docker和MySQL的灵魂所在,它们为你开辟了一条通往新探索的道路,带你亲身感受到了技术的力量。欢迎在Ubuntu的广阔大海中探索,用Docker技术引领你的航行,随时准备感受新技术带来的震撼和乐趣。
469 16
|
传感器 监控 前端开发
zabbix中IPMI (Intelligent Platform Management Interface)
zabbix中IPMI (Intelligent Platform Management Interface)
874 68
|
11月前
|
Ubuntu 关系型数据库 MySQL
在Ubuntu系统的Docker上安装MySQL的方法
以上的步骤就是在Ubuntu系统的Docker上安装MySQL的详细方法,希望对你有所帮助!
1181 12
|
关系型数据库 MySQL 数据库
使用Docker部署的MySQL数据库,数据表里的中文读取之后变成问号,如何处理?
【10月更文挑战第1天】使用Docker部署的MySQL数据库,数据表里的中文读取之后变成问号,如何处理?
652 3