容器如何在docker-compose.yml中相互链接

时间:2018-03-25 16:08:16

标签: docker docker-compose dockerfile

要构建一个网络服务器,我试图了解容器附加的方式,我真的需要一些快速的答案。
因此,如果我们将此docker-compose.yml文件作为示例:

version: '2'

services:

    # APP
    nginx:
        build: docker/nginx
        volumes_from:
            - php
        links:
            - php
        depends_on:
            - php

    php:
        build: docker/php
        volumes:
            - ${SYMFONY_APP_PATH}:/symfony
        links:
            - mysql
            - faye
            - rabbitmq
            - elasticsearch

    client:
        image: node:8.9.4
        volumes_from:
            - php
        working_dir: /symfony
        user: 1000:1000
        command: "npm run dev"
        ports:
          - "${LIVERELOAD_PORT}:35729"
        environment:
          LIVERELOAD_PORT: ${LIVERELOAD_PORT}

    mysql:
        build: docker/mysql
        environment:
            MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
            MYSQL_DATABASE: ${MYSQL_DATABASE}
            MYSQL_USER: ${MYSQL_USER}
            MYSQL_PASSWORD: ${MYSQL_PASSWORD}
        volumes:
            - ${SYMFONY_APP_PATH}:/symfony
            - "mysql:/var/lib/mysql"
    rabbitmq:
        image: rabbitmq:3.4-management
        volumes:
          - "rabbitmq:/var/lib/rabbitmq"

        volumes:
          - "elasticsearch5:/usr/share/elasticsearch/data"
          - ${SYMFONY_APP_PATH}:/symfony
volumes:
    mysql: ~
    elasticsearch5: ~
    rabbitmq: ~

有什么区别between volumes_fromlinksdepends_on
如果想要将每个容器与另一个容器相连,我们为什么不仅使用linksvolumes_fromlinksdepends_on之间有什么区别?      

  • 为什么我的示例ngnix依赖/链接到php容器?为什么不相反?
  • 在文件页脚,有一个卷配置为volumes: mysql: ~ elasticsearch5: ~ rabbitmq: ~,但我认为我们已经定义为每个容器的容量,所以主要是什么?配置的原因是什么?

  • 为什么我们不使用只有一个使用php,ngnix和mysqld的web容器来分隔它们呢?
  • 1 个答案:

    答案 0 :(得分:1)

      

    volumes_from,links和depends_on之间有什么区别?

    linksdepends_on都为容器提供了相互通信的方式。

    links是一项遗留功能,将来会被弃用,因此请尽量避免使用links

    volumes_from用于其他目的,与linksdepends_on无关。

      

    为什么在我的例子中ngnix依赖/链接到php容器?为什么不相反?

    depends_on定义了服务启动的顺序。在您的示例中,您使用Nginx作为PHP服务的代理服务器。所以你可能希望PHP服务在Nginx之前启动。

      

    为什么我们不使用只有一个使用php,ngnix和mysqld的web容器来分隔它们呢?

    Docker的一个最佳实践是保持每个容器足够简单,只能完成一项工作。就像Unix的“做一件事,做得好”哲学一样。

    单一责任原则是一件好事,接受它。