仅需2小时-让你轻松学会使用docker-仓库管理篇(4)

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 ..
结论

容器间可以共享数据卷容器,不过数据是保存在数据卷内,并没有保存到宿主机的文件目录中