Docker實現數據持久化

由於Docker技術的火爆,以至於現在大大小小的公司都在使用Docker。對Docker熟悉的朋友都明白DOcker容器運行是有生命週期的,如果docker容器發生故障,那麼就意味着容器中的數據也將丟失。那麼對於企業來說的話,數據是重要的!如何做到對docker容器中的數據持久化就是運維人員需要考慮的問題了!本篇博文將瞭解如何對容器中的數據進行持久化!

在瞭解Docker數據持久化之前,需要對Docker的存儲類型有一個簡單的瞭解,執行以下命令即可看出:

[root@docker ~]# docker info              //查看Docker的詳細信息
Containers: 2                   //一共有幾個容器
 Running: 2                      //正在運行的有幾個容器
 Paused: 0                      //掛起、暫停的有幾個容器
 Stopped: 0                    //停止的有幾個容器
Images: 2                      //有幾個鏡像
Server Version: 18.09.0                         //docker的版本信息
Storage Driver: overlay2                       //存儲驅動類型爲overlay2
 Backing Filesystem: xfs                      //支持的文件系統:xfs
 Supports d_type: true                            
 Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local                                         //本地存儲    
 Network: bridge host macvlan null overlay             //支持的網絡類型
 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               //內核信息
Operating System: CentOS Linux 7 (Core)         //操作系統
OSType: linux                                     //操作系統類型
Architecture: x86_64                  
CPUs: 2                                         //CPU個數
Total Memory: 1.779GiB                       //內存容量
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(數據卷管理操作)

數據庫管理操作分爲兩種bind mount與docker managervolume兩種方式。

1)Bind mount(綁定掛載)

持久化存儲:本質上是DockerHost文件系統中的目錄或文件,能夠直接被Mount到容器的文件系統中。在運行容器時,可以通過-v 實現。

Bind mount的特點:

  • Data Volume是目錄或文件,不能是沒有格式化的磁盤(塊設備);
  • 容器可以讀寫volume中的數據;
  • 隨源文件變化而變化;
  • volume數據可以永久保存,即使使用它的容器已經被銷燬;

示例:

[root@docker ~]# mkdir /html
[root@docker ~]# echo "hello world" >> /html/index.html    //創建測試頁面
[root@docker ~]# docker run -itd --name test -p 80:80 -v /html:/usr/share/nginx/html nginx:latest
//運行容器並使用“-v”選項指定掛載目錄,前面爲docker host的目錄,“:”後面爲容器中的目錄
[root@docker ~]# 
[root@docker ~]# curl 127.0.0.1                    //可以看到掛載已經生效
hello world
[root@docker ~]# echo "lzj" > /html/index.html 
[root@docker ~]# curl 127.0.0.1                
//這種方式可以看出當源文件發生變化時,目標文件也會隨之發生變化
lzj
[root@docker ~]# docker inspect test    //查看容器的詳細信息
        "Mounts": [                            //找到Mount字段
            {
                "Type": "bind",                          //其類型爲bind
                "Source": "/html",                      //源目錄
                "Destination": "/usr/share/nginx/html",               //目標目錄
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],

注意:

  • DockerHost上需要被掛着的源文件或目錄,必須是已經存在,否則,當做的一個目錄掛着到容器中;
  • 默認掛載到容器內的文件,容器是有讀寫權限。可以在運行容器是-v後邊加“:ro” 限制容器的寫入權限;
  • 可以掛載單獨的文件到容器內部,使用場景:如果不想對整個目錄進行覆蓋,而只希望添加某個文件,就可以使用掛載單個文件;

2)Docker Manager Volume

示例:

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

這種方式特點:

  • 會隨着源文件的變化而變化,跟Bind mount效果是一樣的!
  • 刪除容器的操作,默認不會對dockerhost主機上的原文件進行刪除,如果想要在刪除容器是將原文件刪除,可以在刪除容器時添加“-v”選項,(一般情況下不建議使用,因爲文件有可能被其他容器就使用);

3)Volume containe(容器與容器的數據共享)

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

[root@docker ~]#  docker create --name vc_data  -v /html:/usr/share/nginx/html busybox:latest
//創建一個容器(無須運行)
[root@docker ~]# docker run -itd --name test3 -P --volumes-from vc_data nginx:latest
//使用“--volumes-from”來掛載vc_data容器中的數據間到新的容器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        //測試效果
lzj

注意:以上方式在源目錄刪除後,容器中的數據也會發生丟失現象!

可以採用編寫dockerfile文件的方式,將目錄或文件寫到鏡像中,然後根據鏡像生成容器,纔可保證原數據丟失,容器中的數據不會發生變化!

由於這種方式隨機性、靈活性太差,這裏就不多做介紹了這樣就可以通過數據卷容器實現容器之間的數據共享。

通過以上機制,即使容器在運行過程中出現故障,用戶也不用擔心數據發生丟失。如果發生意外,只需快速重新創建容器即可!

注意:生產環境中最注重的就是存儲的可靠性,以及存儲的可動態擴展性,一定要在做數據卷時考慮到這一點,在這方面比較出色的還要數GFS文件系統了,我上面只是做了簡單的配置,若在生產環境中,一定要好好考慮,就比如上面做的鏡像卷容器,就可以在宿主機本地掛載GFS文件系統,然後創建鏡像卷容器時,將掛載GFS的目錄映射到容器中的鏡像卷,這樣纔是一個合格的鏡像卷容器。

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章