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的一个简单示例,看到了相同的概念。