一. 前言
?? 許久沒(méi)有更新, 是我偷懶了. 后果也是很嚴(yán)重的, 至少為了寫這篇文章我又復(fù)習(xí)了半個(gè)小時(shí), 哈哈. 今天寫的是docker中的數(shù)據(jù)卷, 我們開(kāi)始吧...
二. 什么是數(shù)據(jù)卷? 它有什么好處?
?? 回答上述兩個(gè)問(wèn)題之前我先提出一個(gè)問(wèn)題: 經(jīng)過(guò)上一篇文章的入門, 我們學(xué)會(huì)了docker的基本使用, 諸如拉取鏡像、啟動(dòng)容器之類的操作. 那假如我們不小心把容器刪除了, 那容器中的數(shù)據(jù)也會(huì)隨之消失, 這顯然是不對(duì)的. 這時(shí)我們就需要將容器中的文件備份出來(lái)才行, 怎么做?
?? docker為我們提供了一個(gè)cp
命令, 雖然不是本文主題, 但還是有必要提一下, 使用如下:
?? docker cp 容器id:/源路徑 /目標(biāo)路徑
---將容器下的文件拷貝到linux
?? docker cp /源路徑 容器id:/目標(biāo)路徑
---或者將linux下的文件拷貝到容器
這么看可能有迷...我來(lái)演示一下吧, 下圖中, 我是將linux系統(tǒng)/home目錄下的test.txt文件拷貝到docker容器的/opt目錄下:
?? 很簡(jiǎn)單吧? 如果要將docker中的文件拷貝出來(lái), 只需要對(duì)調(diào)源路徑和目標(biāo)路徑就可以了. 不過(guò)這種方式雖然簡(jiǎn)單, 但顯然滿足不了我們備份的需求. 比如我們mysql的數(shù)據(jù)文件, 不可能寫個(gè)腳本就干這事兒, 一是消耗性能, 二是可能數(shù)據(jù)還不一定同步.
?? 假如我們能把docker容器內(nèi)部的文件和linux上的文件建立一個(gè)關(guān)聯(lián), 任何一邊修改變動(dòng)時(shí), 另一邊自動(dòng)同步那該多好. 哈哈, 湊巧的是, docker的數(shù)據(jù)卷就是干這個(gè)事情的. ok, 下面我就來(lái)記錄一下安裝mysql并使用數(shù)據(jù)卷備份和同步數(shù)據(jù)文件到linux吧.
三. 使用docker搭建mysql并掛載數(shù)據(jù)卷
(1) 可以使用-v來(lái)掛載路徑: docker run -it -v 主機(jī)目錄:容器目錄
(2) 拉取mysql:8鏡像, docker pull mysql:8
(3) 啟動(dòng)mysql:8, docker run -d -it --rm -p 3306:3306 -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=1234 --name mysql01 mysql:8
參數(shù)說(shuō)明:
--rm # 容器停止即刪除實(shí)例, 可以不加
-e # 添加環(huán)境變量, MYSQL_ROOT_PASSWORD設(shè)置密碼
-v # 掛載數(shù)據(jù)卷, 可以使用多個(gè)-v來(lái)掛載多個(gè)數(shù)據(jù)卷, 掛載之后, 掛載的兩個(gè)目錄下的文件會(huì)進(jìn)行同步
(4) 不過(guò)我遇到一個(gè)問(wèn)題, 就是將mysql容器內(nèi)部的配置文件掛載到linux外部之后, 會(huì)啟動(dòng)失敗或配置文件沒(méi)有同步到宿主機(jī). 具體原因在下也不知道, 歡迎留言告知. 不過(guò), 據(jù)我測(cè)試, 只要將配置文件事先創(chuàng)建好, 再進(jìn)行掛載就可以了. 以下是官網(wǎng)的說(shuō)法:
官網(wǎng)的示例中掛載的是一個(gè)目錄, 顯而易見(jiàn)那個(gè)/my/custom目錄中已經(jīng)存在一個(gè)自定義的配置文件, 而且還說(shuō)是一個(gè)叫做config-file.cnf文件. 所以, 我也創(chuàng)建了一個(gè)扔在目錄下, 并且什么都沒(méi)配:
隨后掛載并啟動(dòng)了它:
docker run -itd -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=1234 --name mysql mysql:8
redis同理:
但是需要下載一份兒配置文件, 如果想要自定義配置的話:
wget http://download.redis.io/redis-stable/redis.conf
由于容器可能取不到宿主機(jī)的東西, 給它開(kāi)放權(quán)限: chmod 666 redis.conf
另外注意, 如果docker使用-d參數(shù), 則表示守護(hù)進(jìn)程模式啟動(dòng), 所以配置文件中的daemonize需要保持為no
daemonize no
docker run -itd -p 6379:6379 -v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf -v /mydata/redis/data:/data --name redis5 redis:5.0.14 redis-server /etc/redis/redis.conf
然后它啟動(dòng)成功了, 不過(guò)我想應(yīng)該是配置文件需要自己創(chuàng)建的原因, 因?yàn)槲以诓粧燧d配置文件的情況下進(jìn)入過(guò)mysql的容器去查看配置文件, 里邊兒的配置文件也是什么都沒(méi)有配置.
(5) 總而言之, 配置相關(guān)只需要掛載文件夾, 然后自己定義配置內(nèi)容, 配置文件的名稱可以是config-file.cnf亿卤。
(6) 這時(shí)候, 就算不小心將mysql的容器刪除了也沒(méi)有關(guān)系, 只要再次指定數(shù)據(jù)卷的掛載路徑, 數(shù)據(jù)就回來(lái)啦.
四. 掛載數(shù)據(jù)卷的三種方式及區(qū)別
掛載的方式分別有如下三種:
(1) 匿名掛載: -v 容器內(nèi)路徑
.
比如: docker run -d -it --rm -p 8080:8080 --name tomcat01 -v /usr/local/tomcat/webapps tomcat:9
此時(shí), tomcat的webapps會(huì)被掛載到宿主機(jī)的/var/lib/docker/volumes
文件夾下, 并隨機(jī)生成一個(gè)文件夾. 可以使用docker volumes ls
命令查看有哪些匿名掛載的數(shù)據(jù)卷.
(2) 具名掛載: -v 卷名:容器內(nèi)路徑
比如: docker run -d -it --rm -p 8080:8080 --name tomcat01 -v tomcat01:/usr/local/tomcat/webapps tomcat:9
與匿名掛載的區(qū)別在于, 它在/var/lib/docker/volumes
目錄下生成的文件夾名不再是無(wú)意義的了, 而是你指定的名稱, 如此處的tomcat01
(3) 指定路徑掛載: -v 宿主機(jī)路徑:容器內(nèi)路徑
這種方式就是上面演示的方式. 區(qū)別也是顯而易見(jiàn), 自定義了數(shù)據(jù)的保存位置.
好了, 數(shù)據(jù)卷的使用就記錄到這里, 歡迎留言指正和交流