docker 1.4之容器的数据卷
1.什么是数据卷
容器数据卷是宿主机中一个目录或文件,通过把目录或文件挂载到容器中,可以将主机和容器之前数据同步,一个数据卷目录可以同时挂载多个容器,解决多容器之间文件交换问题,删除容器时不会删除其挂载的数据卷。
2.特点:
(1)数据卷在容器启动时初始化,如果容器使用的镜像在挂载点包含了数据,这些数据会被拷贝到新初始化的数据卷中
(2)数据卷可以在容器之间共享和重用
(3)可以对数据卷里的内容直接进行修改
(4)数据卷的变化不会影像镜像的更新
(5)卷会一直存在,即使挂载数据卷的容器已经被删除
3.如何使用
(1)为容器添加数据卷,使用-v参数
docker run --name volume2 -v /root/datavolume:/data -it nginx:1.20.2 #宿主机的/datavolume目录下创建的数据就会同步到容器的/data目录,在宿主机的指定目录下或容器指定目录下创建文件或其他都会同步,
# --name volume2 容器名
# /root/datavolume 宿主机目录
# /data 容器目录
目录必须是绝对路径,如果容器目录中有数据,创建容器挂载会把容器目录里的数据清空
(2)为数据卷添加访问权限,使得容器只可以读,不可以修改
[root@elk test1]# docker run --name test2 -v /opt/test2:/opt/test2:ro -itd centos /bin/bash ro表示只读权限
(3)一次挂载多个文件到容器中,可多次指定-v的参数,如果改变了容器的配置文件,需要重启容器
[root@elk ~]# docker run -id --name=test2 -p 81:81 -v /var/log/test1:/usr/share/test2 -v /root/nginx/html:/usr/share/nginx centos:7 5f9c05bb49bcab48b4cb54ad1c7960952b45e102570ffc27a3e2b16d8526220d
4。使用dockerfile构建包含数据卷的镜像
(1)编辑dockerfile文件
[root@elk test]# cat dockerfile FROM centos:7 VOLUME ["/datavolume1","/datavolume2"] #可同时挂载两个容器里的目录 CMD /bin/bash
(2)构建镜像
[root@elk test]# docker build -t volume . Sending build context to Docker daemon 2.048kB Step 1/3 : FROM centos:7 ---> eeb6ee3f44bd Step 2/3 : VOLUME ["/datavolume1","/datavolume2"] ---> Running in 791d62e5a3cf Removing intermediate container 791d62e5a3cf ---> 62783498bc10 Step 3/3 : CMD /bin/bash ---> Running in ac35665a4d2d Removing intermediate container ac35665a4d2d ---> dcdfa840f7d0 Successfully built dcdfa840f7d0 Successfully tagged volume:latest
(3)查看用dockerfile构建好的镜像
[root@elk test]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE volume latest dcdfa840f7d0 6 seconds ago 204MB <none> <none> 1e7b57c99e04 4 hours ago 375MB nginx v1 0b84f8562dc1 6 hours ago 547MB <none> <none> 0ef97cebe6b4 31 hours ago 232MB <none> <none> 8f5602dc2b28 11 days ago 232MB centos 7 eeb6ee3f44bd 8 months ago 204MB test centos eeb6ee3f44bd 8 months ago 204MB centos latest 5d0da3dc9764 8 months ago 231MB
(4)创建容器
[root@elk test]# docker run --name volume-doubble -itd volume /bin/bash
94de44755c87a63923c9ae9d89c723f5448a3868ad688ed03c98968cbb5fa4d0
(5)登录容器查看,是否有dockerfile里俩目录
[root@elk test]# docker exec -it volume-doubble /bin/bash [root@94de44755c87 /]# ls anaconda-post.log datavolume1 dev home lib64 mnt proc run srv tmp var bin datavolume2 etc lib media opt root sbin sys usr
(6)查看容器的信息
[root@elk ~]# docker inspect volume