Docker之数据存储

1.  Docker数据存储

    写时复制

      docker镜像由多个只读层叠加而成,启动容器时,docker会加载只读镜像层并在镜像栈顶部添加一个读写层。

      如果运行中的容器修改了一个已存在的文件,那该文件将会从读写层的下面的只读层复制到读写层,该文件的只读版本仍然存在,只是被读写层的副本隐藏,此时成为写时复制。      

    1.  docker提供三种不同方式

        volumes  存储位置/var/lib/docker/volumes

        bind mounts  可以存储在宿主机系统的任意位置

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

        

    2.  volume      

        1.  创建一个数据卷

            docker volume create nginx-test 

            会在/var/lib/docker/volumes目录下,创建一个子目录nginx-test

        2.  使用数据卷创建一个容器

            docker run -d -it -p 8080:80 --name=nginx-test --mount type=volume,src=nginx-test,dst=/usr/share/nginx/html hub.c.163.com/library/nginx

        3.  多个容器可以共享一个数据卷

        4.  删除数据卷

            docker volume rm nginx-test

        5.  数据卷分为命名卷和匿名卷

        6.  查看数据卷

            docker volume ls

        7.  查看数据卷详情

            docker volume inspect 数据卷名称

        注意:  使用volumes方式挂载时,如果容器中的挂载目录已经存在文件,那么会被同步到volume中。这给我们带来了很大的便利性,我们可以不用手动去把文件从容器中拷贝出来。

              当该容器被删除时volume依然会存在,它可以被重新挂载到其他容器中,这保证了存储与容器的解耦,实现了我们需要的数据持久化功能。

    3.  bind mount volume

        1.  挂载任意存在的目录到容器内

            docker run -d -it -p 8080:80 --name=nginx-test --mount type=bind,src=/test,dst=/usr/share/nginx/html hub.c.163.com/library/nginx

        注意:  bind mount的方式与Linux mount类似,挂载后容器中相关目录的内容将会被隐藏,此时只会展示bind mount目录的内容,这点与volume明显不同。

    4.  数据卷容器

        1.  创建数据卷容器

            docker run -d -it  --name moban -v /var/volum1 hub.c.163.com/library/nginx

        2.  挂载数据卷容器

            docker run -it --name nginx --volumes-from moban nginx1

        注意:即使删除掉初始的数据卷容器,nginx1容器内的数据也不会丢失

        3.  备份数据卷

            1.  创建数据卷

                docker run -t -i -v /var/volume1 -v /var/volume2 --name wang docker.io/centos /bin/bash

            2.  备份/var/volume1

                docker run -i -t --rm --volumes-from wang -v $(pwd):/backup docker.io/centos tar cvf /backup/backup1.tar /var/volume1        

            3.  备份/var/volume2

                docker run -i -t --rm --volumes-from wang -v $(pwd):/backup docker.io/centos tar cvf /backup/backup2.tar /var/volume2

            4.  同时备份两个数据卷

                docker run -i -t --rm --volumes-from wang -v $(pwd):/backup docker.io/centos tar cvf /backup/backup.tar /var/volume1 /var/volume2

        4.  还原数据卷

            1.  还原到同一个容器

                docker run --rm --volumes-from wang -v $(pwd):/backup docker.io/centos tar xvf /backup/backup.tar -C /

            2.  还原到其他容器

                创建一个新的容器

                  docker run -t -i -v /var/volume1 -v /var/volume2 --name huihui docker.io/centos /bin/bash

                还原

                  docker run --rm --volumes-from huihui -v $(pwd):/backup docker.io/centos tar xvf /backup/backup.tar -C /          

2.  修改默认存储位置

    第一种方法

      1.  修改docker.service         

vim /usr/lib/systemd/system/docker.service
 
#在里面的EXECStart的后面增加--graph /home/docker:
 
ExecStart=/usr/bin/dockerd  -H fd:// --containerd=/run/containerd/containerd.sock  --graph /home/docker

      2.  保存退出          

systemctl enable docker
systemctl daemon-reload
systemctl restart docker

    第二种方法

      1.  编辑/etc/docker/daemon.json,添加内容:data-root

vim /etc/docker/daemon.json
 
{
  "registry-mirrors": ["https://registry.docker-cn.com"],
  "data-root": "/data/docker"
  "log-driver":"json-file",
  "log-opts": {"max-size":"100m"}
}

      2.  重启docker

    第三种方法

      1.  使用软链接

          ln -s /home/docker /var/lib

          systemctl restart docker

 

posted @ 2023-05-23 13:55  奋斗史  阅读(111)  评论(0)    收藏  举报