Docker 安装Mariadb

Docker 安装Mariadb

  1. docker pull mariadb:latest # 如果不加:latest 标签,docker会把所有的镜像版本都拉下来。
  2. 设定参数
    1. -name <容器名称>
    2. -e MYSQL_ROOT_PASSWORD =‘<数据库root密码>’
    3. -p <映射到本机的端口>:3306
    4. -v <本机的数据库存放目录>:/var/lib/mysql
    5. 设定 MYSQL_USER、MYSQL_PASSWORD、MYSQL_DATABASE 环境变量可以使容器在运行时同时创建你所需要的数据库和带有全部权限的用户及其对应密码
  3. 设定 TERM 环境变量的值可以解决容器不能进入 mysql 控制台的问题。

对于不是自己建立的镜像,建立出来的容器未必能一次达到要求,建议是将run命令写成脚本,创建后使用 docker inspect <容器名>仔细查看容器信息,关注镜像公开的端口和文件目录。如果发现达不到要求,使用 docker rm -f <容器名>删除容器,修改 run 脚本再次运行,直到满意为止。

下面是我的命令:

1
2
3
4
5
6
7
8
9
docker run --name mysql_master \
-p 3306:3306 \
-v /var/lib/mysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-e MYSQL_USER=simple \
-e MYSQL_PASSWORD=simpe4J \
-e MYSQL_DATABASE=demo \
-e TERM=linux \
-d mariadb

穿件完成,就可以通过如下的命令进行连接

1
2
3
4
# 不能使用默认localhost的socket进行
mysql -p -u root --protocol=tcp
# 或者
mysql -h 127.0.0.1 -u root -p

配置主从复制

  1. 把前面启动的master 作为主数据库,再启动另一个容器作为从库.
1
2
3
4
5
6
7
8
9
10
11
12
13
# docker run --name <从数据库名> 
# -e MYSQL_ROOT_PASSWORD=<从数据库root密码>
# --link <主数据库容器名>:master_db
# -d mariadb
docker run --name mysql_slave01 \
-e MYSQL_ROOT_PASSWORD=root \
--link mysql_master:mysql_master \
-d mariadb

docker run --name mysql_slave02 \
-e MYSQL_ROOT_PASSWORD=root \
--link mysql_master:mysql_master \
-d mariadb
  1. 配置两个数据库了,首先安装vim,所以在两个容器内都需要:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # 更新成国内的源,这样速度快
    cat > /etc/apt/sources.list

    deb http://mirrors.163.com/debian/ jessie main non-free contrib
    deb http://mirrors.163.com/debian/ jessie-updates main non-free contrib
    deb http://mirrors.163.com/debian/ jessie-backports main non-free contrib
    deb-src http://mirrors.163.com/debian/ jessie main non-free contrib
    deb-src http://mirrors.163.com/debian/ jessie-updates main non-free contrib
    deb-src http://mirrors.163.com/debian/ jessie-backports main non-free contrib
    deb http://mirrors.163.com/debian-security/ jessie/updates main non-free contrib
    deb-src http://mirrors.163.com/debian-security/ jessie/updates main non-free contrib

    # 更新数据源 && 安装vim
    apt-get update && apt-get install vim

首先修改主数据库:

1
docker exec -it mysql_master /bin/bash

进入主数据库容器内之后:vi /etc/mysql/my.cnf:

1
2
3
4
5
6
server-id               = 1
log_bin = /var/log/mysql/mariadb-bin
log_bin_index = /var/log/mysql/mariadb-bin.index
#如果只同步某些库,忽略某些库
binlog-do-db=demo
binlog-ignore-db=mysql

在容器控制台连接上数据库执行:

1
2
3
4
5
6
7
8
9
10
11
12
13
/*设定用于同步的账号、密码*/
GRANT REPLICATION SLAVE ON *.* TO 'sync'@'%' IDENTIFIED BY 'sync';
/*保存权限设定*/
flush privileges;
/*查看主数据日志状态,需要记住查询结果 File 和 Position 值,是从数据库复制的日志起点*/
show master status;
/*结果如下:
+--------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------------+----------+--------------+------------------+
| mariadb-bin.000001 | 678 | | |
+--------------------+----------+--------------+------------------+
*/

进入从库(同理操作另外一个从库):

1
docker exec -it mysql_slave01 /bin/bash

编辑从数据库的 my.cnf:进入主数据库容器内之后:vi /etc/mysql/my.cnf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
server-id               = 2
relay_log = /var/log/mysql/relay-bin
relay_log_index = /var/log/mysql/relay-bin.index
#如果只同步某些库,忽略某些库
#replicate-do-db=demo
#replicate-ignore-db=mysql

# 如果需要另外一个主的话要配置如下信息.
#log_bin = /var/log/mysql/mariadb-bin
#log_bin_index = /var/log/mysql/mariadb-bin.index
#log_slave_updates = 1 # 从主库同步之后是否写入到自己的bin log
#read_only=1 # 对于super和all的权限不生效
#另外一个库配置
server-id = 3
relay_log = /var/log/mysql/relay-bin
relay_log_index = /var/log/mysql/relay-bin.index

重启主从数据库.

在容器控制台连接上数据库执行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/*如果已经开启了同步,停止同步*/
stop slave;
/*设定主数据库*/
change master to
master_host='<主机名称或者ip地址>',
master_user='<同步用户名>',
master_password='<同步用户密码>',
master_port=3306,
master_log_file='<主数据库查询得到的 File 值>',
master_log_pos=<主数据库查询得到的 Positions 值>;
下面是我的命令:
change master to
master_host='mysql_master',
master_user='sync',
master_password='sync',
master_port=3306,
master_log_file='mariadb-bin.000001',
master_log_pos=0;
/*开启从数据库复制*/
start slave;
最后可以通过
show slave status;
/*
查看到如下信息算启动复制成功:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
*/

4.至此我们就建立了一个基于 Docker 的 Mariadb 数据库,对于读写分离,再开新一篇写.