volume-from和volume之间有什么区别?

时间:2015-03-27 17:28:51

标签: docker

我看到了码头组合模式,但我很困惑。制作组合容器的最佳方法是什么。 我应该何时使用linkvolumes_from。 我应该何时使用volumes_fromvolumes

1 app-db-data

app:
    image: someimage
    link:
        - db // data volume container name 
db:
    image: mysql
    volumes_from:
        - data // data volume name
data:
    image: someimage
    volumes:
        - {host data}:{guest data}

2 app-db + data

app:
    image: someimage
    link:
        - db // data volume container name 
db:
    image: mysql
    volumes:
        - data // data file name

应用

1 app-service-data

app:
    image: someimage
    volumes_from:
        - service // service container name 
service:
    image: mysql
    volumes_from:
        - data // image container name
data:
    image: someimage
    volumes:
        - {host data}:{guest data} 

2 app-service + data

app:
    image: someimage
    volumes_from:
        - service // service container name 
service:
    image: mysql
    volumes:
        - data // mounted file

由于

3 个答案:

答案 0 :(得分:24)

链接 volumes_from 是不同的概念。当您需要连接(通过网络)两个容器时,将使用链接。在这种情况下,如果要将App连接到数据库,则执行此操作的方法是使用链接,因为应用程序使用端口和主机连接到数据库(而不是文件系统上的目录)。

volumes_from 的不同之处在于,第一个只声明了docker将使持久性或主机:guest安装的卷,但volumes_from告诉docker使用的卷是已在另一台主机上声明(使其可供此主机使用)。

在您提出的4个案例中,我认为第一个和第二个案例都是不错的选择。首先,您要创建一个仅数据容器,并使mysql容器使用它。在第二种情况下,数据和mysql容器是相同的。

Linksvolumes在docker文档中有完美的解释。

希望它有所帮助。

答案 1 :(得分:18)

简而言之:

  1. volumes_from 从其他容器中安装
  2. volumes 安装内联定义。
  3. links 连接容器。
  4. 稍微解释一下:

    1. volumes_from从其他容器装入卷。例如,如果您只有数据容器,并且您希望仅在具有应用程序代码的容器中装载这些数据。

    2. volumes是定义和装载卷的内联方式。如果您阅读#17798,您可以看到命名卷在大多数情况下只能替换数据容器。

      最简单的就是使用卷。由于您可以通过命名来重复使用它们。

    3. links不同。因为它无法挂载。相反,它连接容器。所以如果你这样做:

      app:
        container_name: app_container
        links:
          - db
      

      这意味着,如果您使用app_container连接到docker exec -it app_container bash并尝试ping db,您将看到该容器能够解析数据库的ip。

      这是因为docker在容器之间创建network

答案 2 :(得分:0)

添加:当您想要装载容器的所有非卷时使用Volumes_from - 从早期开始就可以直接装入命名卷。

AFAIC https://docs.docker.com/compose/compose-file/#volumes。 docker-compose完全删除了这个功能,不确定如何以及为什么以及是否有替代方案。但是假设你有一个app容器,你有一个httpd容器。通常你会将codebase文件夹/ var / www定义为anon卷,然后将其挂载到httpd中以使用httpd服务提供静态文件,同时将所有动态文件(如ruby / php / java)传递给上游后端应用

使用anon卷而非命名卷的重点是,实际上您希望能够重新部署应用程序并更改代码库(应用程序更新),如果应用程序具有命名卷,则无法使用。也就是说,anon卷正是这样做的,这就是为什么在这里使用volumes_from - 在这种情况下使用命名卷是没有选择的(因为它在许多其他情况下非常实用)。

有关volumes_from的升级指南,请参阅: https://docs.docker.com/compose/compose-file/compose-versioning/#upgrading

因此,volumes_from通常用于不同的上下文/场景中,并且命名卷是ll其他情况中的标准,如上所述。关于这一点的简短帖子是https://stackoverflow.com/a/44744861/3625317