首页 > 技术文章 > Docker容器数据卷(持久化)

ccku 2020-08-06 11:08 原文

Docker容器数据卷

功能:
容器的持久化
容器间继承+共享数据

添加数据卷

一、直接命令添加

1.命令:

docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
[root@aaa /]# docker run -it -v /myDatavolume:/myDatavolume tomcat

容器退出后重新启动,数据卷是否同步 √

2.命令(带权限)

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

二、DockerFile添加

1.file构建

FROM centos
VOLUME ["/Data1","Data2"] -- privileged=true
CMD echo "finished,----success1"
CMD /bin/bash    

2.docker build 生成新的镜像

docker build -f /dockerfile路径 -t 标签 .

3.run容器

docker run -it yz/centos
[root@aaa ~/mydocker]# docker run -it yz/centos1
WARNING: IPv4 forwarding is disabled. Networking will not work.
[root@94c424fc5074 /]# ls -l
total 0
drwxr-xr-x   2 root root   6 Aug  6 02:27 Data1
drwxr-xr-x   2 root root   6 Aug  6 02:27 Data2

4.查看宿主机路径

docker inspect <容器名>

docker数据持久化和数据共享

数据卷

数据卷是一个可供多个容器使用的特殊目录,绕过了UFS。
特性:

  • 1.数据卷可以在容器之间共享和重用
  • 2.对数据卷的修改会立即生效
  • 3.对数据卷的更新,不会影响镜像
  • 4.数据默认会一直存在,即使容器被删除

创建数据卷

[root@919 ~]# docker volume create test1
test1

查看所有的数据卷

[root@919 ~]# docker volume ls
DRIVER              VOLUME NAME
local               b6dd359fa115f77651bccd31160d3badf96532c5d37f2d799f0928c6c6f34167
local               test1

使用inspect命令查看指定数据卷的信息

[root@919 ~]# docker  volume inspect test1
[
    {
        "CreatedAt": "2020-09-20T08:49:35+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/test1/_data",
        "Name": "test1",
        "Options": {},
        "Scope": "local"
    }
]

启动一个挂载数据卷的容器,使用docker run命令,一次docker run可以挂载多个数据卷。

[root@919 ~]# docker run -it --name test1 -v test1:/tmp centos
[root@5e0138ae7301 /]# df -hT
Filesystem     Type     Size  Used Avail Use% Mounted on
overlay        overlay   40G  3.9G   34G  11% /
tmpfs          tmpfs     64M     0   64M   0% /dev
tmpfs          tmpfs   1000M     0 1000M   0% /sys/fs/cgroup
shm            tmpfs     64M     0   64M   0% /dev/shm
/dev/vda1      ext4      40G  3.9G   34G  11% /tmp

重新打开一个终端查看:

[root@919 ~]# docker inspect test1

从配置中我们可以看到挂载了一个名为test1的存储卷,并且挂载到容器内的/tmp目录下。

进入到容器内,创建文件

[root@5e0138ae7301 /]# cd /tmp/  
[root@5e0138ae7301 tmp]# echo "11111" > test_2020_09_20 

退出容器,并将该容器删除

[root@5e0138ae7301 tmp]# exit
[root@919 ~]# docker rm test1

并创建一个新的容器,并查看是否有刚才创建的文件

[root@919 ~]# docker run --name centos1 -it -v test1:/tmp centos
[root@5a3bf5cad675 /]# cd /tmp/
[root@5a3bf5cad675 tmp]# ls
ks-script-2n9owwnh  ks-script-xm1o5azb	test_2020_09_20
[root@5a3bf5cad675 tmp]# cat test_2020_09_20 
11111

数据卷是被设计用来持久化数据的,它的生命周期独立于容器,docker不会在容器被删除后自动删除数据卷,并且也不存在垃圾回收机制,回收没有任何容器引用的数据卷。
如果需要删除在删除容器同时移除数据卷,可以在删除容器时使用docker rm -v命令。

挂载主机目录

docker持久化存储除了有逻辑卷还有一个是挂载目录

# 挂载一个主机目录作为数据集,可以使用`--mount`或`-v`指定目录
[root@919 ~]# docker run -it --name centos1 -v /data:/data centos
[root@11ff081d5454 ~]# cd /data/
[root@11ff081d5454 data]# ls
[root@11ff081d5454 data]# echo "ccku" > 1.txt
[root@11ff081d5454 data]# exit 
exit
[root@919 ~]# cat /data/1.txt 
ccku
# 如果使用-v参数如果本地目录不存在docker会自动创建一个目录

查看数据卷的具体信息,可以在主机上使用inspect查看指定容器的信息。

[root@919 ~]# docker inspect centos1
……
        "Mounts": [
            {
                "Type": "bind",
                "Source": "/data",
                "Destination": "/data",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
……

推荐阅读