docker 搭建MySQL主從模式

安裝docker(目標機為centos7)
卸載舊版本

sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

安裝Docker Engine-Community

在新主機上首次安裝Docker Engine-Community之前需要設置Docker 倉庫,之后可以從倉庫安裝和更新Docker

    安裝所需的軟件包。yum-utils 提供了 yum-config-manager ,并且 device mapper 存儲驅動程序需要 device-mapper-persistent-data 和 lvm2。

    $ sudo yum install -y yum-utils \
      device-mapper-persistent-data \
      lvm2

    使用以下命令來設置穩定的倉庫

    sudo yum-config-manager \
        --add-repo \
        https://download.docker.com/linux/centos/docker-ce.repo

    安裝Docker Engine-Community 最新版本 或者 按照下一步安裝特定版本

    sudo yum install docker-ce docker-ce-cli containerd.io

    列出存儲庫中可用版本。按照版本號從高到底排列

    yum list docker-ce --showduplicates | sort -r

    docker-ce.x86_64  3:18.09.1-3.el7                     docker-ce-stable
    docker-ce.x86_64  3:18.09.0-3.el7                     docker-ce-stable
    docker-ce.x86_64  18.06.1.ce-3.el7                    docker-ce-stable
    docker-ce.x86_64  18.06.0.ce-3.el7                    docker-ce-stable

    指定軟件包名稱 安裝docker-ce 和docker-ce-cli

    sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io

啟動docker

sudo systemctl start docker

docker 基本命令

# 查看下載的鏡像
docker images
# 查看運行中的容器
docker ps
# 查看所有容器包含沒有運行
docker ps -a
# 移除鏡像 
docker rm <容器id/容器名稱>
# 啟動停止容器
docker start/stop <容器id/容器名稱>

利用docker搭建mysql主從服務器(例子中采用一主一從)
首先拉取MySQL鏡像

docker pull mysql:5.7

利用此鏡像啟動主從容器

# master 主庫 
docker run -p 3339:3306 --name master -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
# slave 從庫 
docker run -p 3340:3306 --name slave -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7

說明:-p port1:port2 其中port1 為容器對外映射的端口號(宿主機端口),因為docker容器是相互獨立的,每個容器有自己的獨立ip,所以不同容器使用相同的端口不會沖突,這里的port2 我們盡量使用MySQL默認的3306,否則可能會出現無法通過IP連接docker容器的mysql。

使用 docker -ps 查看容器運行情況

[root@localhost ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
ce752c99a010        mysql:5.7           "docker-entrypoint.s…"   6 hours ago         Up 5 hours          33060/tcp, 0.0.0.0:3341->3306/tcp   slave2
701ccedc1e95        mysql:5.7           "docker-entrypoint.s…"   6 hours ago         Up 5 hours          33060/tcp, 0.0.0.0:3340->3306/tcp   slave1

此時還不能用客戶端連接,需要MySQL進行遠程連接授權

進入容器

docker exec -it <容器id/名稱> bash

登錄mysql

mysql -uroot -p

進入MySQL后執行授權操作

-- 對遠程連接進行授權
GRANT ALL ON *.* TO 'root'@'%';
-- 更改密碼的加密規則
ALTER USER 'root'@'%' IDENTIFIED BY 'root' PASSWORD EXPIRE NEVER;
-- 更改root的密碼
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';
-- 刷新權限
flush privileges;

配置master

通過 docker exec -it <容器id/名稱> bash進入容器內部。使用vim /etc/mysql/my.cnf 修改MySQL配置

會出現如下問題。

    Reading package lists... Done
    Building dependency tree       
    Reading state information... Done
    E: Unable to locate package vim

    需要首先執行 apt-get update 然后執行 apt-get install vim 即可

在my.cnf 中添加如下配置

[mysqld]
## 同一局域網內注意要唯一
server-id=100  
## 開啟二進制日志功能,可以隨便取(關鍵)
log-bin=mysql-bin

配置完成后重啟即可生效 ,在容器內部 使用命令 service mysql restart,此時容器會停止,我們還需要 docker start <容器id/容器名稱> 啟動容器。
配置slave

my.cnf中添加配置

[mysqld]
## 設置server_id,注意要唯一
server-id=101  
## 開啟二進制日志功能,以備Slave作為其它Slave的Master時使用
log-bin=mysql-slave-bin   
## relay_log配置中繼日志
relay_log=edu-mysql-relay-bin  

連接master 和 slave

首先進入master mysql 執行 show master status;

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      154 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.25 sec)

記錄File 和 position 值。

然后,從slave進入MySQL執行

change master to master_host='172.17.0.2', master_user='root', master_password='root', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos= 154, master_connect_retry=30;

master_host 說明 :Master的地址,指的是容器的獨立ip,可以通過docker inspect --format='{{.NetworkSettings.IPAddress}}' <容器名稱|容器id查詢容器的ip>

[root@localhost ~]# docker inspect --format='{{.NetworkSettings.IPAddress}}' mymysql
172.17.0.2

執行命令 start slave 啟動slave。

查看slave狀態 show slave status \G;

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容