Docker数据卷(Data Volumes)—Docker数据持久化及容器间共享数据

本文目录

  • 1. 为什么要使用数据卷(Data Volumes)
  • 2 .数据卷类型(Data Volumes)
  • 3. 宿主机数据卷
    • 3.1. 示例 1
    • 3.2. 示例2
    • 3.3 数据覆盖问题
  • 4. 命名和匿名数据卷
  • 5.匿名数据卷
  • 6. 数据卷容器(Data Volume Containers)

1. 为什么要使用数据卷(Data Volumes)

  • 当我们在使用docker容器的时候,会产生一系列的数据文件,这些数据文件在我们删除docker容器时会一起删除。比如,我们启动了一个mysql容器,如果哪天我们把这个mysql容器给删除了,那数据也就一起删除了。使用Docker数据卷可以把这个mysql容器的数据保存到宿主主机。数据不会随着容器的删除而删除。
  • 实现容器之间的数据共享。比如,我们想要两个Nginx之间共同使用一个配置文件。

数据卷(Data Volumes) 是一个可供一个或多个容器使用的特殊目录,它将主机操作系统目录直接映射进 容器。可以简单的理解为docker容器数据卷就是我们使用的移动硬件,它存在于一个或多个的容器中,由 docker挂载到容器,但不属于联合文件系统,Docker不会在容器删除时删除其挂载的数据卷。

2 .数据卷类型(Data Volumes)

Docker提供了三种数据卷类型:

  1. 宿主机数据卷(bind mount): 直接在宿主机的文件系统中但是容器可以访问,这种类型是比较常用的一种类型。
  2. 命名的数据卷: 由Docker管理的数据卷,创建的容器的时候指定数据卷名称,docker数据卷默认目录为:/var/lib/docker/volumes
  3. 匿名数据卷: 由Docker管理的数据卷,创建的容器的时候不需要指定数据卷名称,由Docker随机生成,docker数据卷默认目录为:/var/lib/docker/volumes

3. 宿主机数据卷

容器内的数据可以存放到宿主机文件系统的任意位置,除了docker之外的进程也可以任意对他们进行修改。

docker run -v /宿主机绝对路径目录:/容器内目录 镜像名

注意事项

  • 挂载数据卷,最好是通过run而非create/start创建启动容器,create/start命令创建启动容器 后,再挂载数据卷相当麻烦,要修改很多配置文件。
  • docker官网推荐尽量进行目录挂载,不要进行文件挂载。

3.1. 示例 1

Mysql数据,保存到宿主机的指定目录下。

Mysql镜像地址:https://hub.docker.com/_/mysql

  • 拉取mysql镜像

    docker pull mysql:5.7.36
    
  • 运行镜像

    把Mysql容器数据存放到宿主主机-v /usr/data/mysql:/var/lib/mysql目录。

    docker run -itd --name mysql --restart always --privileged=true -p 3306:3306 -eMYSQL_ROOT_PASSWORD=123456 -v /usr/data/mysql:/var/lib/mysql mysql:5.7.36
    --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    

    启动成功后,可以进入到/usr/data/mysql目录,里面存放着Mysql的数据。

    在Mysql中创建一张表,然后删除容器后在启动容器,查看刚才创建的表是否还在

3.2. 示例2

把tomcat容器webapps数据存放到宿主主机-v /usr/data/tomcat8/:/usr/local/tomcat/webapps/目录。

docker run -itd --name tomcat8.5 -v /usr/data/tomcat8/:/usr/local/tomcat/webapps/ -p 8080:8080 tomcat:8.5.45-jdk8-corretto

3.3 数据覆盖问题

  • 如果挂载一个空的数据卷到容器中的一个非空目录中,那么这个目录下的文件会被复制到数据卷中 如果挂载一个非空的数据卷到容器中的一个目录中,那么容器中的目录会显示数据卷中的数据。
  • 如 果原来容器中的目录有数据,那么原始数据会被隐藏掉

4. 命名和匿名数据卷

由Docker管理的数据卷,创建的容器的时候指定数据卷名称(不需要指定具体的路径),docker数据卷默认目录为:/var/lib/docker/volumes

  • 运行镜像

     # 拉取镜像
     docker pull nginx:1.21.4-perl
     
     # 启动nginx容器,把nginx配置目录挂载到nginx-volume数据卷
     docker run -itd --name nginx -v nginx-volume:/etc/nginx/ -p 80:80 nginx:1.21.4-perl
    
  • 查看数据卷

    docker volume ls
    
    #使用inspect查看数据卷详细信息
    docker volume inspect nginx-volume
    
    [root@localhost volumes]# docker volume inspect nginx-volume
    [
        {
            "CreatedAt": "2021-12-25T01:41:27+08:00",
            "Driver": "local",
            "Labels": null,
            "Mountpoint": "/var/lib/docker/volumes/nginx-volume/_data",
            "Name": "nginx-volume",
            "Options": null,
            "Scope": "local"
        }
    ]
    
  • 清理数据卷

    删除上面创建的容器后会,发现数据卷仍然存在,我们就需要去清理它,不然会占用我们的资源

    # 清理数据卷
    docker volume prune
    

5.匿名数据卷

由Docker管理的数据卷,创建的容器的时候不需要指定数据卷名称,由Docker随机生成,比如启动一个Nginx容器

docker run -itd --name nginx -v /etc/nginx/ -p 80:80 nginx:1.21.4-perl

-v /etc/nginx/ 没有指定数据卷名称,docker会随机生成一个。

6. 数据卷容器(Data Volume Containers)

如果需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器(Data Volume Containers)。数据卷容器 也是一个容器,但是它的目的是专门用来提供数据卷供其他容器挂载。

Docker数据卷(Data Volumes)—Docker数据持久化及容器间共享数据_第1张图片

  • 基础镜像

    docker pull centos:7.8.2003
    docker pull nginx:1.21.4-perl
    
  • 创建数据卷容器

    使用centos:7.8创建一个名为data-volume数据卷容器,把nginx的/usr/share/nginx/html 目录和 宿主主机/usr/data/nginx目录做关联。

    docker run -d --name data-volume -v /usr/data/nginx:/usr/share/nginx/html centos:7.8.2003
    

    创建好的数据卷容器是处于停止运行的状态,因为使用 —volumes-from 参数所挂载数据卷的容器 自己并不需要保持在运行状态。

  • 启动两个Nginx

    使用--volumes-from参数挂载到data-volume 数据卷。这样两个nginx就可以共享使用同一个数据目录了。

    docker run -itd --name nginx01 -p 8080:80 --volumes-from data-volume nginx:1.21.4-perl
    
    docker run -itd --name nginx01 -p 8081:80 --volumes-from data-volume nginx:1.21.4-perl
    

参考文档:

https://docs.docker.com/storage/volumes/

你可能感兴趣的:(docker,容器,docker)