【问题标题】:how to replace `links` with `depends_on` in a docker-compose file?如何在 docker-compose 文件中用 `depends_on` 替换 `links`?
【发布时间】:2018-04-28 14:54:11
【问题描述】:

docker compose documentation 指定 links 已弃用,应替换为 depends_on。我不知道具体是怎么做的。

这是具有 3 个服务的应用程序的工作 docker-compose 文件(带有 links 指令):

  • 一个 nginx 反向代理
  • 一个 nodejs 应用程序
  • 一个php api

version: "3.1"

services:

  nginx:
    image: nginx:alpine
    ports:
      - "8000:80"
    volumes:
      - ./php/content:/srv/www/content
      - ./static:/srv/www/static
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
    links:
      - php:php-app
      - nodejs:nodejs-app

  nodejs:
    image: node:alpine
    environment: 
      NODE_ENV: production
    working_dir: /home/app
    restart: always
    volumes:
      - ./nodejs:/home/app
    links:
      - php:php-app
    command: ["node", "index"]

  php:
    image: php:apache
    volumes:
      - ./php:/var/www/html

相关nginxdefault.conf

server {
  listen 80;
  root /srv/www;
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header X-Forwarded-Proto $scheme;

  location / {
    try_files $uri @nodejs;  
  }

  location /api {
    rewrite ^([^.\?]*[^/])$ $1/ break;
    proxy_pass http://php-app:80;
  }

  location @nodejs {
    proxy_pass http://nodejs-app:8080;
  }
}

links 指令将 docker 服务名称的别名设置为 nginx 配置中的 proxy_pass 名称。

如何在不修改 nginx 配置(并保留别名)的情况下用 depends_on 替换 docker-compose 文件中的 links 指令?

【问题讨论】:

    标签: docker nginx docker-compose


    【解决方案1】:

    docker compose 文档指定 links 已弃用,应替换为 depends_on

    它没有。文档只说,

    links也和depends_on一样表达服务之间的依赖关系,所以它们决定了服务启动的顺序。

    我看不出这是如何得出结论的,您应该使用depends_on 而不是links。相反,它说,如果您需要在另一个容器中运行某个容器中的某些内容,您应该使用depends_on,而不是links。 (比如你command-指定在php容器中运行迁移,需要等待postgres容器)。

    另一方面,links 有一个警告说

    除非您绝对需要继续使用它,否则我们建议您使用用户定义的网络来促进两个容器之间的通信,而不是使用--link

    在这种情况下,--link for docker cli 与 links in docker-compose.yml 相同。

    现在,重点是,如果您将容器放在一个网络上,则不需要任何进一步的特殊规范。除非您另外指定,否则默认网络驱动程序为 bridge。因此,如果您按以下方式指定 docker-compose.yml,您应该将所有容器都放在一个网络上并自动相互感知。

    version: "3.1"
    
    services:
      nginx:
        image: nginx:alpine
        ports:
          - "8000:80"
        volumes:
          - ./php/content:/srv/www/content
          - ./static:/srv/www/static
          - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
      nodejs:
        image: node:alpine
        environment: 
          NODE_ENV: production
        working_dir: /home/app
        restart: always
        volumes:
          - ./nodejs:/home/app
        command: ["node", "index"]
      php:
        image: php:apache
        volumes:
          - ./php:/var/www/html
    

    在这种情况下,nginx 应该可以使用

    location / {
        try_files $uri nodejs;
    }
    

    location /api {
        rewrite ^([^.\?]*[^/])$ $1/ break;
        proxy_pass http://php:80;
    }
    

    【讨论】:

    • 感谢您的详细解答。那么有没有办法为服务创建别名?
    • 我不明白为什么您需要服务别名。您放入 docker-compose.yml 的服务名称用作别名。您可以在每个单独的容器中的/etc/hosts 中找到它们。在最坏的情况下,你可以选择container_name
    • @AlexKarshin 当使用不同的图像来期望服务具有不同的名称(即mysql vs db)时,您可能需要别名
    猜你喜欢
    • 2018-04-04
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多