關於Docker in MySQL中的數據持久化


1拉取鏡像

docker pull mysql

2運行容器(同時設置密碼和讓數據庫名生效)

docker run --name mysqldock -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=inst1 -d -p 3306:3306 mysql

 3進入容器

docker exec -it mysqldock bash

4進入mysql:

mysql -uroot -p

 5查看數據表(發現inst1已經在容器初始化時創建)

show databases;

6使用Navicat連上mysql后崽創建一個庫inst2並在xshell終端執行show databases;查看庫是否創建成功

7將容器保存為新鏡像

docker commit mysqldock

 8刪除所有容器

docker rm -f $(docker ps -aq)

9使用新鏡像運行容器並進入容器,然后登陸數據庫后執行查表操作(此時發現里面只有一張表inst1),然后使用Navicat查看inst1表的內容是空的

docker run --name mysqldock2 -e MYSQL_ROOT_PASSWORD=123456 -d -p 3360:3360 7796d57a6427
docker exec -it mysqldock2 bash
mysql -uroot -p
show databases;

 以上說明一個問題:數據掛載在容器的數據卷中,使用commit命令生成新的鏡像后,數據並不能保留在數據內,

10執行exit退出數據庫登陸后,查看mysql默認的掛載路徑:docker inspect mysqldock2

"Mounts": [
            {
                "Type": "volume",
                "Name": "92c09f84682667cc743a3a0d0cdd48354ebd63e20bd6f0e2a267910c23eba33b",
                "Source": "/var/lib/docker/volumes/92c09f84682667cc743a3a0d0cdd48354ebd63e20bd6f0e2a267910c23eba33b/_data",
                "Destination": "/var/lib/mysql",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }

 結論:

在宿主機創建一個專門存放數據文件夾路徑,新建容器的時候映射該路徑到容器,俗稱數據掛載,這樣可以很好解決數據丟失的問題

那對於上面的情況,既已經有一個容器使用了volume(docker默認掛載),想把volume里的數據在新的容器中使用怎么辦呢?

我們可以先把mysqldock容器中所需要的文件拷貝出來到本地的/var/own/mysqldata

docker cp mysqldock:/var/lib/mysql /var/own/mysqldata

然后在創建新的mysql容器時,掛載該文件即可

docker run -v /var/own/mysqldata:/var/lib/mysql --name mysqlnew -d mysql

這樣新的容器就可以保留mysqldock中的數據了

 11除了創建容器時指定掛載目錄這個方法外,還有一種方法就是使用--volumes-from參數指定其它容器的volume

docker run --name mysql3 --volumes-from mysqldock -d mysql

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM