docker的镜像是只读的,虽然依据镜像创建的容器可以进行操作,但是我们不能将数据保存到容器中,因为容器会随时关闭和开启,那么如何将数据保存下来呢?
答案就是:数据卷和数据卷容器
数据卷 数据卷就是将宿主机的某个目录,映射到容器中,作为数据存储的目录,我们就可以在宿主机对数据进行存储。
缺点是:太单一了
数据卷命令 1 2 3 4 docker run --help …… -v, --volume list Bind mount a volume 挂载一个数据卷 ……
我们可以使用命令 docker run 用来创建容器,可以在使用docker run 命令时添加 -v 参数,就可以创建并挂载一个到多个数据卷到当前运行的容器中。
-v 参数的作用是将宿主机的一个目录(绝对路径)作为容器的数据卷挂载到docker容器中,使宿主机和容器之间可以共享一个目录,如果本地路径不存在,Docker也会自动创建。
-v 宿主机文件:容器文件
数据卷实践 命令格式 1 docker run -itd --name [容器名字] -v [宿主机目录]:[容器目录] [镜像名称] [命令(可选)]
命令演示 宿主机创建数据目录及文件 1 2 3 4 5 6 7 Tony-iMac:Documents tony$ mkdir share_dir Tony-iMac:Documents tony$ cd share_dir Tony-iMac:share_dir tony$ pwd /Users/tony/Documents/share_dir Tony-iMac:share_dir tony$ echo "共享目录文件内容——hello world" > temp.txt Tony-iMac:share_dir tony$ cat temp.txt 共享目录文件内容——hello world
启动容器并挂载数据卷 1 docker run -dit --name myos -v /Users/tony/Documents/share_dir:/home/temp centos
进入容器测试效果 1 2 3 4 5 6 7 docker exec -it myos /bin/bash [root@053105b8bcf9 temp]# cd /home/temp [root@053105b8bcf9 temp]# ls temp.txt [root@053105b8bcf9 temp]# cat temp.txt 共享目录文件内容——hello world
可以看到容器中该目录有了同样的数据,此时测试不管从宿主机还是容器中对目录内进行增删改,另外一端数据会保持同步,实现了数据的共享。同样的你还可以在运行其他容器时也将目录映射到该数据卷,即实现了多台容器的数据共享。
数据卷容器 将宿主机的某个目录,使用容器的方式来表示,然后其他的应用容器将数据保存在这个容器中,达到大批量应用数据同时存储的目的。
简单来讲就是就上面的数据卷我们在创建了一套模板,在运行其他容器时可以使用这个数据卷模板,方便我们更容易的实现数据共享。
数据卷容器命令 1 2 3 # docker run --help 。。。 -v, --volumes-from value Mount volumes from the specified container(s) (default [])从指定的容器挂载卷,默认为空
数据卷容器实践 命令格式 1 docker create -v [容器数据卷目录] --name [容器名字] [镜像名称] [命令(可选)]
命令演示 创建数据卷容器 1 docker create -v /tmp/share_dir --name mycentos centos
运行两个容器,同时挂载数据卷容器 命令格式 1 docker run --volumes-from [数据卷容器id/name] -tid --name [容器名字] [镜像名称] [命令(可选)]
开始创建容器 1 2 3 4 Tony-iMac:share_dir tony$ docker run --volumes-from mycentos -dit --name centos_01 centos 316ecb5d9e27356d2bac37d2347c40a9f6aeff4f4f11b6c4ffe55fff0989c60d Tony-iMac:share_dir tony$ docker run --volumes-from mycentos -dit --name centos_02 centos 4fe253623d92f9fbc75677e9b1fca8df765396fb06cf4c81e184d9416570afc2
查看容器运行记录 1 2 3 4 5 6 Tony-iMac:share_dir tony$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4fe253623d92 centos "/bin/bash" 7 seconds ago Up 6 seconds centos_02 316ecb5d9e27 centos "/bin/bash" 12 seconds ago Up 11 seconds centos_01 59f12ab389c2 centos "/bin/bash" 4 minutes ago Created mycentos Tony-iMac:share_dir tony$
可以看到数据卷容器的状态明显与其他容器不同,为Created
确认数据共享 进入centos_01操作数据卷容器 1 2 3 4 5 6 [root@7272f36f7f56 share_dir]# pwd /tmp/share_dir [root@7272f36f7f56 share_dir]# ls [root@7272f36f7f56 share_dir]# echo '我是001创建的'>001.txt [root@7272f36f7f56 share_dir]# cat 001.txt 我是001创建的
进入centos_02容器,确认数据卷是否被修改 1 2 3 4 5 6 7 8 9 10 11 12 [root@5bb58e4ee298 share_dir]# pwd /tmp/share_dir [root@5bb58e4ee298 share_dir]# ls 001.txt [root@5bb58e4ee298 share_dir]# cat 001.txt 我是001创建的 [root@5bb58e4ee298 share_dir]# echo '我是02容器创建的'>002.ini [root@5bb58e4ee298 share_dir]# ls 001.txt 002.ini [root@5bb58e4ee298 share_dir]# cat 002.ini 我是02容器创建的
进入centos_01,验证 1 2 3 4 [root@7272f36f7f56 share_dir]# ls 001.txt 002.ini [root@7272f36f7f56 share_dir]# cat 002.ini 我是02容器创建的
回到宿主机验证 1 2 3 4 5 6 Tony-iMac:share_dir tony$ pwd /tmp/share_dir Tony-iMac:share_dir tony$ ls -la total 0 drwxr-xr-x 2 tony wheel 68 4 2 15:39 . drwxrwxrwt 23 root wheel 782 4 2 15:22 ..
结论 容器间可以共享数据卷容器,不过数据是保存在数据卷内,并没有保存到宿主机的文件目录中