目录
Docker基础命令篇:Docker基础命令_不会调制解调的猫的博客-优快云博客
容器数据卷是什么
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。
说白了就是将docker容器内的数据保存进宿主机内,类似于“共享文件夹”。双方都可以对其进行访问和操作。
容器数据卷能干什么
将运用与运行的环境打包镜像,run后形成容器实例运行 ,但是我们对数据的要求希望是持久化的。Docker容器产生的数据如果不备份,那么当容器实例删除后,容器内的数据自然将会消失。为了能保存数据在docker,所以中我们使用卷。
特点:
1:数据卷可在容器之间共享或重用数据
2:卷中的更改可以直接实时生效
3:数据卷中的更改不会包含在镜像的更新中
4:数据卷的生命周期一直持续到没有容器使用它为止
容器数据卷案例
宿主机与容器之间添加映射数据卷
代码如下:
docker run -it -v /宿主机目录:/容器内目录 ubuntu /bin/bash
本人的镜像如下:
举例:
docker run -it --privileged=true -v /tmp/host:/tmp/docker ubuntu
这里我的宿主机/tmp目录下是没有host目录的,同样在容器Ubuntu内的/tmp下也是没有docker目录的,在运行此语句后会进行自动创建。
查看数据卷是否挂载成功
代码如下:
docker inspect 容器ID
例:
docker inspect 608edcc72f49
此时我们往下寻找,找到 Mounts,如下:
这里显示出了挂载的目录,即挂载成功。
宿主机与容器之间的数据共享
正常运行时同步
我们在刚刚创建的容器/tmp/docker目录下创建内容,并观测在宿主机能否进行查看和操作。
创建一个文件:
touch 1.txt
往里面随便写点什么:
echo 'this is docker' > 1.txt
cat查看一下:
cat 1.txt
再前往宿主机进行查看:
ls
cat 1.txt
很明显文件和内容都被数据卷同步到了宿主机,此时我们再在宿主机中进行操作,查看docker中的文件有没有被更新。
在宿主机中echo内容:
echo 'this is host' >> 1.txt
cat 1.txt
前往docker容器中的Ubuntu进行查看:
cat 1.txt
操作成功。
容器被stop时同步
我们将docker容器stop,在主机修改,然后重启docker容器看数据是否同步成功。
在宿主机中执行stop:
docker stop 608edcc72f49
宿主机:
容器被停止后退出的效果:
接着我们在宿主机中进行操作:
创建文件:
touch 2.txt
随便写点什么进去:
echo '这里还是host哦!' > 2.txt
再次启动容器,查看数据是否被同步:
docker start 608edcc72f49
进入容器:
docker exec -it 608edcc72f49 /bin/bash
进行查看:
cd /tpm/docker
cat 2.txt
映射添加读写规则
读写(默认)
默认案例同上,docker容器数据卷默认为rw,操作效果同上。
只读
将容器内部的实例进行限制,只能读,不能写。
/容器目录:ro 镜像名
举例:
docker run -it --privileged=true -v /tmp/host:/tmp/docker:ro ubuntu
我们前往容器内的/tmp/docker目录内创建文件,系统会提示这里对于容器为只读,无法进行写操作:
cd /tmp/docker
touch 1.txt
再前往宿主机进行文件的创建操作:
touch 1.txt
echo 'adaedEWDAW' > 1.txt
前往容器内进行查看:
可以正常进行查看操作,但依旧没有写权限。
卷的继承和共享
正常运行时的继承和共享
再来一次,这里因为需要用到两个容器,为方便区分,添加了名称:u1和u2
docker run -it --privileged=true -v /tmp/host:/tmp/docker --name u1 ubuntu
创建一个文件,随便写点什么进去。
cd /tmp/docker
touch u1.txt
echo 'this is u1' > u1.txt
在宿主机中查看一下,并也随便创建点什么:
touch host.txt
echo 'this is host' > host.txt
此时的容器u1已经和宿主机成功挂载了数据卷,完成了映射关系。
此时我们再创建一个名叫u2的Ubuntu容器
--volumes-from父类
这玩意儿其实有点类似于java中的extends,实际操作如下:
docker run -it --privileged=true --volumes-from u1 --name u2 ubuntu
进入/tmp查看是否存在docker目录,并查看其内容:
cd /tmp/docker
ls
在容器u2中也随便加点什么进去:
touch u2.txt
echo 'this is u2' > u2.txt
然后前往u1和宿主机进行查看,u1:
宿主机:
当父级容器stop时的继承和共享
把u1给stop掉:
docker stop ecbbbe512dbd
再前往宿主机搞点事情:
touch host2.txt
ls
文件创建完成后,我们再去u2查看结果(当父容器宕掉后能否继承和共享):
ls
很明显,u2不会因为他爹没了而放弃家业。因为他继承的只是挂载的目录,就算u1宕掉了,也不会影响他的继承和共享。
此时我们再恢复一下u1容器(在爹死后儿子跟别人又干了一票,当他爹复活后看看还能不能发现)。
查看最近运行的两个容器:
docker ps -n 2
再运行:
docker start u1
docker exec -it u1 /bin/bash
进入目录进行查看:
cd /tmp/docker
ls
很明显他爹一直在天上看着。