Docker(5)——数据管理

docker 容器的文件系统在宿主机上存在的方式很复杂,这会带来下面几个问题:

为了能够 保存(持久化) 数据以及 共享 容器间的数据,docker 引入了数据卷(volume) 机制。数据卷是存在于一个或多个容器中的特定文件或文件夹,它可以绕过默认的联合文件系统,以正常的文件或者目录的形式存在于宿主机上。

其生存周期独立于容器的生存周期。

容器中主要有 两种 管理数据方式: 数据卷(Data Volumes) 数据卷容器(Data Volume Containers)

数据卷是一个可供容器使用的特殊目录,它绕过文件系统,可以提供很多有用的特性:

数据卷的使用类似 linux 下对目录或文件进行 mount 操作,目前Docker提供了 三种 不同的方式将数据从宿主机挂载到容器中,分别是

其中 volume 、 bind mount 比较常用, tmpfs mount 基本不会用.

volumes作为Docker管理宿主机文件系统的一部分 ,默认位于 /var/lib/docker/volumes 目录中,不是宿主机已有数据,而是新建的。

docker 专门提供了 volume 子命令来操作数据卷:

先创建一个名称为 hello 的数据卷并通过 ls 命令进行查看:

然后可以使用 inspect 命令看看数据卷hello的详细信息

该数据卷使用的 Driver 为默认的 local ,表示数据卷使用宿主机的本地存储;

Mountpoint 是 volumes 的挂载点,默认是本机 /var/lib/docker/volumes 下的一个目录。

所有Container的数据都保存在了这个目录下边,由于没有在创建时指定卷,所以Docker帮我们默认创建许多匿名卷。

使用 -v 选项也可以指定挂载一个本地的已有目录到容器中去作为数据卷:
docker run -it –-name robot1 -v /var/data:/opt/mydata ros/kinetic /bin/bash
上面的命令挂载主机的 /var/data 目录到容器的 /opt/mydata 目录。

这个功能在测试的时候特别方便,比如用户可以放置一些程序或数据到本地目录中,然后在容器中使用。另外,本地目录的路径必须是绝对路径,如果目录不存在,Docker 会自动创建。
Docker 挂载数据卷的默认权限是可读写 rw ,用户也可以通过 ro 标记指定为只读:
docker run -it –-name robot1 -v /var/data:/opt/mydata:ro ros/kinetic /bin/bash
加了 :ro 之后,容器内挂载的数据卷内的数据就变成只读的了。

除了把数据卷中的数据存储在宿主机,docker 还允许我们通过指定 volume driver 的方式把数据卷中的数据存储在其它的地方,比如 Azrue Storge 或 AWS 。

通过 vieux/sshfs 驱动把数据卷的存储在云主机上,docker 默认是不安装 vieux/sshfs 插件的,我们可以通过下面的命令进行安装:
docker plugin install --grant-all-permissions vieux/sshfs

然后通过 vieux/sshfs 驱动创建数据卷,并指定远程主机的登录用户名、密码和数据存放目录:

注意:确保指定的远程主机上的挂载点 /home/nick/sshvolume 目录是存在的,否则在启动容器时会报错。

最后在启动容器时指定挂载这个数据卷:

在容器中 /world 目录下操作的文件都存储在远程主机的 /home/nick/sshvolume 目录中。进入容器 testcon 然后在 /world 目录中创建一个文件,然后打开远程主机的 /home/nick/sshvolume 目录进行查看,新建的文件会出现在那里。

当使用 bind mounts 将主机上的目录挂载到容器中时,目录由其在主机上的完整或相对路径引用。

bind mount 和 volume 其实都是利用宿主机的文件系统,不同之处在于volume是docker自身管理的目录中的子目录,所以不存在权限引发的挂载的问题,并且目录路径是docker自身管理的,所以也不需要在不同的服务器上指定不同的路径,不需要关心路径

bind mounts 可以挂载在宿主机系统的任意位置 ,但 bind mount 在不同的宿主机系统是不可移植的,比如Windows和Linux的目录结构是不一样的, bind mount 所指向的 host 目录也不能一样。这也是为什么 bind mount 不能出现在Dockerfile中的原因,因为这样Dockerfile就不可移植了。

如果使用 Bind mounts 挂载 宿主机目录 容器内非空目录 ,那么 此容器中的非空目录中的文件会被隐藏 ,容器访问这个目录时能够访问到的文件均来自于宿主机目录。这也是Bind mounts模式和Volumes模式最大的行为上的不同。

挂载存储在宿主机系统的内存中,而不会写入宿主机的文件系统;

