Docker的相關操做 與 Docker下MySQL容器的安裝
https://www.cnblogs.com/yumq/p/14253360.htmlhtml
本次實驗我是在單機狀態下進行mysql的主從複製,和多機的原理同樣mysql
相關參數sql
--name 容器的名稱命名 -p 暴露端口,端口的映射 上述是本機的3307端口映射到容器內的3306端口,訪問本機3307就能訪問容器內的數據庫(3306端口) --privileged=true 賦予容器內以root用戶來操做 -it 交互運行 --hostname docker1 容器內hostname,我是爲了區分docker添加的,若是用不到能夠去掉 -e MYSQL_ROOT_PASSWORD=123456 環境參數配置,配置mysql root角色的密碼 -e MYSQL_DATABASE=ymq 建立一個ymq的數據庫,用不到的能夠刪除掉 -e MYSQL_USER=user -e MYSQL_PASSWORD=pass `-v 很是重要,至關於docker容器的寶貴文件(相關配置,相關數據,相關日誌)存放到容器外(即雲服務器中),這樣作的目的是不把數據放在容器內,保障數據安全` -v /home/mysql/docker-data/3307/conf:/etc/mysql/conf.d -v /home/mysql/docker-data/3307/data/:/var/lib/mysql -v /home/mysql/docker-data/3307/logs/:/var/log/mysql -d mysql:5.7 -d 後臺運行容器,並返回容器ID; mysql:5.7 運行的鏡像文件
直接運行下面代碼就能啓動mysqldocker
docker run --name mysqldocker1 -p 3306:3306 --privileged=true -it -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=ymq --hostname docker1 -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -v /home/mysql/docker-data/mysql1/conf:/etc/mysql/conf.d -v /home/mysql/docker-data/mysql1/data/:/var/lib/mysql -v /home/mysql/docker-data/mysql1/logs/:/var/log/mysql -d mysql:5.7
docker run --name mysqldocker2 -p 3307:3306 --privileged=true -it -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=ymq --hostname docker2 -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -v /home/mysql/docker-data/mysql2/conf:/etc/mysql/conf.d -v /home/mysql/docker-data/mysql2/data/:/var/lib/mysql -v /home/mysql/docker-data/mysql2/logs/:/var/log/mytsql -d mysql:5.7
docker run --name mysqldocker3 -p 3308:3306 --privileged=true -it -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=ymq --hostname docker3 -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -v /home/mysql/docker-data/mysql3/conf:/etc/mysql/conf.d -v /home/mysql/docker-data/mysql3/data/:/var/lib/mysql -v /home/mysql/docker-data/mysql3/logs/:/var/log/mytsql -d mysql:5.7
查看Docker內容器狀態shell
docker ps
如今是啓動成功了,可是沒有配置主從相關配置,因此咱們下一步要配置MySQL。
由於運行的時候咱們將容器內的配置目錄掛載到本機的/home/mysql/docker-data/
下
因此咱們將對應容器的配置文件複製到對應目錄下的conf目錄下
數據庫
my.cnf 文件內容以下安全
# For advice on how to change settings please see # http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html [mysqld] # # Remove leading # and set to the amount of RAM for the most important data # cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%. # innodb_buffer_pool_size = 128M # # Remove leading # to turn on a very important data integrity option: logging # changes to the binary log between backups. # log_bin # # Remove leading # to set options mainly useful for reporting servers. # The server defaults are faster for transactions and fast SELECTs. # Adjust sizes as needed, experiment to find the optimal values. # join_buffer_size = 128M # sort_buffer_size = 2M # read_rnd_buffer_size = 2M #datadir=/home/mysql/docker-data/3307/data #socket=/home/mysql/docker-data/3307/mysql.sock character_set_server=utf8 init_connect='SET NAMES utf8' # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 #log-error=/home/mysql/docker-data/3307/logs/mysqld.log #pid-file=/home/mysql/docker-data/3307/mysqld.pid lower_case_table_names=1 server-id=4122 log-bin=mysql-bin auto_increment_increment=2 auto_increment_offset=1 #rpl_semi_sync_master_enabled=1 #rpl_semi_sync_master_timeout=10000
配置說明
三個容器的my.conf 中不能相同server-id
如上圖個人第一個mysql的server-id爲4122,那個我第二個server-id我就設置爲4123
log-bin=mysql-bin 是開啓bin-log
auto_increment_offset 表示自增加字段從哪一個數開始,指字段一次遞增多少,他的取值範圍是1 .. 65535
auto_increment_increment 表示自增加字段每次遞增的量,指自增字段的起始值,其默認值是1,取值範圍是1 .. 65535
爲了不兩臺服務器同時作更新時自增加字段的值之間發生衝突,通常在主主同步配置時,
須要將兩臺服務器的auto_increment_increment增加量都配置爲2,
而要把auto_increment_offset分別配置爲1和2。
固然若是三臺就須要auto_increment_increment增加量都配置爲3
auto_increment_offset分別設置爲1和2和3bash
#先查看全部容器 docker ps #而後一個個重啓相應的容器 docker restart 容器id #由於我容器只有這三個mysql 因此我以這樣方式重啓所有容器 docker restart $(docker ps -aq)
我是以docker1下的mysql做爲master主機服務器
進入docker1socket
docker exec -it 容器ID/容器名字 /bin/bash
看到
root@docker1
時表示在docker1容器內
若是操做完畢就exit退出容器
根據容器的配置 我設置的密碼爲123456
GRANT REPLICATION SLAVE,FILE,REPLICATION CLIENT ON *.* TO 'repluser'@'%' IDENTIFIED BY '123456'; FLUSH PRIVILEGES;
show master status;
這樣master配置就成功了
分別進入docker2 和 docker3
docker exec -it 容器ID/容器名字 /bin/bash
注意當看到光標前顯示 root@docker2 和 root@docker3 時才代表進入成功
若是須要退出用exit進行退出。
change master to master_host='172.24.7.187',master_port=3306,master_user='repluser',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=154;
master_host='172.24.7.187' 主機我是用的雲服務器內網地址 master_port=3306 是master主機的端口,master_user='repluser' master主機上的角色
master_log_file='mysql-bin.000001',master_log_pos=154; 必須與主機的二進制同樣
start slave;
若是須要關閉就 stop slave;
show slave status\G;
若是都爲YES 就代表配置成功,主從複製搭建完成!!
若是 Slave_IO_Running: NO 但 Slave_SQL_Running: Yes
多是在slave中設置master信息的sql中master_host地址填的127.0.0.1 或者 localhost。
由於這兩個地址會先去訪問容器內的本機,而不是容器外的mysql,因此須要換成雲服務器的公網或內網ip
若是 Slave_IO_Running: Yes 但 Slave_SQL_Running: NO
多是主從同步的時候相關數據同步上的錯誤,在slave端 刪除衝突的數據就行,具體的錯誤信息會在
show slave status\G
下面的信息中指出NO的緣由