拉取 MySQL 容器鏡像
docker pull mysql:5.7
這里我使用的是 5.7 版本,如果你想要拉取最新版本的鏡像,可以使用:
docker pull mysql:latest
下載完成之后我們可以先查看一下鏡像是拉取成功
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 f6509bac4980 4 days ago 373MB
創建 MySQL 容器
創建主數據庫容器
docker run --name mysql-master -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
創建從數據庫容器
docker run --name mysql-slave -p 3308:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
這里我們分別使用了 3307 和 3308 端口,因為我們本地宿主機器上已經跑了 MySQL 了,3306 端口被占用。
配置主數據庫
首先,進入容器:
docker exec -it mysql-master /bin/bash root@c72a3032f986:/#
連接 MySQL
mysql -u root -p123456
修改 root 可以通過任何客戶端連接
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
修改 MySQL 配置文檔 /etc/mysql/mysql.conf.d/mysqld.cnf
,在 [mysqld]
段添加以下配置:
log-bin=mysql-bin //[必須]啟用二進制日志
server-id=1 //[必須]服務器標識ID,每台服務器唯一
配置從服務器
首先,進入容器:
docker exec -it mysql-slave /bin/bash root@89bdbb5786ab:/#
連接 MySQL
mysql -u root -p123456
修改 root 可以通過任何客戶端連接
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
修改 MySQL 配置文檔 /etc/mysql/mysql.conf.d/mysqld.cnf
,在 [mysqld]
段添加以下配置:
log-bin=mysql-bin //[必須]啟用二進制日志
server-id=2 //[必須]服務器標識ID,每台服務器唯一
配置 MySQL 主從復制
首先連接 master 服務器,查看數據庫狀態:
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
記錄 File 的值和 Position 的值,等會配置 slave 服務器的時候要用。
接下來連接 slave 服務器,配置主從復制:
mysql>change master to
master_host='x.x.x.x',
master_user='user',
master_log_file='mysql-bin.000003',
master_log_pos=154,
master_port=3307,
master_password='123456';
Query OK, 0 rows affected, 2 warnings (0.03 sec)
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
解釋下配置參數
master_host='x.x.x.x' // 這里填 master 主機 ip
master_log_file='mysql-bin.000003', // 這里填寫 File 的值
master_log_pos=154,// 這里填寫 Position 的值。
mysql> start slave;// 啟動從服務器復制功能
如果不小心配置錯, 輸入 mysql> stop slave; 然后重新錄入一遍就可以了。
接下來我們可以檢查主從連接狀態:
show slave status\G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
這兩個必須是 Yes 為 No 或者 connect 說明沒有連接上。
重啟容器,使配置生效
分別重啟 mysql-master
和 mysql-slave
容器
docker stop mysql-master
docker start mysql-master
docker stop mysql-slave
docker start mysql-slave
測試
在 master 容器中創建一張 user 表;
mysql> CREATE TABLE `user` (
-> `user_id` bigint(20) AUTO_INCREMENT,
-> `username` varchar(30) NOT NULL,
-> `password` varchar(30) DEFAULT NULL,
-> PRIMARY KEY (`user_id`)
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.47 sec)
然后在 slave 容器查看:
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| user |
+----------------+
1 row in set (0.00 sec)
發現已經同步過來了。
在 master 服務器 user
表插入一條數據:
mysql> insert into user(username, password) values ('test_user', 'test_pass');
Query OK, 1 row affected (0.07 sec)
然后看看 slave 服務器是否有同步
mysql> select * from user;
+---------+-----------+-----------+
| user_id | username | password |
+---------+-----------+-----------+
| 1 | test_user | test_pass |
+---------+-----------+-----------+
1 row in set (0.00 sec)
顯然,已經完美同步了。
如果docker容器中沒有vim命令安裝
mv /etc/apt/sources.list /etc/apt/sources.list.bak
echo "deb http://mirrors.163.com/debian/ jessie main non-free contrib"
>> /etc/apt/sources.list
echo "deb http://mirrors.163.com/debian/ jessie-proposed-updates main non-free contrib"
>>/etc/apt/sources.list
echo "deb-src http://mirrors.163.com/debian/ jessie main non-free contrib" >>/etc/apt/sources.list
echo "deb-src http://mirrors.163.com/debian/ jessie-proposed-updates main non-free contrib"
>>/etc/apt/sources.list
#更新安裝源
apt-get update
apt-get install vim命令即可
轉自:http://www.r9it.com/20190727/mysql-master-slave-in-docker.html