IPC связь между контейнерами Docker
Возможно ли взаимодействие двух отдельных контейнеров Docker через сокет ZMQ IPC? Если да, то как этого достичь?
Например:
Docker Container # 1 выполняет приложение, которое создает сокет ZMQ Response и связывается с "ipc://tmp/service_name".
Docker Container # 2 выполняет приложение, которое создает сокет ZMQ-запроса и подключается к "ipc://tmp/service_name".
Следующие команды используются для запуска приложений в двух отдельных контейнерах Docker:
// Run container #1 (binds to "ipc://tmp/service_name")
docker run --name c1 -it container1
// Run container #2 (connects to "ipc://tmp/service_name")
docker run -it --link c1:container1 --name c2 container2
После запуска контейнеров я не могу установить соединение ZMQ (IPC). Однако я могу пропинговать контейнер 1 из контейнера 2 и пинговать контейнер 2 из контейнера 1.
Я также попытался использовать команду --ipc, но это не помогло:
// Run container #1 (binds to "ipc://tmp/service_name")
docker run --name c1 --ipc=host -it container1
// Run container #2 (connects to "ipc://tmp/service_name")
docker run -it --link c1:container1 --ipc=container:c1 --name c2 container2
ОБНОВЛЕНИЕ: я могу обмениваться данными между двумя отдельными контейнерами Docker с помощью сокета ZMQ TCP, но все еще не могу обмениваться данными с помощью сокета IPC. Является ли это возможным?
2 ответа
Вы видели Shared Memory с контейнерами Docker (версия Docker 1.4.1)? Похоже, вам нужно поделиться громкостью, где живет IPC, а также установить --ipc host
, В вашем примере это будет что-то вроде:
# Container #1
docker run -it --name c1 -v /tmp:/tmp --ipc=host container1
# Container #2
docker run -it --name c2 -v /tmp:/tmp --ipc=host container2
У меня есть 3 контейнера, 2 контейнера обмениваются данными с другим контейнером, что сработало для меня:
# container 1
docker run -it --ipc=shareable -v ///tmp --network=host --name node container1
# container 2
docker run -it --ipc=container:node --volumes-from node --network=host --name mdns container2
# container 3
docker run -it --ipc=container:node --volumes-from node --network=host --name connection container3
container1
может получить
pid
процессов, запущенных в
container2
а также
container3
и, следовательно, получить данные из контейнеров.