您好,登錄后才能下訂單哦!
由于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
數據庫管理操作分為兩種bind mount與docker managervolume兩種方式。
持久化存儲:本質上是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” 選項來限制容器的寫入權限;
- 可以掛載單獨的文件到容器內部,使用場景:如果不想對整個目錄進行覆蓋,而只希望添加某個文件,就可以使用掛載單個文件;
示例:
[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”選項,(一般情況下不建議使用,因為文件有可能被其他容器就使用);
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的目錄映射到容器中的鏡像卷,這樣才是一個合格的鏡像卷容器。
——————————本文到此為止,感謝閱讀————————————
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。