前面方式太过于麻烦,每次都需要进入容器去修改my.cnf文件,现在我们准备优化下流程。思路是将本地my.cnf文件拷贝到容器中去,这样就方便多了。

    先看看整体目录结构:

    image.png

    接下来看看master、slave1、slave2文件夹下的配置

    image.png

    其中3个文件夹下的Dockerfile文件内容都一样

    1. from mysql:8
    2. COPY ./my.cnf /etc/mysql/

    基于mysql:8基础镜像,并将当前目录下my.cnf文件拷贝到容器/etc/mysql/目录下

    接下来看看master的my.cnf文件

    1. [mysqld]
    2. pid-file = /var/run/mysqld/mysqld.pid
    3. socket = /var/run/mysqld/mysqld.sock
    4. datadir = /var/lib/mysql
    5. secure-file-priv= NULL
    6. # Custom config should go here
    7. !includedir /etc/mysql/conf.d/
    8. log-bin=mysql-bin
    9. server-id=1

    其它slave1和slave2的my.cnf文件一样,只有server-id不一样就,分别是2和3

    最后来看看根目录下的 docker-compose.yml

    1. version: '3'
    2. services:
    3. master:
    4. build: ./master/
    5. ports:
    6. - "3306:3306"
    7. environment:
    8. MYSQL_ROOT_PASSWORD: root
    9. networks:
    10. mysql_network:
    11. ipv4_address: 172.20.0.2
    12. slave1:
    13. build: ./slave1/
    14. ports:
    15. - "3307:3306"
    16. environment:
    17. MYSQL_ROOT_PASSWORD: root
    18. networks:
    19. mysql_network:
    20. ipv4_address: 172.20.0.3
    21. slave2:
    22. build: ./slave2/
    23. ports:
    24. - "3308:3306"
    25. environment:
    26. MYSQL_ROOT_PASSWORD: root
    27. networks:
    28. mysql_network:
    29. ipv4_address: 172.20.0.4
    30. networks:
    31. mysql_network:
    32. ipam:
    33. config:
    34. - subnet: 172.20.0.0/16
    35. getway: 172.20.0.1

    这样就可以在根目录下运行cmd,在执行

    1. docker-compose up -d

    此时容器就部署好了,通过docker-desk可以看到,容器已经运行了
    image.png

    最后主从配置和之前的一样

    1) master创建slave账号查看binlog

    1. create user 'slave'@'172.20.0.%' identified with mysql_native_password by '123456';
    2. grant replication slave on *.* to 'slave'@'172.20.0.%';
    3. flush privileges;
    4. show master status;

    2) 从节点配置主从配置

    1. CHANGE MASTER TO
    2. MASTER_HOST='172.20.0.2',
    3. MASTER_USER='slave',
    4. MASTER_PASSWORD='123456',
    5. MASTER_LOG_FILE='mysql-bin.000003',
    6. MASTER_LOG_POS=853;
    7. start slave;
    8. show slave status;

    最后进行验证方式和上一篇介绍的是一致的。

    优化:当删除容器的时候docker中的数据就没了,所以需要将docker中的数据存放到宿主机上,只需要修改docker-compose.yml文件就可以了

    在每个节点我们添加volumes

    1. version: '3'
    2. services:
    3. master:
    4. build: ./master/
    5. ports:
    6. - "3306:3306"
    7. environment:
    8. MYSQL_ROOT_PASSWORD: root
    9. networks:
    10. mysql_network:
    11. ipv4_address: 172.20.0.2
    12. volumes:
    13. - "./master/data:/var/lib/mysql"
    14. slave1:
    15. build: ./slave1/
    16. ports:
    17. - "3307:3306"
    18. environment:
    19. MYSQL_ROOT_PASSWORD: root
    20. networks:
    21. mysql_network:
    22. ipv4_address: 172.20.0.3
    23. volumes:
    24. - "./slave1/data:/var/lib/mysql"
    25. slave2:
    26. build: ./slave2/
    27. ports:
    28. - "3308:3306"
    29. environment:
    30. MYSQL_ROOT_PASSWORD: root
    31. networks:
    32. mysql_network:
    33. ipv4_address: 172.20.0.4
    34. volumes:
    35. - "./slave2/data:/var/lib/mysql"
    36. networks:
    37. mysql_network:
    38. ipam:
    39. config:
    40. - subnet: 172.20.0.0/16
    41. getway: 172.20.0.1

    这样即使容器删除了,下次重新创建的容器也会保留之前的数据