как заменить `links` на` disabled_on` в файле docker-compose? - PullRequest
0 голосов
/ 28 апреля 2018

Докер составляет документацию , которая указывает, что links устарела и должна быть заменена на depends_on. Я не могу понять, как именно.

Вот рабочий файл docker-compose (с links инструкциями) приложения, имеющего 3 службы:

  • обратный прокси 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

Соответствующий 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 создают псевдонимы из имен службы докера для proxy_pass имен в nginx conf.

Как можно заменить links инструкции в файле docker-compose на depends_on без изменения конфигурации nginx (и сохранения псевдонимов)?

1 Ответ

0 голосов
/ 28 апреля 2018

Документация о создании докера указывает, что links устарела и должна быть заменена на depends_on.

Это не так. Документы только говорят, что

links также выражают зависимость между службами так же, как и depends_on, поэтому они определяют порядок запуска службы.

Я не понимаю, как это закончится, что вы должны использовать depends_on вместо links. Вместо этого говорится, что если вам нужно запустить что-то в контейнере из другого контейнера, вы должны использовать depends_on, а не links. (Например, вы command указываете выполняющиеся миграции в контейнере php и вам необходимо дождаться контейнера postgres).

С другой стороны, links имеет предупреждение:

Если вам абсолютно не нужно продолжать его использование, мы рекомендуем использовать пользовательские сети для облегчения связи между двумя контейнерами вместо использования --link.

В этом контексте --link для docker cli - это то же самое, что links в 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;
}
...