如何将Docker命名卷绑定到主机

时间:2019-06-28 17:59:22

标签: docker

我是Docker的新手, 在docker-compose.yml v.3.7中,我有一个共享卷(称为:apdata),由应用程序和Web服务使用,如下所示:

version: "3.7"

services:

  app:
    container_name: application
    build:
      context: ./
      dockerfile: app.dockerfile
    working_dir: /var/log
    volumes:
      - apdata:/var/log
#      - type: volume
#        source: apdata
#        target: /var/log
#        volume:
#          nocopy: true
    environment:
      - "DB_PORT=3306"
      - "DB_HOST=database"

  web:
    container_name: website
    build:
      context: ./
      dockerfile: web.dockerfile
    working_dir: /var/www
    volumes:
      - apdata:/var/www
#      - type: volume
#        source: apdata
#        target: /var/www
#        volume:
#          nocopy: true
#      - type: bind
#        source: ../www/
#        target: /var/www
    ports:
      - 8888:80
    depends_on:
      - app

volumes:
  apdata:
    driver: local
  dbdata:

上面的配置看起来正常(没有错误),但是如何与本地计算机/主机同步数据?

问题:是否有办法,或者如何将卷数据映射/绑定到主机或本地驱动器?例如:

在apdata中:Web服务:/var/www映射到本地文件:c:\test 在apdata中:应用程序服务:/var/log映射到本地文件:..\log

因此我可以读取主机(本地计算机)中的日志-Windows 然后我可以在本地计算机上部署或编辑代码,并将其同步到容器

这可能吗?

修改

它不是重复的,让我尝试解释更多:我有1个卷apdata,该卷由2个服务(应用程序和网站)共享。并映射如下:application service --> /var/logwebsite service --> /var/www

然后使用apdata,我想将其映射/同步到本地计算机,这样我就可以轻松进行开发,并且可以直接从本地计算机上查看日志,如下所示:apdata: /var/log同步到{{1 }}和../log同步到apdata: /var/www

1 个答案:

答案 0 :(得分:0)

实际上,完全有可能通过利用volume configuration in docker-compose 3.2+driverdriver_opts设置

根据您的示例,在Linux文件系统中,可能类似于:

volumes:
  apdata:
    driver: local
    driver_opts:
      type: none
      device: /home/$USER/data/app
      o: bind

  dbdata:
    driver: local
    driver_opts:
      type: none
      device: /home/$USER/data/web
      o: bind

当然,您必须确保目标文件已经存在

mkdir /home/$USER/data/{app,web}

作为此解决方案的一个不错的副作用,您仍然可以使用以下方式以常规方式列出您的卷:

docker volume ls

同时,您将能够通过这种方式绑定到此类卷的文件夹中的容器中直接访问所有共享内容。


更新

一种更简单的方法(例如,如果您只是想将其用于测试目的)是简单地摆脱“卷”部分(位于docker-compose文件的底部),而是直接将卷绑定到卷中每个服务定义的部分:

version: "3.7"

services:
  app:
    container_name: application
    build:
      context: ./
      dockerfile: app.dockerfile
    working_dir: /var/www
    volumes:
      - /home/$USER/mysite/logs:/var/log
  web:
    container_name: website
    build:
      context: ./
      dockerfile: web.dockerfile
    working_dir: /var/www
    volumes:
      - /home/$USER/mysite/test:/var/www
    ports:
      - 8888:80
    depends_on:
      - app

对于Windows系统,只需替换主机目录的完整路径以匹配您的实际文件夹结构即可,例如:

...
    volumes:
      - C:\mysite\logs:/var/log

btw:您不再需要在docker-compose中链接容器,因为现在它们已由docker自动链接,因此在您的web容器/服务中运行的任何内容都将始终能够找到您的{{ 1}}按名称提供服务(就像它们实际上是链接一样)

所以..您可以删除此部分:

app

在此处添加一个额外的示例(以匹配您最近的问题更新):

...
   links:
     - app

以这种方式运行它时,您将能够在主机中导航至以下路径:version: "3.7" services: app: container_name: application build: context: ./ dockerfile: app.dockerfile working_dir: /var/www volumes: - C:\log:/var/log web: container_name: website build: context: ./ dockerfile: web.dockerfile working_dir: /var/www volumes: - C:\test:/var/www ports: - 8888:80 depends_on: - app #-- end of file C:\log,并在其中复制任何内容,您的容器都将能够自动访问它(但在它们各自的映射路径上)。

例如,如果您复制网站的更新版本(或即使直接在该C:\temp文件夹中进行编辑),则容器将自动具有相同的更新内容。

每当您的应用生成新的日志条目(或文件)时,您都可以直接在该C:\test文件夹中访问它,实际上,该文件夹中的C:\log文件夹应用程序的范围(在其自己的容器内)


现在,如果您希望两个内容(应用程序的/var/log和网络的/var/log)共享完全相同的目录(并因此在此类路径中共享相同的文件和文件夹),则只需使用卷绑定左侧的相同目录