8.1 认识虚拟磁盘
挂载卷(Volumes)是Docker最有用的功能之一。有了它,容器可以轻松访问主机机器上的数据。这个功能让数据管理变得灵活又方便:你可以长期保存信息,在容器之间共享数据,还能毫无压力地备份或者恢复数据,万一出了啥问题也不怕。
卷(Volumes)在Docker中,是一种能够独立于容器保存数据的方式。就算容器被删掉了,存储在卷中的信息依然是安全的。卷可以被挂载到容器上,这样数据就能独立存储并重复使用,不管你创建还是删掉容器多少次,都没问题。
主要卷的类型
- 匿名卷(Anonymous Volumes)
- 如果没有明确为容器指定卷,Docker会自动创建。
- 用于临时保存数据。
- 命名卷(Named Volumes)
- 由Docker创建并管理。
- 可以连接到多个容器,即使容器删除或停止,也依然保留。
- 绑定挂载(Bind Mounts)
- 将主机机器上的目录与容器中的目录关联起来。
- 特别适合访问主机系统上的数据,在开发时非常方便。
挂载卷的docker run
命令主要语法
-v <host_path>:<container_path>
完整语法:
docker run -v <host_path>:<container_path> [OPTIONS] IMAGE [COMMAND] [ARG...]
挂载卷的主要参数
1. 参数 -v
或 --volume
用于创建命名卷或绑定挂载。
示例:
docker run -d -v /host/data:/container/data nginx
2. 参数 --mount
提供更灵活、更详细的挂载卷方式,支持附加参数。
示例:
docker run -d --mount type=bind,source=/host/data,target=/container/data nginx
8.2 创建和使用卷
1. 命名卷
命名卷是由 Docker 创建和管理的。它们用于持久化存储需要在容器重启或删除后保留的数据。
创建命名卷:
docker volume create my_volume
运行带有卷挂载的容器:
在这个例子中,卷 my_volume
被挂载到容器内的目录 /data
中。写入到 /data
的所有数据都会保存在卷中,即使容器被删除,数据也会保留。
docker run -d -v my_volume:/data --name my_container nginx
2. 匿名卷
匿名卷是 Docker 自动创建并与特定容器关联的。它们适用于不需要在容器删除后保留的临时数据。
运行带有匿名卷的容器:
在这个例子中,Docker 会自动创建一个匿名卷,并将其挂载到容器内的目录 /data
中。
docker run -d -v /data --name my_container nginx
3. 绑定目录
绑定目录允许将主机系统的目录挂载到容器中。这对于容器和主机系统之间共享数据非常有用。此外,这种方法常用于开发过程中,当源代码存储在主机系统上时。
运行带有绑定目录的容器:
在这个例子中,主机机器上的目录 /host/data
被挂载到容器内的目录 /container/data
中。
docker run -d -v /host/data:/container/data --name my_container nginx
8.3 使用卷的例子
1. 保存数据库数据
使用卷来存储数据库数据,即使在容器重启或者更新时也能保留数据。这个特别重要,能在生产环境中保证可靠操作。
例子:
下面的例子中,PostgreSQL 的数据保存在卷 db_data
中,这样确保了即使容器重启或删除,数据依然能保留。
docker volume create db_data
docker run -d -v db_data:/var/lib/postgresql/data --name postgres_container postgres
2. 容器间共享数据
有时需要让多个容器共享数据。用卷就可以很方便地实现这一目标。
例子
创建一个卷,并启动两个容器,这两个容器会使用这个卷。两个容器都可以访问卷 shared_data
中的数据,这样就能实现数据共享。
docker volume create shared_data
docker run -d -v shared_data:/data --name container1 nginx
docker run -d -v shared_data:/data --name container2 nginx
3. 开发和测试
在开发应用时,可以使用绑定目录来在容器和主机之间共享源代码。这样开发者可以在主机上编辑代码,并且容器可以实时使用更新后的代码。
例子
在这个例子中,主机的目录 /path/to/source
挂载到容器 dev_container
的目录 /app
中。这样容器能够直接使用主机系统上的最新源代码。
docker run -d -v /path/to/source:/app --name dev_container node
8.4 管理卷
Docker 提供方便的命令来管理卷,通过这些命令可以轻松创建、删除和查看卷的信息。
1. 查看所有卷
这个命令会列出主机上所有可用的卷。
docker volume ls
2. 查看卷的信息
使用这个命令可以获取卷 my_volume
的详细信息,比如它在主机文件系统上的位置,以及使用这个卷的容器信息。
docker volume inspect my_volume
3. 删除卷
这个命令会删除卷 my_volume
。在删除之前需要确保该卷未被任何容器使用,否则命令不会执行成功。
docker volume rm my_volume
8.5 卷的备份
为了保护数据安全,重要的是要能够创建卷的备份并在需要时恢复它们。
1. 备份卷
在这个例子中,卷 my_volume
的内容被归档到文件 my_volume_backup.tar.gz
中,该文件保存在主机机器的目录 /backup
中。
docker run --rm -v my_volume:/volume -v /backup:/backup busybox tar czf /backup/my_volume_backup.tar.gz /volume
2. 恢复卷
这个例子从备份文件 my_volume_backup.tar.gz
中恢复卷 my_volume
的内容。
docker run --rm -v my_volume:/volume -v /backup:/backup busybox tar xzf /backup/my_volume_backup.tar.gz -C /volume
GO TO FULL VERSION