docker通過數據卷掛載到本地實現mysql配置本地化、數據本地化

在參考了大量文章之後,終於弄懂了mysql容器實現配置本地化、數據本地化的方法。下面我將詳細介紹,如果對大家有用的話希望大家關注或者評論一下!在過程中哪一步報錯了也可以在評論中說下!

 

1.先把局域網內連接mysql容器 

第一步:從docker中拉取MySQL鏡像

docker pull mysql

 

第二步:生成mysql容器 

docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql --character-set-server=utf8 --collation-server=utf8_general_ci

 

 

參數說明:

-e MYSQL_ROOT_PASSWORD="123456":設置root用戶密碼

--character-set-server=utf8:設置字符集爲utf8

--collation-server=utf8_general_cli:設置字符比較規則爲utf8_general_cli

 

 

第三步:測試連接MySQL

這裏我使用navicat遠程連接,連接MySQL前需要防火牆開放端口或者關閉防火牆。

 

開放端口:

$ sudo firewall-cmd --add-port=3306/tcp

關閉防火牆:

$ sudo systemctl stop firewalld

 

一般這個時候用navicat會報錯連接不了,如果連接成功可以跳過

解決方案如下:

1.輸入docker exec -it mysql bash進入容器

2.接着輸入mysql -uroot -p進入mysql 密碼是生成mysql容器時指定的MYSQL_ROOT_PASSWORD

3.輸入ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

此時就能連接上了

 

若在輸入ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';報錯

ERROR 1396 (HY000): Operation ALTER USER failed for 'root'@'localhost'

則依次輸入:

 use mysql;
 select user,host from user;

#此時會輸出:

+------------------+-----------+
| user             | host      |
+------------------+-----------+
| root             | %         |
| admin            | localhost |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| zhangj           | localhost |
+------------------+-----------+

 

注意我的root,host是'%'  若你的是localhost,則命令改爲:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';

 

此時用navicat就可以連接成功了!

 

2.實現docker掛載數據捲到本地 mysql實現容器配置本地化

當希望在本地上配置容器中的mysql時,發現一個問題,本地需要完整的配置文件目錄,如果本地是空目錄,那麼容器中的配置目錄也是空的所以不能運行鏡像,這裏解決這個問題,思路是任意運行一個容器,把裏面的配置目錄複製到本地,然後刪除這個容器,再創建新的容器,並把複製出來的配置目錄和容器中的配置目錄同步。

 

第一步:創建一個本地配置目錄

輸入命令:mkdir -p /root/DockerCommonConfig/MysqlConfig/,建立文件夾路徑。

然後進入到該目錄下 cd /root/DockerCommonConfig/MysqlConfig

 

第二步:創建任意一個鏡像並映射配置目錄

docker run --name tempMysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -v $("pwd"):/app -d mysql --character-set-server=utf8 --collation-server=utf8_general_ci

 

注意:暫時把本地配置目錄和容器中的app文件夾關聯(不能直接關聯容器配置目錄,由於文件同步原因這會導致容器配置目錄爲空無法啓動容器),後續會把容器的配置文件複製到app,達到複製容器文件的目的。

參數解釋:

-v 表示掛載數據卷,格式是 -v localPath:containerPath  本地目錄:容器目錄

$("pwd") 表示當前目錄的路徑,具體自己控制檯輸入 echo $("pwd") 嘗試。

-e 參數必須有 否則容器無法啓動

 

輸入docker ps -a 查看status是Up的就算啓動成功

第三步:複製配置目錄到本地

docker exec -it tempMysql /bin/bash 進入容器命令行,

通過指令:cp -r /etc/mysql /app 指令把etc目錄下的mysql文件夾,複製到app目錄下,由於之前做了本地同步,所以能看到本地文件夾內有mysql文件夾,如下

第四步:刪除容器並創建新容器再同步配置目錄

通過docker rm -f tempMysql 刪除容器,然後本地進入mysql文件夾和容器中的mysql文件夾做同步。

docker run  --name localMysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -v $("pwd")/mysql:/etc/mysql -d mysql  --character-set-server=utf8 --collation-server=utf8_general_ci

參數說明:

--privileged=true:容器內的root擁有真正root權限,否則容器內root只是外部普通用戶權限

-v $("pwd")/mysql:/etc/mysql:映射配置文件

 

 

輸入docker ps -a 查看status是Up的就算啓動成功

 

那麼如何檢查有沒有起作用呢?

我們可以通過修改剛剛同步過來的mysql文件,然後再進容器裏查看是否奏效

cd root/DockerCommonConfig/MysqlConfig/mysql

vim my.cnf

然後在最下面添加一行註釋,按esc退出後 輸入:wq保存

然後我們再次進入到這個容器裏 docker exec -it localMysql /bin/bash

輸入 cd etc/mysql 進入到配置文件目錄下

然後輸入cat my.cnf 擦看該配置文件  發現最後一行已經多出了剛剛添加的註釋

 

我們的mysql實現容器配置本地化就算成功了

 

 

3.最後實現容器數據本地化

第一步:創建一個本地的數據存儲目錄

mkdir root/docker/mysql/data

 

第二步:進入到宿主機內存儲mysql數據的目錄下,把數據文件複製到第一步創建的存儲目錄中

cd /var/lib/mysql

cp -r /var/lib/mysql /root/docker/mysql/data

若宿主機沒有安裝過mysql,就先安裝再複製

 

第三步:創建新容器再同步配置目錄與數據目錄

注意要把上面創建的localMysql先刪掉:docker rm -f localMysql

docker run --name localMysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -v $("pwd")/mysql:/etc/mysql -v /docker/mysql/data/mysql:/var/lib/mysql -d mysql --character-set-server=utf8 --collation-server=utf8_general_ci

 

輸入docker ps -a 查看status是Up的就算啓動成功

那麼如何檢查有沒有起作用呢?

我們可以先進入該容器 docker exec -it localMysql /bin/bash

再進入到mysql裏      mysql -uroot -p

輸入密碼123456

 

然後創建一個數據庫  create database TestDB;

然後我們把該容器刪除,再用上面的命令重新創建一個

先輸入一次exit退出mysql,再輸入一次exit退出容器

然後執行 docker rm -f localMysql

 

然後再創建容器

docker run --name localMysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -v $("pwd")/mysql:/etc/mysql -v /docker/mysql/data/mysql:/var/lib/mysql -d mysql --character-set-server=utf8 --collation-server=utf8_general_ci

 

創建成功後我們進入到該容器再進入到mysql裏

docker exec -it localMysql /bin/bash

mysql -uroot -p

輸入命令show databases;

發現TestDB已經存在,說明我們數據本地化也已經實現了

 

注意:

1.每次容器想要遠程連接時,都要像第一點那樣進入到mysql裏然後輸入

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

2.我們只是把mysql的數據複製過來了/root/docker/mysql/data這個目錄而已,實際上宿主機內的mysql數據還是會存放在/var/lib/mysql中。因此要更改宿主機內的mysql配置 參考這篇博文:https://blog.csdn.net/qq_21573899/article/details/78843075

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章