【Docker 系列】docker 學(xué)習(xí) 五,容器數(shù)據(jù)卷

什么是容器數(shù)據(jù)卷

思考一個(gè)問(wèn)題,我們?yōu)槭裁匆褂?Docker?

主要是為了可以將應(yīng)用和環(huán)境進(jìn)行打包成鏡像,一鍵部署。

再思考一個(gè)問(wèn)題,容器之間是相互隔離的,如果我們?cè)谌萜髦胁渴痤愃?mysql 這樣的組件,如果把該容器刪除掉,那么 mysql 的數(shù)據(jù)也會(huì)被刪掉了,數(shù)據(jù)丟失了,咱們刪庫(kù)跑路真刺激

事實(shí)上,我們可不能讓這么有風(fēng)險(xiǎn)的事情存在,因此有了卷技術(shù)

卷技術(shù)是容器之間可以共享數(shù)據(jù)的技術(shù),Docker 容器中產(chǎn)生數(shù)據(jù),將數(shù)據(jù)同步到本地

例如咱們將 Docker mysql 容器中的 /usr/mysql 目錄掛載到宿主機(jī)的/home/mysql 目錄

image

使用卷技術(shù),我們就可以讓數(shù)據(jù)得以持久化

實(shí)際上操作起來(lái)就是掛載目錄,將 Docker 容器里面的目錄,掛載到宿主機(jī)上的某個(gè)目錄,這就可以將數(shù)據(jù)持久化和同步了, Docker 容器間的數(shù)據(jù)共享仍然是這樣做的

咱們?nèi)绾问褂脭?shù)據(jù)卷?

啟動(dòng)容器的時(shí)候,直接使用 -v命令就可以進(jìn)行數(shù)據(jù)卷的掛載

docker run -it -v 宿主機(jī)目錄:容器目錄 鏡像名

我們來(lái)嘗試啟動(dòng)一個(gè) nginx,并將宿主機(jī)的 /home/test 目錄和 nginx 的/home目錄掛載起來(lái)

#docker run -d -v /home/test:/home nginx

此時(shí)我們?cè)谒拗鳈C(jī)的/home/test目錄下建一個(gè) test.txt并且寫入一些字符串,再查看容器的/home 目錄 是否有 test.txt

# 宿主機(jī)
root@iZuf66y3tuzn4wp3h02t7pZ:/home/test# echo xiaomotong >> test.txt

# 容器
root@c8405d03a9a1:/home# ls
test.txt

root@c8405d03a9a1:/home# cat test.txt
xiaomotong

我們?cè)谌萜鞯?code>/home目錄下創(chuàng)建一個(gè)test2.txt 文件,同樣寫入一些字符串,再查看 宿主機(jī)的 /home/test 目錄是否有 test2.txt

# 容器
root@c8405d03a9a1:/home# echo xiaozhu >> test2.txt

# 宿主機(jī)
root@iZuf66y3tuzn4wp3h02t7pZ:/home/test# ls
test2.txt  test.txt

root@iZuf66y3tuzn4wp3h02t7pZ:/home/test# cat test2.txt
xiaozhu

查看上述效果,果然是掛載 ok,數(shù)據(jù)確實(shí)同步了,哪怕是我們把 docker 容器刪除掉,數(shù)據(jù)也不會(huì)丟失

docker inspect 容器ID ,查看一下我們創(chuàng)建的容器的掛載情況

# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                  NAMES
c8405d03a9a1   nginx     "/docker-entrypoint.…"   9 minutes ago   Up 9 minutes   80/tcp                 nginx2

# docker inspect c8405d03a9a1


[
    ...
    "Mounts": [
            {
                "Type": "bind",
                "Source": "/home/test",
                "Destination": "/home",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
    ...
]

使用容器數(shù)據(jù)卷的便利之處:

以后我們只需要修改宿主機(jī)里面的目錄和文件,即可和容器中的指定目錄保持同步

mysql 實(shí)戰(zhàn)一波

咱們?cè)賮?lái)一個(gè)實(shí)戰(zhàn),我們一起來(lái)看看數(shù)據(jù)卷如何使用

下載 5.7 版本的 mysql docker 鏡像,也可以下載其他版本,這個(gè)沒(méi)有關(guān)系

# docker pull mysql:5.7
5.7: Pulling from library/mysql     # 5.7版本
33847f680f63: Already exists        # 本層級(jí)已經(jīng)之前已經(jīng)下載過(guò)了
5cb67864e624: Pull complete
1a2b594783f5: Pull complete
b30e406dd925: Pull complete
48901e306e4c: Pull complete
603d2b7147fd: Pull complete
802aa684c1c4: Pull complete
5b5a19178915: Pull complete
f9ce7411c6e4: Pull complete
f51f6977d9b2: Pull complete
aeb6b16ce012: Pull complete
Digest: sha256:be70d18aedc37927293e7947c8de41ae6490ecd4c79df1db40d1b5b5af7d9596
Status: Downloaded newer image for mysql:5.7    
docker.io/library/mysql:5.7         # 真實(shí)的mysql 鏡像地址

啟動(dòng)鏡像,直接使用 -v 來(lái)掛載目錄

使用方式

docker run -it -v 主機(jī)目錄:容器的目錄

開(kāi)始啟動(dòng)鏡像

咱們可以參考 dockerhub 上的文檔

image
image
# docker run  -d -p 8888:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql1 mysql:5.7
23c31b285804cd95130e36ad40d3c07239fe744845ca464b9c80e42c84848bfb

