如何在docker-compose文件中用`depends_on`替换`links`?

时间:2018-04-28 14:54:11

标签: docker nginx docker-compose

docker compose documentation指定不推荐使用links,应将其替换为depends_on。我无法确切地知道如何。

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

  • 一个nginx反向代理
  • 一个nodejs app
  • 一个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

相关的nginx default.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 conf中的proxy_pass名称。

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

1 个答案:

答案 0 :(得分:5)

  

docker撰写文档指定不推荐links,应替换为depends_on

没有。文档只说,

  

links也以与depends_on相同的方式表达服务之间的依赖关系,因此它们决定了服务启动的顺序。

我看不出这是如何结束的,您应该使用depends_on代替links。相反,它说,如果你需要在另一个容器中运行容器,你应该使用depends_on,而不是links。 (例如,您command - 在php容器中指定正在运行的迁移,并且需要等待postgres容器。)

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

  

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

在此上下文中,--link cli的dockerlinks中的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;
}