溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Docker實(shí)現(xiàn)數(shù)據(jù)持久化

發(fā)布時(shí)間:2020-07-11 22:45:41 來(lái)源:網(wǎng)絡(luò) 閱讀:484 作者:筱振 欄目:云計(jì)算

由于Docker技術(shù)的火爆,以至于現(xiàn)在大大小小的公司都在使用Docker。對(duì)Docker熟悉的朋友都明白DOcker容器運(yùn)行是有生命周期的,如果docker容器發(fā)生故障,那么就意味著容器中的數(shù)據(jù)也將丟失。那么對(duì)于企業(yè)來(lái)說(shuō)的話(huà),數(shù)據(jù)是重要的!如何做到對(duì)docker容器中的數(shù)據(jù)持久化就是運(yùn)維人員需要考慮的問(wèn)題了!本篇博文將了解如何對(duì)容器中的數(shù)據(jù)進(jìn)行持久化!

在了解Docker數(shù)據(jù)持久化之前,需要對(duì)Docker的存儲(chǔ)類(lèi)型有一個(gè)簡(jiǎn)單的了解,執(zhí)行以下命令即可看出:

[root@docker ~]# docker info              //查看Docker的詳細(xì)信息
Containers: 2                   //一共有幾個(gè)容器
 Running: 2                      //正在運(yùn)行的有幾個(gè)容器
 Paused: 0                      //掛起、暫停的有幾個(gè)容器
 Stopped: 0                    //停止的有幾個(gè)容器
Images: 2                      //有幾個(gè)鏡像
Server Version: 18.09.0                         //docker的版本信息
Storage Driver: overlay2                       //存儲(chǔ)驅(qū)動(dòng)類(lèi)型為overlay2
 Backing Filesystem: xfs                      //支持的文件系統(tǒng):xfs
 Supports d_type: true                            
 Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local                                         //本地存儲(chǔ)    
 Network: bridge host macvlan null overlay             //支持的網(wǎng)絡(luò)類(lèi)型
 Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: c4446665cb9c30056f4998ed953e6d4ff22c7c39
runc version: 4fc53a81fb7c994640722ac585fa9ca548971871
init version: fec3683
Security Options:
 seccomp
  Profile: default
Kernel Version: 3.10.0-862.el7.x86_64               //內(nèi)核信息
Operating System: CentOS Linux 7 (Core)         //操作系統(tǒng)
OSType: linux                                     //操作系統(tǒng)類(lèi)型
Architecture: x86_64                  
CPUs: 2                                         //CPU個(gè)數(shù)
Total Memory: 1.779GiB                       //內(nèi)存容量
Name: docker
ID: 3SU5:P433:UIFM:YK6O:FBGP:MJSN:MTSO:PKPA:3NMN:6VW4:XUOV:XL5H
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:                     
 127.0.0.0/8
Registry Mirrors:                 //采用的加速器信息
 http://f1361db2.m.daocloud.io/
Live Restore Enabled: false
Product License: Community Engine

Data Volume(數(shù)據(jù)卷管理操作)

數(shù)據(jù)庫(kù)管理操作分為兩種bind mount與docker managervolume兩種方式。

1)Bind mount(綁定掛載)

持久化存儲(chǔ):本質(zhì)上是DockerHost文件系統(tǒng)中的目錄或文件,能夠直接被Mount到容器的文件系統(tǒng)中。在運(yùn)行容器時(shí),可以通過(guò)-v 實(shí)現(xiàn)。

Bind mount的特點(diǎn):

  • Data Volume是目錄或文件,不能是沒(méi)有格式化的磁盤(pán)(塊設(shè)備);
  • 容器可以讀寫(xiě)volume中的數(shù)據(jù);
  • 隨源文件變化而變化;
  • volume數(shù)據(jù)可以永久保存,即使使用它的容器已經(jīng)被銷(xiāo)毀;

示例:

[root@docker ~]# mkdir /html
[root@docker ~]# echo "hello world" >> /html/index.html    //創(chuàng)建測(cè)試頁(yè)面
[root@docker ~]# docker run -itd --name test -p 80:80 -v /html:/usr/share/nginx/html nginx:latest
//運(yùn)行容器并使用“-v”選項(xiàng)指定掛載目錄,前面為docker host的目錄,“:”后面為容器中的目錄
[root@docker ~]# 
[root@docker ~]# curl 127.0.0.1                    //可以看到掛載已經(jīng)生效
hello world
[root@docker ~]# echo "lzj" > /html/index.html 
[root@docker ~]# curl 127.0.0.1                
//這種方式可以看出當(dāng)源文件發(fā)生變化時(shí),目標(biāo)文件也會(huì)隨之發(fā)生變化
lzj
[root@docker ~]# docker inspect test    //查看容器的詳細(xì)信息
        "Mounts": [                            //找到Mount字段
            {
                "Type": "bind",                          //其類(lèi)型為bind
                "Source": "/html",                      //源目錄
                "Destination": "/usr/share/nginx/html",               //目標(biāo)目錄
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],

注意:

  • DockerHost上需要被掛著的源文件或目錄,必須是已經(jīng)存在,否則,當(dāng)做的一個(gè)目錄掛著到容器中;
  • 默認(rèn)掛載到容器內(nèi)的文件,容器是有讀寫(xiě)權(quán)限??梢栽谶\(yùn)行容器“-v”選項(xiàng)后邊加“:ro” 選項(xiàng)來(lái)限制容器的寫(xiě)入權(quán)限;
  • 可以?huà)燧d單獨(dú)的文件到容器內(nèi)部,使用場(chǎng)景:如果不想對(duì)整個(gè)目錄進(jìn)行覆蓋,而只希望添加某個(gè)文件,就可以使用掛載單個(gè)文件;

