在docker中,它的存储文件系统是在dockerhost上原有的xfs或ext4架设了一层文件系统:overlay2,通过docker info命令可以查看出主机上docker相关的信息,包括支持的网络类型、系统版本、内核版本、docker主机的cpu、内存等信息。如下:
在docker中实现数据持久化有两种方式:
.
Bind mount和Docker Manager Volume的区别:
.
数据持久化的特点:
1、Bind mount——数据卷容器:--volumes-from方式实现数据持久化 以下数据卷容器挂载的方式就是Bind mount实现方式
实现的大概思路如下:
上面实现的效果可能我表达的不够好,举个例子 : 有A、B、C这三个容器,其中A作为数据卷容器,挂载了本地的/data/web01和/data/web02这两个目录到容器内的/usr/share/nginx/html/和/data这两个目录。 容器B和容器C在运行之初,通过--volumes-from选项来指定容器A的名称或ID,那么最终实现的效果就是,A、B、C这三个容器内都会存在/usr/share/nginx/html及/data这两个目录,并且是实现了数据持久化的,对应的本地目录都是/data/web01和/data/web02。
#基于busybox镜像来做数据卷容器
[root@docker01 ~]# docker run -itd --name data -v /data/web01/:/usr/share/nginx/html -v /data/web02/:/data busybox
[root@docker01 ~]# docker run -d --name web01 --volumes-from data -P nginx
[root@docker01 ~]# docker run -d --name web02 --volumes-from data -P nginx
当容器运行成功后,通过命令docker inspect 容器名称来查看容器的挂载信息(在查看出来的信息中找到mount字段):
1、数据卷容器data查看到的mount信息如下
[root@docker01 ~]# docker inspect data
2、容器web01查看到的mount信息如下
[root@docker01 ~]# docker inspect web01
3、容器web02查看到的mount信息如下
[root@docker01 ~]# docker inspect web02
不难发现,采用数据卷容器这种方式可以让多个容器挂载相同的目录,让其要实现数据持久化的目录保持一致。 在需要运行的容器都运行完成后,--volumes-from指定的容器,停止或被删除,都不会影响基于nginx镜像运行的容器数据持久化。
数据卷容器使用场景:
2、Docker Manager Volume实现数据持久化
#运行容器时,-v选项只指定一个路径,则就是容器内的目录,也就是Docker Manager Volume方式
[root@docker01 ~]# docker run -itd -v /usr/share/nginx/html -P --name web03 nginx
[root@docker01 ~]# docker inspect web03
可以看到,它是挂载的本地一个目录,这个目录看起来比较杂乱无章,其实不然,它是docker 的root根目录,在其根目录下有一个volume目录,这个目录就是用来存放Docker Manager Volume实现数据持久化产生的数据的,在volume目录下会有以容器ID命名的目录,然后下面会有_data这个目录,这个目录就是和容器内的数据持久化目录遥相对应的。建议了解一下docker 的根目录下都有哪些东西,根目录下的部分信息如下:
[root@docker01 docker]# pwd
/var/lib/docker
[root@docker01 docker]# ls
builder containerd image overlay2 runtimes tmp volumes
buildkit containers network plugins swarm trust
[root@docker01 docker]# tree volumes/
volumes/
├── 9376aa52ee88fb4e3164e7b71bdcc7a2aa9b60ae0741a7ef0fdbfa2d6fc7d146
│ └── _data
│ ├── 50x.html
│ └── index.html
└── metadata.db