Docker-数据存储

578 阅读2分钟

Docker容器一旦删除,其中的文件系统也会随之删除,所有的数据也就不复存在了。Docker提供了数据卷(Data Volume)实现数据持久化,以及容器之间共享数据。

1.数据卷Data Volume

数据卷存储的默认目录为 /var/lib/docker/volumes,并且以一个Hash字符串作为容器的数据文件目录名称。

查看/var/lib/docker/volumes目录

$ sudo ls /var/lib/docker/volumes
0ed99ff2bc272cd74a6a33a3a27417e0e66706001130e5c3a02567931c890ed7
1a3e588b304f706f0363ee0350a5754fa038ca86a71b9a0bd80b43fb83bbe734
8fcb8a441aeff24a858952b2a268b34f993579f861d66306169e94f641f29834
metadata.db

也可以使用docker volume命令查看已有的数据卷

$ sudo docker volume ls
DRIVER              VOLUME NAME
local               0ed99ff2bc272cd74a6a33a3a27417e0e66706001130e5c3a02567931c890ed7
local               1a3e588b304f706f0363ee0350a5754fa038ca86a71b9a0bd80b43fb83bbe734
local               8fcb8a441aeff24a858952b2a268b34f993579f861d66306169e94f641f29834

1.1 数据卷别名

以Hash命名数据目录虽然可以实现数据持久化,但宿主机中如果运行多个容器,就显得很不友好了,各个容器的数据卷就很难区分了。所以Docker提供了数据卷别名来解决这个问题。

创建容器的时候使用-v参数可以指定数据卷别名,如

sudo docker run --name mariadb \
  -v mariadb:/var/lib/mysql \
  -p 3307:3306 \
  -e MYSQL_ROOT_PASSWORD= \
  -e MYSQL_ROOT_HOST=% \
  -d mariadb:10.2

其中使用了-v mariadb:/var/lib/mysql指定了数据卷的名称为mariadb

$ sudo docker volume ls
DRIVER              VOLUME NAME
local               mariadb

1.2 Bind Mounting

Bind Mounting可以指定一个本地目录与Docker容器数据卷映射,它们的数据时同步的。使用Bind Mounting同样是使用-v参数,不过与数据卷别名不同的是使用目录而不是别名。

sudo docker run --name mariadb \
  -v /data/mariadb:/var/lib/mysql \
  -p 3307:3306 \
  -e MYSQL_ROOT_PASSWORD= \
  -e MYSQL_ROOT_HOST=% \
  -d mariadb:10.2
  • 实例:设置容器时区与宿主机一致 创建容器的时候指定启动参数,挂载timezone及localtime文件到容器内 ,保证两者所采用的时区一致
docker run --name <container_name> \
-v /etc/timezone:/etc/timezone:ro \
-v /etc/localtime:/etc/localtime:ro ....

容器创建以后,将宿主机的timezo及nelocaltime文件覆盖到容器内

docker cp /etc/timezone <container>:/etc/timezone
docker cp /etc/localtime <container>:/etc/localtime