Проблема
Бувають випадки коли маємо декілька проектів які описані в різних docker-compose файлах, які повинні комунікувати між собою та бути доступними через docker networks. Проте за замовчуванням всі контейнери ізольовані, тобто проєкт з одного docker-compose не буде доступний для іншого.
Для налаштування взаємодії нам допоможе bridging та external networks. Для взаємодії двох проектів які описані в окремих docker-compose файлах потрібно створити загальну мережу, яку вкажемо в обох файлах компоуз. Після чого сервіси зможуть взаємодіяти між собою.
Для прикладу використаємо два проекти:
- monitoring-compose.yaml – файл в якому описана графана та прометеус;
- prom-exporters.yaml – файл в якому описані експортери для прометеус;
Розв’язання проблеми
Для початку додамо в інсуючий проект external: true в networks (при першому запуску компоуз мережа буде створена автоматично), редагуємо перший файл monitoring-compose.yaml:
version: '3.9'
networks:
prometheus:
external: true
services:
grafana-ui:
image: grafana/grafana-oss:latest
container_name: grafana
hostname: grafana
networks:
- prometheus
user: root
ports:
- 3000:3000
restart: unless-stopped
user: '0'
volumes:
- /data/grafana:/etc/grafana
- /data/grafana/data:/var/lib/grafana
prometheus-server:
image: prom/prometheus:latest
container_name: prometheus
networks:
- prometheus
user: "root"
ports:
- "9090:9090"
volumes:
- /data/prometheus/prometheus-server.yaml:/etc/prometheus-server.yaml
- /data/prometheus/alert.rules:/etc/alert.rules
- /data/prometheus/data:/prometheus/data
command:
- '--config.file=/etc/prometheus-server.yaml'
restart: always
а тепер другий файл prom-exporters.yaml:
version: '3.9'
networks:
prometheus:
external: true
services:
node-exporter:
image: prom/node-exporter:latest
container_name: node-exporter
networks:
- prometheus
ports:
- "9100:9100"
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro,rslave
command:
# - '--path.rootfs=/rootfs'
- '--path.procfs=/host/proc'
- '--path.sysfs=/host/sys'
- --collector.filesystem.ignored-mount-points
- "^/(sys|proc|dev|host|etc|rootfs/var/lib/docker/containers|rootfs/var/lib/docker/overlay2|rootfs/run/docker/netns|rootfs/var/lib/docker/aufs)($$|/)"
restart: unless-stopped
mem_limit: 500m
mem_reservation: 100m
Запускаємо, провалюємось в контейнер з графаною, пробуємо перевірити доступність node-exporter, використавши ping:
# docker exec -it grafana sh
/usr/share/grafana # ping node-exporter
PING node-exporter (172.20.0.4): 56 data bytes
64 bytes from 172.20.0.4: seq=0 ttl=64 time=0.155 ms
64 bytes from 172.20.0.4: seq=1 ttl=64 time=0.257 ms
64 bytes from 172.20.0.4: seq=2 ttl=64 time=0.252 ms
64 bytes from 172.20.0.4: seq=3 ttl=64 time=0.190 ms
Посилання на тему
- https://docs.docker.com/compose/networking/
- https://stackoverflow.com/questions/38088279/communication-between-multiple-docker-compose-projects#:~:text=For%20using%20another%20docker%2Dcompose,of%20the%20root%20directory%20project)