Network¶
Stackvo, tüm container'ları tek bir Docker network üzerinde çalıştırır: stackvo-net. Bu sayfa, 172.30.0.0/16 subnet'ındaki bridge network'ün nasıl çalıştığını, container'lar arası hostname bazlı iletişimi, port mapping'ı, network izolasyonunu ve troubleshooting yöntemlerini detaylı olarak açıklamaktadır. Tüm servisler ve projeler aynı network üzerinde kolay iletişim kurar.
stackvo-net¶
Tip: Bridge
Subnet: 172.30.0.0/16
Gateway: 172.30.0.1
Network Tanımı¶
Network Mimarisi¶
stackvo-net (172.30.0.0/16)
├── 172.30.0.1 (Gateway)
│
├── Traefik (Reverse Proxy)
│ └── Ports: 80, 443, 8080
│
├── Infrastructure Services
│ ├── MySQL (stackvo-mysql:3306)
│ ├── MariaDB (stackvo-mariadb:3306)
│ ├── PostgreSQL (stackvo-postgres:5432)
│ ├── MongoDB (stackvo-mongo:27017)
│ ├── Redis (stackvo-redis:6379)
│ ├── Memcached (stackvo-memcached:11211)
│ ├── RabbitMQ (stackvo-rabbitmq:5672)
│ ├── Kafka (stackvo-kafka:9092)
│ ├── Elasticsearch (stackvo-elasticsearch:9200)
│ └── ... (diğer servisler)
│
├── Stackvo UI
│ ├── stackvo-ui (Web UI)
│ └── stackvo-tools (Management Tools)
│
└── User Projects
├── Project1
│ ├── stackvo-project1-php:9000
│ └── stackvo-project1-web:80
├── Project2
│ ├── stackvo-project2-php:9000
│ └── stackvo-project2-web:80
└── ...
Container İletişimi¶
Hostname Bazlı İletişim¶
Container'lar birbirlerini hostname ile bulabilir:
<?php
// PHP'den MySQL'e bağlantı
$host = 'stackvo-mysql'; // Container hostname
$port = 3306;
$pdo = new PDO("mysql:host=$host;port=$port;dbname=stackvo", 'stackvo', 'stackvo');
<?php
// PHP'den RabbitMQ'ya bağlantı
use PhpAmqpLib\Connection\AMQPStreamConnection;
$connection = new AMQPStreamConnection(
'stackvo-rabbitmq', // Hostname
5672, // Port
'admin', // User
'admin' // Password
);
Port Mapping¶
Container'lar arasında iletişim için internal port kullanılır:
| Servis | Container Hostname | Internal Port | Host Port |
|---|---|---|---|
| MySQL | stackvo-mysql | 3306 | 3306 |
| PostgreSQL | stackvo-postgres | 5432 | 5433 |
| MongoDB | stackvo-mongo | 27017 | 27017 |
| Redis | stackvo-redis | 6379 | 6379 |
| RabbitMQ | stackvo-rabbitmq | 5672 | 5672 |
| Kafka | stackvo-kafka | 9092 | 9094 |
Not: Container'lar arası iletişimde internal port kullanılır, host'tan erişimde host port kullanılır.
İletişim Akışı¶
External → Application¶
1. Browser/Client
↓ HTTPS (443)
2. Traefik (Reverse Proxy)
↓ HTTP (80)
3. Nginx/Apache/Caddy/Ferron (Webserver)
↓ FastCGI (9000)
4. PHP-FPM
Application → Services¶
PHP-FPM
├─→ MySQL (stackvo-mysql:3306)
├─→ PostgreSQL (stackvo-postgres:5432)
├─→ MongoDB (stackvo-mongo:27017)
├─→ Redis (stackvo-redis:6379)
├─→ Memcached (stackvo-memcached:11211)
├─→ RabbitMQ (stackvo-rabbitmq:5672)
├─→ Kafka (stackvo-kafka:9092)
└─→ Elasticsearch (stackvo-elasticsearch:9200)
Network İzolasyonu¶
Avantajlar¶
- Güvenlik: Container'lar izole ortamda çalışır
- Kolay Servis Keşfi: Hostname bazlı iletişim
- Port Çakışması Yok: Her container kendi portunu kullanır
- Basit Yönetim: Tek network, kolay troubleshooting
Dış Dünyaya Erişim¶
Container'lar internet erişimine sahiptir:
# Container içinden
docker exec -it stackvo-mysql ping google.com
docker exec -it stackvo-php curl https://api.example.com
Network Konfigürasyonu¶
Subnet Değiştirme¶
.env dosyasında subnet değiştirilebilir:
Not: Subnet değişikliği için network'ü yeniden oluşturmanız gerekir:
Custom Network¶
Özel network ayarları için core/compose/base.yml template'ini düzenleyin:
networks:
stackvo-net:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.30.0.0/16
gateway: 172.30.0.1
driver_opts:
com.docker.network.bridge.name: stackvo-br0
com.docker.network.bridge.enable_ip_masquerade: "true"
Network Troubleshooting¶
Container'lar Birbirini Görmüyor¶
# Network'ü kontrol et
docker network inspect stackvo-net
# Container'ın network'e bağlı olduğunu doğrula
docker inspect stackvo-mysql | grep -A 10 Networks
# Ping testi
docker exec stackvo-php ping stackvo-mysql
DNS Çözümleme Sorunu¶
# Container içinden DNS testi
docker exec stackvo-php nslookup stackvo-mysql
docker exec stackvo-php cat /etc/resolv.conf
Network Connectivity¶
# Container'dan servis erişimi testi
docker exec stackvo-php nc -zv stackvo-mysql 3306
docker exec stackvo-php nc -zv stackvo-redis 6379
Network Yeniden Oluşturma¶
# Tüm container'ları durdur
./stackvo.sh down
# Network'ü sil
docker network rm stackvo-net
# Yeniden oluştur
./stackvo.sh generate
./stackvo.sh up
Network Monitoring¶
Aktif Bağlantılar¶
# Network'teki tüm container'ları listele
docker network inspect stackvo-net --format '{{range .Containers}}{{.Name}} - {{.IPv4Address}}{{"\n"}}{{end}}'
Network İstatistikleri¶
# Container network istatistikleri
docker stats --no-stream --format "table {{.Container}}\t{{.NetIO}}"
Traffic Monitoring¶
# tcpdump ile network trafiği izleme
docker run --rm --net=container:stackvo-mysql nicolaka/netshoot tcpdump -i any port 3306
Best Practices¶
1. Hostname Kullanımı¶
❌ Yanlış:
✅ Doğru:
2. Internal Port Kullanımı¶
❌ Yanlış:
✅ Doğru:
3. Connection String¶
✅ Doğru: