Docker Составьте контейнеры Nginx Link - PullRequest
0 голосов
/ 04 мая 2018

У меня есть контейнер для создания докера, который запускает Nginx. Размещенный сайт - это просто домен .test, например example.test.

Также в контейнере Nginx запускает прокси-сервер местоположения и перенаправляет его на example.test:8000. Но он не может подключиться к этому, потому что он на самом деле размещается из другого контейнера в той же системе (все мостовые сети).

Как я могу разрешить контейнерам общаться с помощью example.test домена?

Или, если я не могу заставить их общаться через example.test, то как я могу связать их, чтобы они могли использовать свое имя службы составления докеров, такое как api или frontend?

Docker compose:

version: '3'

services:
    db:
        image: postgres
        ports:
         - "5432:5432"
    django:
        build: ./api
        command: ["./docker_up.sh"]
        restart: always
        volumes:
          - ./api:/app/api
          - api-static:/app/api/staticfiles
        ports:
          - "8000:8000"
        depends_on:
          - db
        environment:
          - MODE=DEV

volumes:
  frontend-build:
  api-static:
  certificates:

2-й составной файл (запускается вместе):

version: '3'

services:
    django:
        environment:
          - MODE=PROD
        #links:
        #  - hosting
    hosting:
        build: ./hosting
        restart: always
        network_mode: bridge
        volumes:
           - frontend-build:/var/www
        ports:
          - "80:80"
          - "443:443"
        environment:
          - MODE=PROD
        #links:
        #  - django

volumes:
    frontend-build:

С этими текущими настройками я получаю ошибку при запуске

ОШИБКА: для 92b89f848637_opensrd_hosting_1 Невозможно запустить хостинг службы: Невозможно создать ссылку на / opensrd_django_1, так как он не принадлежит сети по умолчанию

Редактировать: измененный docker-compose.prod.yml:

networks:
    app_net:
        driver: bridge
        ipam:
            driver: default
            config:
              -
                subnet: 172.16.238.0/24

services:
    django:
        environment:
          - MODE=PROD
        networks:
            app_net:
            ipv4_address: 172.16.238.10    

Но это дает мне ошибку.

ОШИБКА: файл Compose './docker-compose.prod.yml' недопустим, потому что:

network.app_net value Дополнительные свойства не разрешены ('config' была неожиданной)

networks.app_net.ipam содержит недопустимый тип, это должен быть объект

Ответы [ 3 ]

0 голосов
/ 04 мая 2018

Насколько я понимаю, вы просто хотите, чтобы они (django и nginx) были связаны между композитами?

Тогда нативное решение будет использовать external_links образец здесь И используйте это так:

services:
    [...]
    hosting:
        [...]
        external_links:
          - django_1:example
        [...]

Где django_1 обозначает имя контейнера, созданное вами созданным композитом, а example - псевдоним, который контейнер будет виден внутри контейнера Django.

В противном случае вы можете просто указать домен example.test на конкретный адрес, отредактировав ваш /etc/hosts (при условии, что вы работаете в linux / mac) например, добавив запись типа

172.16.238.10   example.test

Где указанный выше адрес будет указывать на ваше приложение django (контейнер).

Выше можно достичь, не изменяя /etc/hosts, используя собственное решение из compose (extra_hosts), задокументированное здесь

Кроме того, если вы предпочитаете статический ip-адрес для ваших контейнеров django / nginx, в случае, если вы придерживаетесь решения /etc/hosts od extra_hosts, вы можете использовать другое нативное решение, предоставленное compose, которое устанавливает статический ip для выбранных сервисов. Правильный пример здесь

Скорректированный список из связанной документации:

services:
  [...]
  django:
    [...]
    networks:
      app_net:
        ipv4_address: 172.16.238.10

networks:
  app_net:
    driver: bridge
    ipam:
      driver: default
      config:
      -
        subnet: 172.16.238.0/24
0 голосов
/ 05 мая 2018

Итак, я попробовал параметры, заданные @ trust512 и @DimaL, и они не сработали.

Однако после удаления сети и ссылок из моих файлов компоновки и удаления существующей сети и встроенных контейнеров по умолчанию это сработало, и я не могу сослаться между контейнерами, используя db, django и hosting.

Единственное, что изменилось, я изменил версию композитора с 3 на 3.5.

Это финальные файлы для всех, кто заинтересован:

version: '3.5'

services:
    db:
        image: postgres
        ports:
         - "5432:5432"
    django:
        build: ./api
        command: ["./docker_up.sh"]
        restart: always
        volumes:
          - ./api:/app/api
          - api-static:/app/api/staticfiles
        ports:
          - "8000:8000"
        depends_on:
          - db
        environment:
          - MODE=DEV

volumes:
  frontend-build:
  api-static:

докер-compose.prod.yml:

version: '3.5'

services:
    django:
        environment:
          - MODE=PROD
    hosting:
        build: ./hosting
        restart: always
        volumes:
           - frontend-build:/var/www
        ports:
          - "80:80"
          - "443:443"
        environment:
          - MODE=PROD

volumes:
    frontend-build:
0 голосов
/ 04 мая 2018

Вы можете использовать external_links (https://docs.docker.com/compose/compose-file/#external_links) или попытаться поместить все контейнеры в одну виртуальную сеть.

...