这张图说明 bind mount 和 volume 其实都是利用宿主机的文件系统, Bind mounts 模式是将宿主机上的任意文件或文件夹挂载到容器,而 Volumes 本质上是将Docker服务管理的一块区域(默认是 /var/lib/docker/volumes 下的文件夹)挂载到容器。所以 volume 不存在权限引发的挂载的问题,并且目录路径是docker自身管理的,所以也不需要在不同的服务器上指定不同的路径,不需要关心路径。

相对于 bind mount , volume 是Docker Engine在自己的“地盘”分配了一个路径作为挂载点,自己地盘的权限肯定是安排的明明白白。所以,以上挂载宿主机路径的问题都解决了。

在使用 volume 作为数据卷挂载到容器时,直接用 volume 名称代替宿主机路径名就行:
docker run -d -v test_vol:/var/data some_image

这样就将数据卷 test_vol 挂载到了容器内的 /var/data 目录下。

命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器

可以利用数据卷容器对其中的数据卷进行备份、恢复,以实现数据的迁移。

备份
使用下面的命令来备份 mydata 数据卷容器内的数据卷:

sudo docker run --volumes-from mydata -v $(pwd):/backup –-name worker ubuntu tar cvf /backup/backup.tar /data
这个命令首先利用 Ubuntu 镜像创建了一个容器 worker。又使用 --volumes-from mydata 参数来让 worker 容器挂载 mydata 容器的数据卷。接下来使用 -v $(pwd):/backup 参数来挂载本地的当前目录到 worker 容器的 /backup 目录。
在 worker 容器启动后,使用了 tar cvf /backup/backup.tar /data 命令来将 /data 下内容备份为容器内的 /backup/backup.tar,即宿主主机的当前目录下的backup.tar。

恢复
如果要恢复数据到一个容器,可以按照下面的操作。首先创建一个带有数据卷的容器 mydata2:

sudo docker run -v /data –-name mydata2 ubuntu /bin/bash
然后创建另一个新的容器,挂载 mydata2 的数据卷,并使用 tar 解压缩备份文件到所挂载的容器卷中:

sudo docker run --volumes-from mydata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar

如果用户需要在容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。数据卷容器其实就是一个普通的容器,专门用它提供数据卷供其他容器挂载。下面简单介绍其使用方法。

首先要创建一个数据卷容器 mydata,并在其中创建一个数据卷挂载到 /data 目录。

sudo docker run -it -v /data –-name mydata ubuntu
然后在其他容器中使用 --volumes-from 来挂载 mydata 容器中的数据卷。例如创建两个容器 mycon1 和 mycon2,并从 mydata 容器挂载数据卷:

sudo docker run -it --volumes-from mydata –-name mycon1 ubuntu
sudo docker run -it --volumes-from mydata –-name mycon2 ubuntu
(注意,命令中没有指定数据卷的信息,也就是说新容器中挂载数据卷的目录和源容器中是一样的。)

此时容器 mycon1 和 mycon2 都挂载同一个数据卷到相同的目录 /data。三个容器任何一个在该目录下写入数据其他容器都能看到。
可以多次使用 --volumes-from 参数来从多个容器挂载多个数据卷。还可以从其他已经挂载了容器的容器来挂载数据卷。并且使用 --volumes-from 参数所挂载数据卷的容器自身并不需要保持在运行状态。
但删除挂载了数据卷的容器时,数据卷并不会被自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时显式的使用 docker rm -v 命令来指定同时删除关联的容器。

如何对已经运行的容器挂载目录?
https://blog.51cto.com/hjun169/2440799
手动修改mount挂载的json文件,狂神的那个视频里面也有写。

深刻理解Docker镜像大小
https://blog.csdn.net/shlazww/article/details/47375009

