用户在使用Docker的过程中,往往需要能查看容器内应用产生的数据,或者需要把容器内的数据进行备份,甚至多个容器之间进行数据共享,这必然涉及到容器的数据管理操作。
Docker提供三种方式将数据从宿主机挂载到容器中: •volumes:Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)。保存数据的最佳方式。 •bind mounts:将宿主机上的任意位置的文件或者目录挂载到容器中。 •tmpfs:挂载存储在主机系统的内存中,而不会写入主机的文件系统。如果不希望将数据持久存储在任何位置,可以使用tmpfs,同时避免写入容器可写层提高性能。
创建数据卷
[root@localhost ~]# docker volume create nginx-vol
nginx-vol
[root@localhost ~]# ls /var/lib/docker/volumes/nginx-vol/
_data
查看数据卷信息
[root@localhost ~]# docker volume ls
DRIVER VOLUME NAME
local nginx-vol
查看数据卷的详细信息
[root@localhost ~]# docker volume inspect nginx-vol
[
{
"CreatedAt": "2018-11-20T15:58:54+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/nginx-vol/_data",
"Name": "nginx-vol",
"Options": {},
"Scope": "local"
}
]
使用已有镜像创建容器,并挂载数据卷到容器里的路径/usr/share/nginx/html
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 62f816a209e6 13 days ago 109MB
[root@localhost ~]# docker run -itd -p 80:80 --name=nginx-vol-test --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
f96f73d2688f398d5efeb3f466769fc9b11318a81248f263fabdaf63cb37a635
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f96f73d2688f nginx "nginx -g 'daemon of…" 20 seconds ago Up 19 seconds 0.0.0.0:80->80/tcp nginx-vol-test
在数据卷目录准备一个测试页
[root@localhost ~]# ls /var/lib/docker/volumes/nginx-vol/_data/
50x.html index.html
[root@localhost ~]# echo "volume test111" > /var/lib/docker/volumes/nginx-vol/_data/test.html
[root@localhost ~]# cat /var/lib/docker/volumes/nginx-vol/_data/test.html
volume test111
访问容器
删除容器后数据卷里数据还在,这样的话再创建容器的时候指定数据卷路径还是可以访问
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f96f73d2688f nginx "nginx -g 'daemon of…" 16 minutes ago Up 16 minutes 0.0.0.0:80->80/tcp nginx-vol-test
[root@localhost ~]# docker stop nginx-vol-test
nginx-vol-test
[root@localhost ~]# docker rm nginx-vol-test
nginx-vol-test
[root@localhost ~]# docker volume ls
DRIVER VOLUME NAME
local nginx-vol
[root@localhost ~]# ls /var/lib/docker/volumes/nginx-vol/_data/
50x.html index.html test.html
多个容器共用一个数据卷的数据
[root@localhost ~]# docker run -itd -p 81:80 --name=volume-test1 --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
bb2677a06385c5dd6750e947a495317baa7f7fcaa8731a84dc8b7a507065deba
[root@localhost ~]# docker run -itd -p 82:80 --name=volume-test2 --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
af2ab077bdaadf069da55b31cc40c879ea3f5c78461366c312feb13ce33688dd
[root@localhost ~]# curl http://192.168.0.191:81/test.html
volume test111
[root@localhost ~]# curl http://192.168.0.191:82/test.html
volume test111
删除数据卷命令
[root@localhost ~]# docker volume ls
DRIVER VOLUME NAME
local nginx-vol
[root@localhost ~]# docker volume rm nginx-vol #确保该卷没有容器正在使用才能删除,所以先删除容器
Error response from daemon: remove nginx-vol: volume is in use - [bb2677a06385c5dd6750e947a495317baa7f7fcaa8731a84dc8b7a507065deba, af2ab077bdaadf069da55b31cc40c879ea3f5c78461366c312feb13ce33688dd]
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
af2ab077bdaa nginx "nginx -g 'daemon of…" 4 minutes ago Up 4 minutes 0.0.0.0:82->80/tcp volume-test2
bb2677a06385 nginx "nginx -g 'daemon of…" 5 minutes ago Up 5 minutes 0.0.0.0:81->80/tcp volume-test1
[root@localhost ~]# docker stop `docker ps -aq`
af2ab077bdaa
bb2677a06385
[root@localhost ~]# docker container rm `docker ps -aq`
af2ab077bdaa
bb2677a06385
[root@localhost ~]# docker volume rm nginx-vol
nginx-vol
创建容器时也可以不指定数据卷,此时docker将自动创建一个匿名的volume
[root@localhost ~]# docker run -itd --name=myweb -v /data:/data nginx
eec4af49b3fd284d00eecbd85171130aefee5035ec982e697154c2ca22dc8948
[root@localhost ~]# ls /var/lib/docker/volumes/
3f8df059fd44c1e79cda37c5c9bdb754ad71937bfe1bb40e827589ee19ffe33f metadata.db
[root@localhost ~]# docker volume ls
DRIVER VOLUME NAME
local 3f8df059fd44c1e79cda37c5c9bdb754ad71937bfe1bb40e827589ee19ffe33f
用卷创建一个容器:
# docker run -d -it --name=nginx-test --mount type=bind,src=/app/wwwroot,dst=/usr/share/nginx/html nginx
# docker run -d -it --name=nginx-test -v /app/wwwroot:/usr/share/nginx/html nginx
验证绑定:
# docker inspect nginx-test
清理:
# docker stop nginx-test
# docker rm nginx-test
注意:
1.如果源文件/目录没有存在,不会自动创建,会抛出一个错误。
2.如果挂载目标在容器中非空目录,则该目录现有内容将被隐藏。
Volume特点: •多个运行容器之间共享数据。 •当容器停止或被移除时,该卷依然存在。 •多个容器可以同时挂载相同的卷。 •当明确删除卷时,卷才会被删除。 •将容器的数据存储在远程主机或其他存储上 •将数据从一台Docker主机迁移到另一台时,先停止容器,然后备份卷的目录(/var/lib/docker/volumes/)
Bind Mounts特点: •从主机共享配置文件到容器。默认情况下,挂载主机/etc/resolv.conf到每个容器,提供DNS解析。 •在Docker主机上的开发环境和容器之间共享源代码。例如,可以将Maven target目录挂载到容器中,每次在Docker主机上构建Maven项目时,容器都可以访问构建的项目包。 •当Docker主机的文件或目录结构保证与容器所需的绑定挂载一致时
如果用户需要在容器之间共享一些持续更新的数据,最简单的方式是用数据卷容器。数据卷容器其实就是一个普通的容器,专门用它来提供数据卷供其他容器挂载使用。
创建数据卷容器,并在其中创建一个数据卷挂载到/data
[root@localhost ~]# docker run -it -v /dbdata --name dbdata centos
[root@8e6719c92634 /]# ls
anaconda-post.log bin dbdata dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
创建容器,通过volume-from来挂载dbdata容器中的数据卷 (--volumes-from可以多次使用挂载多个卷)
[root@localhost ~]# docker run -it --volumes-from dbdata --name myweb nginx /bin/bash
root@9fce51370304:/# ls /dbdata/
root@9fce51370304:/# touch /dbdata/test.txt
查看dbdata容器是否有数据
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9fce51370304 nginx "/bin/bash" 5 minutes ago Exited (0) 3 minutes ago myweb
8e6719c92634 centos "/bin/bash" 12 minutes ago Up 13 seconds dbdata
[root@localhost ~]# docker exec -it 8e6719c92634 /bin/bash
[root@8e6719c92634 /]# ls /dbdata/
test.txt
利用数据卷容器迁移数据
备份
[root@localhost ~]# docker run --volumes-from dbdata -v /backup:/backup --name work centos tar cvf /backup/backup.tar /dbdata
/dbdata/
/dbdata/test.txt
tar: Removing leading `/' from member names
[root@localhost ~]# ls /backup/
backup.tar
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
de52379b0635 centos "tar cvf /backup/bac…" 42 seconds ago Exited (0) 41 seconds ago work
9fce51370304 nginx "/bin/bash" 16 hours ago Exited (0) 16 hours ago myweb
8e6719c92634 centos "/bin/bash" 16 hours ago Up 16 hours dbdata
恢复
[root@localhost ~]# docker run -itd -v /dbdata --name db3 centos bash
100cacc5aa24ac39606b89c21dc9ef6ec010f4eb82ac666762546aadb827ad13
[root@localhost ~]# docker run --volumes-from db3 -v /backup:/backup --name db4 centos tar xvf /backup/backup.tar
dbdata/
dbdata/test.txt
[root@localhost ~]# docker exec -it db3 bash -c 'ls /dbdata'
test.txt