Проблема
Бувають випадки коли маємо декілька проектів які описані в різних 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)