# 解釋一下上述命令
-d 后臺(tái)運(yùn)行
-p 宿主機(jī)端口:容器端口  端口映射
-v 宿主機(jī)目錄:容器目錄  掛載卷
-e 設(shè)置環(huán)境變量
--name 設(shè)置啟動(dòng)容器的名字

咱們可以通過(guò)window 的 workbench 來(lái)遠(yuǎn)程連接一下 mysql

我的是云服務(wù)器,因此輸入云服務(wù)器的地址,端口填入 8888 端口

默認(rèn)用戶名是 root , 密碼是 123456

image

測(cè)試連接 ok ,我們可以來(lái)進(jìn)入數(shù)據(jù)庫(kù)

image

咱們?cè)?workbench 中新建一個(gè)數(shù)據(jù)庫(kù)

看看這個(gè)數(shù)據(jù)庫(kù)是否會(huì)在我們的宿主機(jī)上面有同步

image

查看我們掛載宿主機(jī)的目錄 /home/mysql/data

root@iZuf66y3tuzn4wp3h02t7pZ:/home/mysql/data#ls
auto.cnf    ca.pem           client-key.pem  ibdata1      ib_logfile1  mysql               private_key.pem  server-cert.pem  sys
ca-key.pem  client-cert.pem  ib_buffer_pool  ib_logfile0  ibtmp1       performance_schema  public_key.pem   server-key.pem   test
image

果然是有的,再次 nice,這就達(dá)到了數(shù)據(jù)持久化的效果,這就是咱們從認(rèn)識(shí)數(shù)據(jù)卷到使用數(shù)據(jù)卷的一個(gè)簡(jiǎn)單流程,咱們可以慢慢的深入下去

具名掛載和匿名掛載

以啟動(dòng)一個(gè) nginx 為例子:

具名掛載:

# docker run -d  --name nginx3 -v JM:/etc/nginx:rw nginx

匿名掛載:

# docker run -d  --name nginx3 -v /etc/nginx:rw nginx

上述的 rw也可以寫成ro

  • rw

可讀可寫

  • ro

只讀,只能宿主機(jī)才能寫

查看數(shù)據(jù)掛載卷

root@iZuf66y3tuzn4wp3h02t7pZ:/home/mysql# docker volume ls
DRIVER    VOLUME NAME
local     JM        # 具名掛載 ,下面的為匿名掛載
local     bd2b9ea00eb7d95bb69bdd39a63769ce906a0bb17fae2e29b726f9b92cbcb008
local           d67ba49109dfd654173b8d05f8602b99751066483a357c654b63ba46ec72d5c0

查看掛載具體目錄

l# docker volume inspect JM
[
    {
        "CreatedAt": "2021-08-04T23:48:05+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/JM/_data",
        "Name": "JM",
        "Options": null,
        "Scope": "local"
    }
]

查看該目錄下的掛載文件,是否是和 nginx 容器中的 /etc/nginx目錄下內(nèi)容一致

root@iZuf66y3tuzn4wp3h02t7pZ:/var/lib/docker/volumes/JM/_data# ll
total 36
drwxr-xr-x 3 root root 4096 Aug  4 23:48 ./
drwx-----x 3 root root 4096 Aug  4 23:48 ../
drwxr-xr-x 2 root root 4096 Aug  4 23:48 conf.d/
-rw-r--r-- 1 root root 1007 Jul  6 22:59 fastcgi_params
-rw-r--r-- 1 root root 5290 Jul  6 22:59 mime.types
lrwxrwxrwx 1 root root   22 Jul  6 23:11 modules -> /usr/lib/nginx/modules
-rw-r--r-- 1 root root  648 Jul  6 23:11 nginx.conf
-rw-r--r-- 1 root root  636 Jul  6 22:59 scgi_params
-rw-r--r-- 1 root root  664 Jul  6 22:59 uwsgi_params

果然一毛一樣,nice

再來(lái)看看 docker 默認(rèn)的掛載目錄 /var/lib/docker/volumes,我們可以看到每一個(gè)匿名掛載,和具名掛載的目錄和數(shù)據(jù)都存放于此

root@iZuf66y3tuzn4wp3h02t7pZ:/var/lib/docker/volumes# ll
total 44
drwx-----x  5 root root   4096 Aug  4 23:48 ./
drwx--x--x 13 root root   4096 Aug  3 22:58 ../
brw-------  1 root root 252, 1 Aug  3 22:58 backingFsBlockDev
drwx-----x  3 root root   4096 Aug  1 21:36 bd2b9ea00eb7d95bb69bdd39a63769ce906a0bb17fae2e29b726f9b92cbcb008/
drwx-----x  3 root root   4096 Aug  3 23:32 d67ba49109dfd654173b8d05f8602b99751066483a357c654b63ba46ec72d5c0/
drwx-----x  3 root root   4096 Aug  4 23:48 JM/
-rw-------  1 root root  32768 Aug  4 23:48 metadata.db

我們來(lái)小結(jié)一下

  • 指定掛載

-v 宿主機(jī)的絕對(duì)路徑:容器路徑

  • 具名掛載

-v 卷名:容器路徑

  • 匿名掛載

-v 容器路徑

參考資料:

docker docs

歡迎點(diǎn)贊,關(guān)注,收藏

朋友們,你的支持和鼓勵(lì),是我堅(jiān)持分享,提高質(zhì)量的動(dòng)力

image

好了,本次就到這里

技術(shù)是開(kāi)放的,我們的心態(tài),更應(yīng)是開(kāi)放的。擁抱變化,向陽(yáng)而生,努力向前行。

我是小魔童哪吒,歡迎點(diǎn)贊關(guān)注收藏,下次見(jiàn)~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容