在參考了大量文章之後,終於弄懂了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