docker容器数据卷(相当于持久化)
Docker简介
#是什么: 类似redis的RDB和AOF,(更通俗的说相当于移动硬盘) #能干什么 1、容器的持久化 2、容器间继承+持久化 #怎么用 1、直接命令添加(-v) #docker run -v 宿主机目录:容器目录 镜像名 (docker run -it 镜像名, 对比这个记忆) 例: docker run -it -v /myVolume:/containVolume centos 1.1给容器设置只读权限(主机可以修改,容器只读) docker run -v 宿主机目录:容器目录:ro 镜像名 read-only docker run -it -v /myVolume:/containVolume:ro centos 2、DockerFile添加
二、使用
1、命令添加
[root@linuxxx ~]# docker run -it -v /myVolume:/containVolume centos #可以自动新建目录 #执行完这句话后,已经产生了绑定关系, 可以使用docker inspect ID查看 Volumes或hostconfig 分别在容器和host端进入相应的文件 [root@linuxxx /]# cd myVolume/ #原生Linux端,主机 [root@linuxxx myVolume]# cat b.txt a123qwer [root@f3c17a0046ed /]# cd containVolume/ #容器端 [root@f3c17a0046ed containVolume]# vi b.txt #结论:无论是主机还是容器创建文件也好,修改文件也好,都能共享资源 -------------------------------------- #当容器退出后,重新连接之前的这段时间,主机的修改,是否对容器有效 [root@c23bbbea6835 /]# exit exit #来到主机, [root@linuxxx myVolume]# touch c.txt [root@linuxxx myVolume]# vi c.txt #添加123 #来到容器,并重新登陆 [root@linuxxx ~]# docker ps -l #拿到ID, [root@linuxxx ~]# [root@linuxxx ~]# docker start f3c17a0046ed #运行容器 f3c17a0046ed [root@linuxxx ~]# docker attach f3c17a0046ed #进入容器 [root@f3c17a0046ed /]# [root@f3c17a0046ed /]# cd containVolume/ #进入绑定的文件 [root@f3c17a0046ed containVolume]# [root@f3c17a0046ed containVolume]# ll total 8 -rw-r--r--. 1 root root 9 Aug 6 11:40 b.txt -rw-r--r--. 1 root root 4 Aug 6 11:50 c.txt [root@f3c17a0046ed containVolume]# cat c.txt 123 结论:容器推出后,仍然与主机资源共享
2、DockerFile添加
#上面的命令添加模式,只支持宿主机与容器数据的共享 #由于宿主机目录依赖特定的宿主机,不能保证所有的宿主机都存在特定的目录 用法: 1、根目录下创建mydocker文件夹并进入 2、可在Dockerfile中使用 VOLUME 指令来给镜像添加一个或多个数据卷 3、build后生成镜像, 4、run 容器
[root@linuxxx ~]# mkdir /mydocker #创建文件夹 [root@linuxxx ~]# cd /mydocker/ #进入文件夹 [root@linuxxx mydocker]# vi Dockerfile #编写 --------------------------------------------------- #valume test #编写内容 FROM centos VOLUME ["/datavolume1","/datavolume2","/datavolume3",] CMD echo "finished,--------sucess1" CMD /bin/bash ------------------------------------------------------- #绑定 [root@linuxxx mydocker]# docker build -f /mydocker/Dockerfile -t pdun/centos . [root@linuxxx mydocker]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE pdun/centos latest 751b5f9475e5 3 minutes ago 202MB [root@linuxxx mydocker]# docker run -it pdun/centos #可以查看是否成功创建这两个容器 [root@3c1a4034ed22 /]# ll drwxr-xr-x. 2 root root 6 Aug 6 14:02 datavolume1 drwxr-xr-x. 2 root root 6 Aug 6 14:02 datavolume2 #进入容器,创建文件 [root@3c1a4034ed22 /]# cd /datavolume1 [root@3c1a4034ed22 datavolume1]# pwd /datavolume1 [root@3c1a4034ed22 datavolume1]# touch contioner01.txt ------------------------------------------------------------------------ 我们没有创建主机,主机从何而来 让我们打开一个新的终端 [root@linuxxx ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3c1a4034ed22 pdun/centos "/bin/sh -c /bin/bash" 8 minutes ago Up 8 minutes angry_aryabhata c44b284600fd redis "docker-entrypoint.s…" 5 hours ago Up 5 hours 6379/tcp vibrant_spence [root@linuxxx ~]# [root@linuxxx ~]# docker inspect 3c1a4034ed22
三、数据卷容器
#命名的容器挂载数据卷,其他容器通过挂载这个(父容器)实现数据的共享,挂载数据卷的容器,称之为数据卷容器 通俗的讲,移动硬盘去拷贝主机上的数据,其他硬盘可以拷贝这个移动硬盘的东西
[root@linuxxx ~]# docker run -it --name c1 pdun/centos #创建父容器 [root@b71c77033a4a /]# ll total 12 -rw-r--r--. 1 root root 12082 Mar 5 17:36 anaconda-post.log lrwxrwxrwx. 1 root root 7 Mar 5 17:34 bin -> usr/bin drwxr-xr-x. 2 root root 6 Aug 6 14:34 datavolume1 drwxr-xr-x. 2 root root 6 Aug 6 14:34 datavolume2 [root@b71c77033a4a /]# cd datavolume2 [root@b71c77033a4a datavolume2]# [root@b71c77033a4a datavolume2]# touch c1.txt [root@b71c77033a4a datavolume2]# [root@linuxxx ~]# [root@linuxxx ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b71c77033a4a pdun/centos "/bin/sh -c /bin/bash" 2 minutes ago Up 2 minutes c1 ---------------------------------------- 让c2继承c1 [root@linuxxx ~]# docker run -it --name c2 --volumes-from c1 pdun/centos [root@827f2adf5e40 /]# cd datavolume2 [root@827f2adf5e40 datavolume2]# pwd [root@827f2adf5e40 datavolume2]# ll #发现有c1设置的文件 total 0 -rw-r--r--. 1 root root 0 Aug 6 14:36 c1.txt [root@827f2adf5e40 datavolume2]# [root@827f2adf5e40 datavolume2]# [root@linuxxx ~]# #CTRL+P+Q [root@linuxxx ~]# [root@linuxxx ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 827f2adf5e40 pdun/centos "/bin/sh -c /bin/bash" 3 minutes ago Up 3 minutes c2 b71c77033a4a pdun/centos "/bin/sh -c /bin/bash" 8 minutes ago Up 7 minutes c1 ---------------------------------------- #c3同理 [root@linuxxx ~]# docker run -it --name c3 --volumes-from c1 pdun/centos [root@021b3cc21d04 /]# cd datavolume2 [root@021b3cc21d04 datavolume2]# [root@021b3cc21d04 datavolume2]# ll total 0 -rw-r--r--. 1 root root 0 Aug 6 14:36 c1.txt -rw-r--r--. 1 root root 0 Aug 6 14:41 c2.txt [root@021b3cc21d04 datavolume2]# touch c3.txt ------------------------------------------------------ #子容器创建的东西,父容器,兄容器共享 [root@linuxxx ~]# docker attach c1 [root@b71c77033a4a datavolume2]# ll total 0 -rw-r--r--. 1 root root 0 Aug 6 14:36 c1.txt -rw-r--r--. 1 root root 0 Aug 6 14:41 c2.txt -rw-r--r--. 1 root root 0 Aug 6 14:45 c3.txt ------------------------------- #删除父容器,子容器间仍然可以资源共享 [root@linuxxx ~]# docker attach c2 [root@827f2adf5e40 datavolume2]# [root@827f2adf5e40 datavolume2]# ll total 0 -rw-r--r--. 1 root root 0 Aug 6 14:36 c1.txt -rw-r--r--. 1 root root 0 Aug 6 14:41 c2.txt -rw-r--r--. 1 root root 0 Aug 6 14:45 c3.txt [root@827f2adf5e40 datavolume2]# [root@827f2adf5e40 datavolume2]# touch c2_update.txt [root@827f2adf5e40 datavolume2]# [root@827f2adf5e40 datavolume2]# read escape sequence [root@linuxxx ~]# [root@linuxxx ~]# docker attach c3 [root@021b3cc21d04 datavolume2]# [root@021b3cc21d04 datavolume2]# ll total 0 -rw-r--r--. 1 root root 0 Aug 6 14:36 c1.txt -rw-r--r--. 1 root root 0 Aug 6 14:41 c2.txt -rw-r--r--. 1 root root 0 Aug 6 14:51 c2_update.txt -rw-r--r--. 1 root root 0 Aug 6 14:45 c3.txt [root@021b3cc21d04 datavolume2]#