bvn написав:Більш-менш вирішив свої проблеми, не знаю, чи цікавлять когось деталі, якщо коротко, то...
networks і ports не те щоб дуже зовсім не сумісні, якщо залишати пустою частину конфігурації. Тобто для окремої мережі ми маємо всі порти залишити пустими і після підстановки це буде виглядати як
А для варіанту з підміною портів на локалхості, навпаки, залишаєм пустою назву мережі і IP-адреси, тоді все працює так, як наче директиви networks в конфігу й не було. А після підстановки це виглядає так:
В конфігурації сервісу:
networks:
default:
ipv4_address:
а внизу в конфігурації мережі так:
PS: І так, всі сервіси на одній IP-адресі, наскільки я зміг з цим питанням розібратися, запустити неможливо... на жаль. Звісно, в локальці цей ресурс майже необмежений і наче й не проблема, хоча мені якось мій vagrant-стиль сподобався більше через це. Трохи я не розплямкав ще того docker'а )
Ви не зрозуміли, напевне, ідею мульсервісних застосунків, які запускаються на основі кнтейнерів. Плюс, коли ви кажете про ВМ-ку і що там всі сервіси висять на одному айпі, то в чому проблема зібрати образ контейнера, де всі вам необхідні сервіси будуть в одному контейнері. тоді і ці сервіси будуть на одному айпі.
Ідея мультисервісного підходу за допомогою контейнерів полягає в тому, що застосунок який використовує багато сервісів для роботи (web-server, database, nodejs, php-fpm, memcahced, redis, Nosql DB, reverse proxy, certbot etx) розбивається на окремі контенйнери і в кожному цьому контейнері запускається лише одна складова служба. І взаємодія між цим службами відбувається в межах однієї підмережі, до якої і конектяться ці контейнери. Тому тут і виходе, що використовуються багато айпі, для кожного конкретного контейнера. Можна і для роботи сервісів використати socker файли.
Доречі, коли ви всі ці сервіси стартуєте на віртуалці так само налаштовуєте взаємодію між нимим або через сокет-файли або через loopback інтерфейс+порт (а з контейнерами те саме, але використовується інша мережа, приватна 172... )
А тепер на рахунок директив запуску контейнерів :
ports: 8080:80 (або -р при запуску через docker run) слугує для того, щоб через службу docker-proxy прокинути порти з контейнера на хост-систему (за допомогою NAT між мережею docker 172.... і хост системою) і тоді ви конектячись на localhost:8080 отримуєте доступ до 80 порту відповідного контейнера. До налаштувань мережі самих контейнерів це немає відношення.
networks:
default:
name:
дана конструкція уже напряму працює з мережами які використовуватимуть контейнери, в даному випадку пишеться про те, що буде створена окрема мережа, з своєю назвою і своїми параметрами мережі, відмінними від дефолтних 172.17.0.1. Мережі в докерах є різні під різні завдання. Детальніше тут https://docs.docker.com/network/
В будь якому випадку, можете по аналогії сприймати контейнери як окремі ВМ-ки, які працюють в одній локальній мережі з багаться сервісами. Вихід назовні в них усіх одна точка, хост-система. Це дуже спрощено і можливо, навіть, не вірне судження.