1. 概述
Docker容器是隔离的环境。然而,有时容器需要持久存储并共享数据。这可能发生在第二个容器需要访问共享缓存或使用数据库数据时。我们还可能需要备份或对用户生成的数据执行操作。
在本文中,我们将通过使用Docker Compose的一个示例,了解如何在Docker容器之间共享数据。
2. 使用Docker存储持久存储与共享数据
当容器运行时,所有文件都会获得一个可写空间。但是,在我们停止容器后,它们将不再存在。
Docker使用存储选项,如果需要保存数据,则提供持久化和内存选项。存储文件还可以提高性能,因为它直接将内容写入主机文件系统,而不是使用容器的可写层。
2.1. Docker卷
让我们快速了解一下Docker卷。例如,让我们运行一个带有命名卷的Nginx容器。
首先,让我们创建我们的卷:
docker volume create --name volume-data
然后,让我们运行我们的容器:
docker run -d -v volume-data:/data --name nginx-test nginx:latest
在这种情况下,Docker将在容器的*/data*文件夹中挂载。如果容器在要挂载的路径中有文件或目录,它还将复制目录的内容到卷中。
我们也可以查看挂载绑定以实现持久存储。
2.2. 使用卷共享数据
多个容器可以在需要访问共享数据时使用相同的卷。
例如,让我们启动我们的Web应用程序:
docker run -d -v volume-data:/usr/src/app/public --name our-web-app web-app:latest
默认情况下,Docker会创建一个本地卷。但是,我们可以使用volume驱动程序在多台机器上共享数据。
最后,Docker还具有--volumes-from来在运行的容器之间链接卷。它可能有助于数据共享或更一般的备份用途。
3. 使用Docker Compose共享数据
我们已经看到如何使用Docker创建卷。**Docker Compose也支持在YAML模板定义中使用*[volumes]关键字。*
让我们创建一个docker-compose.yml来运行两个Nginx容器和我们的Web应用程序共享相同的卷:
services:
nginx:
container_name: nginx
build: ./nginx/
volumes:
- shared-volume:/usr/src/app
web-app:
container_name: web-app
env_file: .env
volumes:
- shared-volume:/usr/src/app/public
environment:
- NODE_ENV=production
volumes:
shared-volume:
同样,在Docker Compose中,默认的驱动程序将为本地。我们也可以指定要使用的驱动程序:
volumes:
db:
driver: some-driver
我们可能还需要使用Docker Compose外部的卷:
volumes:
data:
external: true
name: shared-data
4. 总结
在这篇文章中,我们看到了如何使用卷在Docker容器之间共享数据。我们还通过使用Docker Compose的一个简单示例,看到了相同的概念。