2)Docker Manager Volume

示例:

[root@docker ~]# docker run -itd --name test1 -v /usr/share/nginx/html nginx:latest
//這種方式“-v”選項(xiàng)后,只需添加容器中的目錄即可
[root@docker ~]# docker inspect test1
        "Mounts": [
            {
                "Type": "volume",                     //其類(lèi)型為volume
                "Name": "47545a64ef51aa1ea1065848b6cb5cc5f19e2da8b2c91966b256a910fca58c4d",
                "Source": "/var/lib/docker/volumes/47545a64ef51aa1ea1065848b6cb5cc5f19e2da8b2c91966b256a910fca58c4d/_data",            //源目錄(docker自動(dòng)生成的)
                "Destination": "/usr/share/nginx/html",      //目標(biāo)目錄
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],
[root@docker ~]# ls /var/lib/docker/volumes/47545a64ef51aa1ea1065848b6cb5cc5f19e2da8b2c91966b256a910fca58c4d/_data
50x.html  index.html
//可以看出宿主機(jī)上的目錄就是容器中掛載的目錄             

這種方式特點(diǎn):

  • 會(huì)隨著源文件的變化而變化,跟Bind mount效果是一樣的!
  • 刪除容器的操作,默認(rèn)不會(huì)對(duì)dockerhost主機(jī)上的原文件進(jìn)行刪除,如果想要在刪除容器是將原文件刪除,可以在刪除容器時(shí)添加“-v”選項(xiàng),(一般情況下不建議使用,因?yàn)槲募锌赡鼙黄渌萜骶褪褂茫?/li>

3)Volume container(容器與容器的數(shù)據(jù)共享)

Volume container:給其他容器提供volume存儲(chǔ)卷的容器。并且它可以提供bind mount,也可以提供docker manager volume。

[root@docker ~]#  docker create --name vc_data  -v /html:/usr/share/nginx/html busybox:latest
//創(chuàng)建一個(gè)容器(無(wú)須運(yùn)行)
[root@docker ~]# docker run -itd --name test3 -P --volumes-from vc_data nginx:latest
//使用“--volumes-from”來(lái)掛載vc_data容器中的數(shù)據(jù)間到新的容器test3
[root@docker ~]# docker ps             //查看其映射的端口
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
021653708bb2        nginx:latest        "nginx -g 'daemon of…"   7 seconds ago       Up 5 seconds        0.0.0.0:32768->80/tcp    test3
[root@docker ~]# curl 127.0.0.1:32768        //測(cè)試效果
lzj

注意:以上方式在源目錄刪除后,容器中的數(shù)據(jù)也會(huì)發(fā)生丟失現(xiàn)象!

可以采用編寫(xiě)dockerfile文件的方式,將目錄或文件寫(xiě)到鏡像中,然后根據(jù)鏡像生成容器,才可保證原數(shù)據(jù)丟失,容器中的數(shù)據(jù)不會(huì)發(fā)生變化!

由于這種方式隨機(jī)性、靈活性太差,這里就不多做介紹了這樣就可以通過(guò)數(shù)據(jù)卷容器實(shí)現(xiàn)容器之間的數(shù)據(jù)共享。

通過(guò)以上機(jī)制,即使容器在運(yùn)行過(guò)程中出現(xiàn)故障,用戶(hù)也不用擔(dān)心數(shù)據(jù)發(fā)生丟失。如果發(fā)生意外,只需快速重新創(chuàng)建容器即可!

注意:生產(chǎn)環(huán)境中最注重的就是存儲(chǔ)的可靠性,以及存儲(chǔ)的可動(dòng)態(tài)擴(kuò)展性,一定要在做數(shù)據(jù)卷時(shí)考慮到這一點(diǎn),在這方面比較出色的還要數(shù)GFS文件系統(tǒng)了,我上面只是做了簡(jiǎn)單的配置,若在生產(chǎn)環(huán)境中,一定要好好考慮,就比如上面做的鏡像卷容器,就可以在宿主機(jī)本地掛載GFS文件系統(tǒng),然后創(chuàng)建鏡像卷容器時(shí),將掛載GFS的目錄映射到容器中的鏡像卷,這樣才是一個(gè)合格的鏡像卷容器。

——————————本文到此為止,感謝閱讀————————————

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI