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

Tom*_*ato 33 docker

我看到了码头组合模式,但我很困惑.制作组合容器的最佳方法是什么.我什么时候应该使用link,或者volumes_from.什么时候应该使用volumes_from,volumes

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}
Run Code Online (Sandbox Code Playgroud)

2 app-db +数据

app:
    image: someimage
    link:
        - db // data volume container name 
db:
    image: mysql
    volumes:
        - data // data file name
Run Code Online (Sandbox Code Playgroud)

应用

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} 
Run Code Online (Sandbox Code Playgroud)

2 app-service +数据

app:
    image: someimage
    volumes_from:
        - service // service container name 
service:
    image: mysql
    volumes:
        - data // mounted file
Run Code Online (Sandbox Code Playgroud)

谢谢

小智 26

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

Volumesvolumes_from的不同之处在于,第一个只声明了docker将使持久性或主机进行挂载的卷:guest虚拟机挂载,但volumes_from告诉docker使用已在另一个主机上声明的卷(使其可用于此主机).

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

在docker文档中完美地解释了链接.

希望能帮助到你.


jua*_*tas 21

简而言之:

  1. volumes_from 从其他容器安装.
  2. volumes 内联定义的挂载.
  3. links 连接容器.

稍微解释一下:

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

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

    最简单的就是使用卷.因为您可以通过命名它们来重用它们.

  3. links是不同的.因为它没有安装.相反,它连接容器.所以,如果你这样做:

    app:
      container_name: app_container
      links:
        - db
    
    Run Code Online (Sandbox Code Playgroud)

    这意味着,如果你连接到app_containerdocker exec -it app_container bash和尝试ping db,你会看到,容器是能够解决IP为分贝.

    这是因为docker 在容器之间创建了一个网络.