LINUX.ORG.RU
решено ФорумAdmin

Связь между контейнерами

 


0

1

Всем привет
Не очень понимаю как можно объединить два контейнера если параметры подключения задаются не на фазе build. Пример:
Контейнер с ldap и контейнер с jenkins.
Я собрал и запустил контейнеры, уже после запуска зашел в web интерфейс jenkins и сконфигурировал права доступа, так же там необходимо было прописать url подключения к ldap и вот вопрос какой url прописывать, он же при перезапуске ldap контейнера будет другим.
Единственный способ который я вижу это конфигурировать на фазе build'a но такое возможно не со всеми программами.
Как правильно связывать контейнеры в таком случаи?


Ответ на: комментарий от no-dashi

Может я что то не так делал.
Но 127.0.0.1 доступен с хоста (локальная машина), а между контейнерами 127.0.0.1 не расшаривается

n4ela
() автор топика

Если контейнер приходится конфигурировать _изнутри_, то скорее всего ошибка где-то в концепции. И вопрос стоит не нужно ли вместо Docker использовать LXC. Это больше его задача, использовать контейнеры как полноценные виртуальные машины.

Связывать контейнеры нужно через --link и --volume. Через --link получаем внутри одних контейнеров адреса и порты других. Через --volume монтируем внутрь контейнера конфиги из хоста.

Очень удобен тут docker-compose, внутри одного YAML-файла описываем все нужные связи. Скажем, пример простого связывания php и nginx-контейнеров:

nginx:
    image: nginx
    ports:
        - "0.0.0.0:80:80"
    volumes:
        - ./nginx:/etc/nginx
        - ./www:/usr/share/nginx/html
    links:
        - php:php1833

php:
    image: php:fpm
    volumes:
        - ./php-etc:/usr/local/etc
        - ./www:/var/www/html
    ports:
        - 9000

php-fpm изнутри вообще не конфигурируется в отношении Docker, просто используются нужные каталоги и настройки и выставляется на своём IP для запросов 9000-й порт.

nginx'у нужно знать, по какому IP дёргать PHP. docker-compose обеспечит это, передав под именем php1833 (конечно, оно может быть любым) адрес контейнера с PHP, т.е. в монтируемом nginx.conf нужно только записать:

    location ~ \.php$ {
        root           html;
        fastcgi_pass   php1833:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/html$fastcgi_script_name;
        include        fastcgi_params;
    }

Как видно, сами контейнеры не только не меняются, они вообще берутся готовые из docker registry, не собираются вручную.

KRoN73 ★★★★★
()
Последнее исправление: KRoN73 (всего исправлений: 1)
Ответ на: комментарий от KRoN73

Я для подобной задачи использовал именно compose.

dvrts ★★★
()
Ответ на: комментарий от KRoN73

Кажись то что нужно. Сегодня попробую сделать. Спасибо.

n4ela
() автор топика
Ответ на: комментарий от KRoN73

Кстати а зачем нужен volumes, везде пишут что бы сохранять состояние каталога контейнера. Но я не очень понимаю для чего это. Например у меня есть контейнер с postgresql и без указания volumes, я его(контейнер) запустил, потом создал таблички, остановил контейнер, потом запустил - таблички на месте.

n4ela
() автор топика
Ответ на: комментарий от n4ela

запустил - таблички на месте

ребутни машину и табличкам хана

volumes нужны для обхода ограничения в 250 комитов (на вскидку), ды и просто очень удобно

novoxudonoser
()
Ответ на: комментарий от n4ela

Кстати а зачем нужен volumes

- Чтобы удобно конфигурить прямо из рабочего каталога (монтируешь конфиги в контейнер, а правишь их прямо в хостовой ФС)
- Чтобы не тратиться на оверхед aufs
- Чтобы не тратиться на оверхед контейнера
- Чтобы не грохнуть по ошибке данные вместе с контейнером
- ..

:)

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

А это правильно что если в докер файле прописать

VOLUME ["/var/lib/postgresql", "/etc/postgresql", "/var/log/postgresql"]
А в docker-compose.yml
volumes:
     - ./test:/var/log/postgresql
То в папке с логами будет пусто, как на хосте так и внутри контейнера
При этом эта папка шарится и если там что то создать изменения появляются и на хосте и на контейнере.
Но при этом лог который создается при запуске postgresql в этой папке, не отображается
При этом если удалить этим строчки из yml то файл создается в контейнере.
Я находил баги на эту тему https://github.com/docker/compose/issues/723
Но они достаточно старые, и не очень понятно баг это или фича.

n4ela
() автор топика
Ответ на: комментарий от n4ela

То в папке с логами будет пусто

Надо смотреть, что с настройками логов в самом контейнере. Для Docker хороший тон гнать логи в выхлоп контейнера, чтобы ими можно было рулить снаружи. Запусти без всяких переназначений, а потом смотри, куда контейнер будет (и будет ли) складывать внутри себя логи. Если не будет, то или идёт в docker logs, или отключено. Если будет где-то — вот эти каталоги уже и можно монтировать в хост.

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

А такая ситуация не только с логами. Любой каталог который я прописываются в volume после запуска становится пустым, но при этом расшариным в хост систему

n4ela
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.