如何使用Docker Compose中的卷在主机和容器之间共享数据

时间:2016-10-12 18:03:07

标签: docker docker-compose docker-volume

我正在使用Docker Compose和卷

version: '2'
services:
    php-apache:
        env_file:
          - dev_variables.env
        image: reypm/php55-dev
        build:
            context: .
            args:
                - PUID=1000
                - PGID=1000
        expose:
            - "80"
            - "9001"
        extra_hosts:
            # IMPORTANT: Replace with your Docker Host IP (will be appended to /etc/hosts)
            - "dockerhost:xxx.xxx.xxx.xxx"
        volumes_from:
            - volumes_source
    volumes_source:
        image: tianon/true
        volumes:
            - ../:/var/www
    volumes_data:
        image: tianon/true
        volumes:
            - ./data/sessions:/sessions

让我们采取以下事实:

  • 我在主持人的目录下有一个目录:~/var/www
  • 此目录中的数据应保留有关容器状态。
  • 容器应在/var/www
  • 下的主机上写入数据

我已阅读文档here,但我不清楚如何处理数据量和主机数据。

我想与容器共享主机上的数据,但我甚至不知道上面的docker-compose.yml文件是正确的还是需要更改的内容才能实现我的需要。我知道如何单独使用docker run但不知道Docker Compose的线索吗?

能帮我解决这个问题吗?

更新:使用此

我已将此行添加到docker-compose.yml文件中:

    volumes_from:
        - volumes_source

我再次运行docker-compose up,但结果就是这样:

php55devwork_volumes_data_1 exited with code 0
php55devwork_volumes_source_1 exited with code 0

我不确定发生了什么或者我为什么会收到错误?

1 个答案:

答案 0 :(得分:24)

看起来您正在尝试定义“数据容器”。这种模式过去很常见,但在Docker 1.9(https://github.com/docker/docker/blob/master/CHANGELOG.md#190-2015-11-03)中添加docker volume系统之后,这不是必需的。

您正在使用的此图像tianon/true旨在运行“true”命令,除了返回退出代码0之外什么都不做,然后退出。这就是容器显示为退出的原因。

使用命名卷,而不是使用数据容器。例如,以下方法使用数据容器:

docker create --name data-container -v /sessions tianon/true
docker run --volume-from data-container -d myapp

成为这个:

docker volume create --name sessions
docker run -v sessions:/sessions -d myapp

由于您正在使用compose,因此可以使用volume key定义卷。

version: '2'
services:
    php-apache:
        env_file:
          - dev_variables.env
        image: reypm/php55-dev
        build:
            context: .
            args:
                - PUID=1000
                - PGID=1000
        expose:
            - "80"
            - "9001"
        extra_hosts:
            # IMPORTANT: Replace with your Docker Host IP (will be appended to /etc/hosts)
            - "dockerhost:xxx.xxx.xxx.xxx"
        volumes:
            - sessions:/sessions
            - docroot:/var/www
volumes:
    sessions:
        driver: local
    docroot:
        driver: local

详细信息和示例位于:https://docs.docker.com/compose/compose-file/compose-file-v2/

但是,您还提到要在容器和主机之间共享此卷数据。在这种情况下,既不需要数据容器也不需要命名卷。您可以直接指定主机卷:

version: '2'
services:
    php-apache:
        env_file:
          - dev_variables.env
        image: reypm/php55-dev
        build:
            context: .
            args:
                - PUID=1000
                - PGID=1000
        expose:
            - "80"
            - "9001"
        extra_hosts:
            # IMPORTANT: Replace with your Docker Host IP (will be appended to /etc/hosts)
            - "dockerhost:xxx.xxx.xxx.xxx"
        volumes:
            - ./data/sessions:/sessions
            - ../:/var/www