理解docker的分层镜像实现 base 镜像共享(DockerFile)
https://blog.csdn.net/lu_1110/article/details/106533490



  • Docker(5)鈥斺旀暟鎹鐞
    绛旓細鏁版嵁鍗风殑浣跨敤绫讳技 linux 涓嬪鐩綍鎴栨枃浠惰繘琛 mount 鎿嶄綔,鐩墠Docker鎻愪緵浜 涓夌 涓嶅悓鐨勬柟寮忓皢鏁版嵁浠庡涓绘満鎸傝浇鍒板鍣ㄤ腑,鍒嗗埆鏄 鍏朵腑volume 銆 bind mount 姣旇緝甯哥敤, tmpfs mount 鍩烘湰涓嶄細鐢. volumes浣滀负Docker绠$悊瀹夸富鏈烘枃浠剁郴缁熺殑涓閮ㄥ垎 ,榛樿浣嶄簬 /var/lib/docker/volumes 鐩綍涓,涓嶆槸瀹夸富鏈哄凡鏈夋暟鎹,鑰屾槸鏂板缓鐨...
  • Docker(5)鈥斺鍨冨溇娓呯悊
    绛旓細鍦ㄤ娇鐢 Docker 涓娈垫椂闂村悗锛岀郴缁熶竴鑸兘浼氭畫瀛樹竴浜涗复鏃剁殑銆佹病鏈夎浣跨敤鐨勯暅鍍忔枃浠讹紝鍙互閫氳繃浠ヤ笅鍛戒护杩涜娓呯悊锛 docker image prune -a 鏌ョ湅docker鍗 docker volume ls 鍒犻櫎docker鍗 docker volume rm 4e12af8913af 鍒犻櫎鎵鏈夋湭浣跨敤鐨勫嵎 docker volume prune docker system鏄敤浜绠$悊纾佺洏绌洪棿鐨勫懡...
  • Docker绗旇5-瀹夎Docker Desktop纰板埌鐨勯棶棰
    绛旓細缁忚繃涓鐣姌鑵撅紝鍘熸潵鏄敱浜庢垜鐢佃剳鐨刉indows Management Instrumentation (WMI)鍧忎簡锛屽彲浠ュ畨瑁 杩欎釜 閲嶆柊淇涓涓媁MI 锛堝娉細闇瑕佺敤admin鐨勬柟寮忔墦寮CMD鎴栬匬owershell鍘讳慨澶嶏級锛屼箣鍚Docker Desktop灏卞彲浠ユ垚鍔熷畨瑁呭拰浣跨敤浜嗐傚啓浜2022.1.19鏅氫笂
  • docker涓鑸敤鏉ュ共鍢
    绛旓細5銆佹暣鍚堟湇鍔″櫒 姝e閫氳繃铏氭嫙鏈烘潵鏁村悎澶氫釜搴旂敤锛Docker闅旂搴旂敤鐨勮兘鍔涗娇寰桪ocker鍙互鏁村悎澶氫釜鏈嶅姟鍣ㄤ互闄嶄綆鎴愭湰銆傜敱浜庢病鏈夊涓搷浣滅郴缁熺殑鍐呭瓨鍗犵敤锛屼互鍙婅兘鍦ㄥ涓疄渚嬩箣闂村叡浜病鏈変娇鐢ㄧ殑鍐呭瓨锛孌ocker鍙互姣旇櫄鎷熸満鎻愪緵鏇村ソ鐨勬湇鍔″櫒鏁村悎瑙e喅鏂规銆6銆佽皟璇曡兘鍔 Docker鎻愪緵浜嗗緢澶氱殑宸ュ叿锛岃繖浜涘伐鍏蜂笉涓瀹氬彧鏄拡瀵瑰鍣紝浣...
  • 5鍒嗛挓杞绘澗鏁欎綘瀛︿細:Docker闀滃儚浠撳簱鐨勪娇鐢
    绛旓細鍛戒护锛docker tag jeecg-boot-system:latest xiaoxiaoyuyu123/aids:jeecg-boot-system 璇存槑锛歫eecg-boot-system:latest锛堟湰鍦颁粨搴撳悕绉+鏍囩锛墄iaoxiaoyuyu123/aids:jeecg-boot-system锛堢鏈嶄粨搴撳湴鍧+鏍囩锛5銆佷笂浼犲埌绉佹湁浠撳簱 鍛戒护锛歞ocker push xiaoxiaoyuyu123/aids:jeecg-boot-system 璇存槑锛歺iaoxiaoyuyu...
  • Docker鏄粈涔?
    绛旓細docker鐨鐢ㄩ旓細瀹樻柟缁欑殑鏄痓ulid ship run锛屽氨鏄紪璇戙佽杞姐佽繍琛屻傚氨鏄疄鐜颁簡搴旂敤鐨勫皝瑁呫侀儴缃层佽繍琛岀殑鐢熷懡鍛ㄦ湡绠$悊鍙鍦╣libc鐨勭幆澧冧笅锛岄兘鍙互杩愯銆傝皭浜戣嚜涓荤爺鍙戠殑瀹瑰櫒浜戝钩鍙帮紝鏄熀浜Docker鍜孠ubernetes鎶鏈瀯寤虹殑涓濂楀畬鏁碔T鏍囧噯鍖栧拰鑷姩鍖栨鏋讹紝浠モ滈潰鍚戠粓鎬併佷紭鍖朓T璧勬簮鈥濅负鐩爣鐨勬柊涓浠aaS骞冲彴锛岃兘澶...
  • 鍑犲ぉ浠ュ悗鍙互绌胯瀛
    绛旓細1. 涓篋ocker娣诲姞浠g悊锛2. 娣诲姞浠ヤ笅鍐呭锛3. 閲嶅惎Docker鏈嶅姟锛4. 娴嬭瘯浣跨敤銆傜患涓婃墍杩帮紝灏辨槸涓哄悇绉嶅懡浠ゆ坊鍔犱唬鐞嗭紝瀹炵幇Docker鐨姝e父瀹夎鍜屼娇鐢ㄣ傘愭敞銆戯細浠ヤ笂鍐呭涓殑鍙戝竷鏃堕棿鍧囦负2024骞6鏈29鏃ャ2. 鏍囬锛歄penAI锛氭墍鏈塁hatGPT鍏嶈垂鐢ㄦ埛鐜板湪閮藉彲浠ヤ娇鐢ㄦ祻瑙堛佽瑙夈鏁版嵁鍒嗘瀽銆佹枃浠朵笂浼犮佸绉岹PTs锛堝彂甯冩椂闂...
  • 6澶у垎绫,17澶ф湁鐢ㄧ殑docker宸ュ叿,浣犵煡閬撳嚑涓?
    绛旓細Logspout鏄府鍔绠$悊鍦Docker瀹瑰櫒涓繍琛岀殑绋嬪簭鐢熸垚鐨勬棩蹇楃殑涓涓緢濂界殑宸ュ叿銆傚畠灏嗗鍣ㄥ簲鐢ㄧ▼搴忔棩蹇楄矾鐢卞埌鍗曚釜浣嶇疆锛堜緥濡傦紝閫氳繃HTTP鍙敤鐨凧SON瀵硅薄鎴栨祦寮忕鐐癸級銆侺ogspout涔熸湁涓涓彲鎵╁睍鐨勬ā鍧楃郴缁熴傚伐鍏烽摼鎺ワ細https://github.com/gliderlabs/logspout 浣跨敤鎴愭湰锛氬厤璐 Fluentd浣滀负涓涓紑婧鏁版嵁鏀堕泦鍣ㄥ伐浣 - 涓涓...
  • 鏁版嵁搴-娑涙-TDengine
    绛旓細鏄剧ず鍑篢Dengine鍦ㄩ珮骞跺彂涓嬬殑楂樻晥鎬с備粠Linux缁堢鍚姩TDengine shell锛屾搷浣滅畝娲佹祦鐣咃紝涓嶮ySQL绫讳技锛屽杩愯鍛戒护锛歳oot@bf8c9c8de5d5:~/TDengine-server-2.0.22.3# taos鍚庣画锛屾垜浠皢杩涗竴姝ョ爺绌跺叾娣卞眰娆″姛鑳斤紝濡鏁版嵁绠$悊銆佸疄鏃舵煡璇㈠拰娴佸紡澶勭悊锛屾湡寰呭湪鍛ㄦ湯浼戞伅鍚庯紝涓嬪懆鑳藉甫鏉ユ洿澶氭繁鍏ヤ綋楠屽拰鍒嗕韩銆
  • 鎴戜滑鏄惁搴旇灏鏁版嵁搴撲篃瀹瑰櫒鍖?
    绛旓細Docker 蹇熸墿灞曠殑涓涓噸瑕佺壒寰佸氨鏄棤鐘舵侊紝鍏锋湁鏁版嵁鐘舵佺殑閮戒笉閫傚悎鐩存帴鏀惧湪 Docker 閲岄潰锛屽鏋 Docker 涓畨瑁呮暟鎹簱锛屽瓨鍌ㄦ湇鍔¢渶瑕佸崟鐙彁渚涖傜洰鍓嶏紝TX浜戠殑TDSQL(閲戣瀺鍒嗗竷寮忔暟鎹簱)鍜岄樋閲屼簯鐨凮ceanbase(鍒嗗竷寮忔暟鎹簱绯荤粺)閮界洿鎺ヨ繍琛屼腑鍦ㄧ墿鐞嗘満鍣ㄤ笂锛屽苟闈炰娇鐢ㄤ究浜绠$悊鐨 Docker 涓娿5銆佽祫婧愰殧绂 璧勬簮闅旂鏂归潰锛...
  • 扩展阅读:docker官方网站 ... 尽量少用docker ... docker常用的十个命令 ... 为什么docker被淘汰了 ... github资源网站 ... github永久官网 ... docker所有命令大全 ... docker面试题及答案 ... k8s为啥不建议用docker了 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网