Practical Networking and Storage Applications
This section demonstrates real-world Docker networking and storage scenarios, from microservices architectures to high-availability deployments and enterprise storage solutions.
Microservices Network Architecture
Complete E-Commerce Platform
# docker-compose.microservices.yml
version: '3.8'
services:
# API Gateway
api-gateway:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
- ./nginx/ssl:/etc/nginx/ssl:ro
networks:
- frontend
- monitoring
depends_on:
- user-service
- product-service
- order-service
# User Service
user-service:
build: ./services/user
networks:
- frontend
- backend
- user-db-net
volumes:
- user-logs:/app/logs
environment:
- DATABASE_URL=postgresql://user:pass@user-db:5432/users
- REDIS_URL=redis://redis-cluster:6379/0
depends_on:
- user-db
- redis-cluster
user-db:
image: postgres:13
networks:
- user-db-net
volumes:
- user-db-data:/var/lib/postgresql/data
- user-db-config:/etc/postgresql
environment:
- POSTGRES_DB=users
- POSTGRES_USER=user
- POSTGRES_PASSWORD=pass
# Product Service
product-service:
build: ./services/product
networks:
- frontend
- backend
- product-db-net
volumes:
- product-logs:/app/logs
- product-images:/app/images
environment:
- DATABASE_URL=postgresql://product:pass@product-db:5432/products
- ELASTICSEARCH_URL=http://elasticsearch:9200
depends_on:
- product-db
- elasticsearch
product-db:
image: postgres:13
networks:
- product-db-net
volumes:
- product-db-data:/var/lib/postgresql/data
environment:
- POSTGRES_DB=products
- POSTGRES_USER=product
- POSTGRES_PASSWORD=pass
# Order Service
order-service:
build: ./services/order
networks:
- frontend
- backend
- order-db-net
volumes:
- order-logs:/app/logs
environment:
- DATABASE_URL=postgresql://order:pass@order-db:5432/orders
- RABBITMQ_URL=amqp://guest:guest@rabbitmq:5672/
depends_on:
- order-db
- rabbitmq
order-db:
image: postgres:13
networks:
- order-db-net
volumes:
- order-db-data:/var/lib/postgresql/data
environment:
- POSTGRES_DB=orders
- POSTGRES_USER=order
- POSTGRES_PASSWORD=pass
# Shared Services
redis-cluster:
image: redis:7-alpine
networks:
- backend
volumes:
- redis-data:/data
command: |
redis-server
--cluster-enabled yes
--cluster-config-file nodes.conf
--cluster-node-timeout 5000
--appendonly yes
elasticsearch:
image: elasticsearch:7.17.0
networks:
- backend
volumes:
- elasticsearch-data:/usr/share/elasticsearch/data
environment:
- discovery.type=single-node
- "ES_JAVA_OPTS=-Xms1g -Xmx1g"
rabbitmq:
image: rabbitmq:3-management
networks:
- backend
volumes:
- rabbitmq-data:/var/lib/rabbitmq
environment:
- RABBITMQ_DEFAULT_USER=guest
- RABBITMQ_DEFAULT_PASS=guest
# Monitoring
prometheus:
image: prom/prometheus
networks:
- monitoring
volumes:
- prometheus-data:/prometheus
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro
networks:
frontend:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/24
backend:
driver: bridge
internal: true
ipam:
config:
- subnet: 172.21.0.0/24
user-db-net:
driver: bridge
internal: true
product-db-net:
driver: bridge
internal: true
order-db-net:
driver: bridge
internal: true
monitoring:
driver: bridge
volumes:
user-db-data:
product-db-data:
order-db-data:
user-db-config:
redis-data:
elasticsearch-data:
rabbitmq-data:
prometheus-data:
user-logs:
product-logs:
order-logs:
product-images:
High-Availability Storage Setup
Database Cluster with Replication
# docker-compose.ha-database.yml
version: '3.8'
services:
# PostgreSQL Master
postgres-master:
image: postgres:13
networks:
- db-cluster
volumes:
- postgres-master-data:/var/lib/postgresql/data
- postgres-master-config:/etc/postgresql
- ./postgres/master.conf:/etc/postgresql/postgresql.conf:ro
- ./postgres/pg_hba.conf:/etc/postgresql/pg_hba.conf:ro
environment:
- POSTGRES_DB=myapp
- POSTGRES_USER=app
- POSTGRES_PASSWORD=password
- POSTGRES_REPLICATION_MODE=master
- POSTGRES_REPLICATION_USER=replicator
- POSTGRES_REPLICATION_PASSWORD=repl_password
command: |
postgres
-c config_file=/etc/postgresql/postgresql.conf
-c hba_file=/etc/postgresql/pg_hba.conf
# PostgreSQL Slave 1
postgres-slave1:
image: postgres:13
networks:
- db-cluster
volumes:
- postgres-slave1-data:/var/lib/postgresql/data
environment:
- POSTGRES_REPLICATION_MODE=slave
- POSTGRES_MASTER_HOST=postgres-master
- POSTGRES_REPLICATION_USER=replicator
- POSTGRES_REPLICATION_PASSWORD=repl_password
depends_on:
- postgres-master
# PostgreSQL Slave 2
postgres-slave2:
image: postgres:13
networks:
- db-cluster
volumes:
- postgres-slave2-data:/var/lib/postgresql/data
environment:
- POSTGRES_REPLICATION_MODE=slave
- POSTGRES_MASTER_HOST=postgres-master
- POSTGRES_REPLICATION_USER=replicator
- POSTGRES_REPLICATION_PASSWORD=repl_password
depends_on:
- postgres-master
# PgBouncer Connection Pooler
pgbouncer:
image: pgbouncer/pgbouncer
networks:
- db-cluster
- app-network
volumes:
- ./pgbouncer/pgbouncer.ini:/etc/pgbouncer/pgbouncer.ini:ro
- ./pgbouncer/userlist.txt:/etc/pgbouncer/userlist.txt:ro
environment:
- DATABASES_HOST=postgres-master
- DATABASES_PORT=5432
- DATABASES_USER=app
- DATABASES_PASSWORD=password
- DATABASES_DBNAME=myapp
depends_on:
- postgres-master
# HAProxy for Load Balancing
haproxy:
image: haproxy:2.6
networks:
- db-cluster
- app-network
volumes:
- ./haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
ports:
- "5432:5432" # PostgreSQL
- "8404:8404" # Stats
depends_on:
- postgres-master
- postgres-slave1
- postgres-slave2
networks:
db-cluster:
driver: bridge
internal: true
app-network:
driver: bridge
volumes:
postgres-master-data:
driver: local
driver_opts:
type: ext4
o: noatime
postgres-slave1-data:
driver: local
postgres-slave2-data:
driver: local
postgres-master-config:
driver: local
Distributed Storage Solutions
GlusterFS Distributed Storage
# docker-compose.glusterfs.yml
version: '3.8'
services:
# GlusterFS Node 1
gluster1:
image: gluster/gluster-centos
privileged: true
networks:
storage-network:
ipv4_address: 172.25.0.10
volumes:
- gluster1-data:/data
- /sys/fs/cgroup:/sys/fs/cgroup:ro
hostname: gluster1
# GlusterFS Node 2
gluster2:
image: gluster/gluster-centos
privileged: true
networks:
storage-network:
ipv4_address: 172.25.0.11
volumes:
- gluster2-data:/data
- /sys/fs/cgroup:/sys/fs/cgroup:ro
hostname: gluster2
# GlusterFS Node 3
gluster3:
image: gluster/gluster-centos
privileged: true
networks:
storage-network:
ipv4_address: 172.25.0.12
volumes:
- gluster3-data:/data
- /sys/fs/cgroup:/sys/fs/cgroup:ro
hostname: gluster3
# Application using GlusterFS
app:
image: myapp
networks:
- storage-network
- app-network
volumes:
- type: volume
source: distributed-storage
target: /app/data
volume:
driver: local
driver_opts:
type: glusterfs
o: "addr=172.25.0.10:172.25.0.11:172.25.0.12"
device: "gv0"
depends_on:
- gluster1
- gluster2
- gluster3
networks:
storage-network:
driver: bridge
ipam:
config:
- subnet: 172.25.0.0/24
app-network:
driver: bridge
volumes:
gluster1-data:
gluster2-data:
gluster3-data:
distributed-storage:
external: true
Ceph Storage Cluster
# docker-compose.ceph.yml
version: '3.8'
services:
# Ceph Monitor
ceph-mon:
image: ceph/ceph:latest
networks:
- ceph-network
volumes:
- ceph-mon-data:/var/lib/ceph/mon
- ceph-config:/etc/ceph
environment:
- MON_IP=172.26.0.10
- CEPH_PUBLIC_NETWORK=172.26.0.0/24
command: mon
# Ceph OSD 1
ceph-osd1:
image: ceph/ceph:latest
privileged: true
networks:
- ceph-network
volumes:
- ceph-osd1-data:/var/lib/ceph/osd
- ceph-config:/etc/ceph
environment:
- OSD_DEVICE=/dev/loop0
- OSD_TYPE=directory
depends_on:
- ceph-mon
command: osd
# Ceph OSD 2
ceph-osd2:
image: ceph/ceph:latest
privileged: true
networks:
- ceph-network
volumes:
- ceph-osd2-data:/var/lib/ceph/osd
- ceph-config:/etc/ceph
environment:
- OSD_DEVICE=/dev/loop1
- OSD_TYPE=directory
depends_on:
- ceph-mon
command: osd
# Ceph MDS (Metadata Server)
ceph-mds:
image: ceph/ceph:latest
networks:
- ceph-network
volumes:
- ceph-mds-data:/var/lib/ceph/mds
- ceph-config:/etc/ceph
depends_on:
- ceph-mon
command: mds
networks:
ceph-network:
driver: bridge
ipam:
config:
- subnet: 172.26.0.0/24
volumes:
ceph-mon-data:
ceph-osd1-data:
ceph-osd2-data:
ceph-mds-data:
ceph-config:
Network Security Implementations
Zero-Trust Network Architecture
# docker-compose.zero-trust.yml
version: '3.8'
services:
# Istio Proxy (Envoy)
istio-proxy:
image: istio/proxyv2:latest
networks:
- service-mesh
volumes:
- ./istio/envoy.yaml:/etc/envoy/envoy.yaml:ro
- istio-certs:/etc/ssl/certs
command: |
/usr/local/bin/envoy
-c /etc/envoy/envoy.yaml
--service-cluster proxy
# Application with mTLS
secure-app:
build: ./secure-app
networks:
- service-mesh
volumes:
- app-certs:/app/certs:ro
environment:
- TLS_CERT_FILE=/app/certs/app.crt
- TLS_KEY_FILE=/app/certs/app.key
- CA_CERT_FILE=/app/certs/ca.crt
# Certificate Authority
cert-manager:
image: jetstack/cert-manager-controller:latest
networks:
- service-mesh
volumes:
- ca-data:/var/lib/cert-manager
- ./cert-manager/config.yaml:/etc/cert-manager/config.yaml:ro
# Network Policy Controller
network-policy:
image: calico/kube-controllers:latest
networks:
- service-mesh
volumes:
- ./network-policies:/etc/calico/policies:ro
environment:
- ENABLED_CONTROLLERS=policy
networks:
service-mesh:
driver: bridge
driver_opts:
com.docker.network.bridge.enable_icc: "false"
ipam:
config:
- subnet: 172.27.0.0/24
volumes:
istio-certs:
app-certs:
ca-data:
Performance Optimization Examples
High-Performance Web Stack
# docker-compose.performance.yml
version: '3.8'
services:
# Nginx with optimized configuration
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
networks:
- frontend
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
- nginx-cache:/var/cache/nginx
- type: tmpfs
target: /tmp
tmpfs:
size: 512M
sysctls:
- net.core.somaxconn=65535
- net.ipv4.tcp_max_syn_backlog=65535
ulimits:
nofile:
soft: 65535
hard: 65535
# Application with performance tuning
app:
build: ./app
networks:
- frontend
- backend
volumes:
- app-data:/app/data
- type: tmpfs
target: /app/tmp
tmpfs:
size: 1G
environment:
- NODE_ENV=production
- UV_THREADPOOL_SIZE=128
sysctls:
- net.core.rmem_max=134217728
- net.core.wmem_max=134217728
deploy:
resources:
limits:
cpus: '2.0'
memory: 4G
reservations:
cpus: '1.0'
memory: 2G
# Redis with performance optimization
redis:
image: redis:7-alpine
networks:
- backend
volumes:
- redis-data:/data
command: |
redis-server
--maxmemory 2gb
--maxmemory-policy allkeys-lru
--tcp-backlog 511
--tcp-keepalive 300
--save 900 1
--save 300 10
--save 60 10000
sysctls:
- net.core.somaxconn=65535
# PostgreSQL with performance tuning
postgres:
image: postgres:13
networks:
- backend
volumes:
- postgres-data:/var/lib/postgresql/data
- postgres-wal:/var/lib/postgresql/wal
- type: tmpfs
target: /tmp
tmpfs:
size: 2G
environment:
- POSTGRES_INITDB_WALDIR=/var/lib/postgresql/wal
command: |
postgres
-c shared_buffers=1GB
-c effective_cache_size=3GB
-c maintenance_work_mem=256MB
-c checkpoint_completion_target=0.9
-c wal_buffers=16MB
-c default_statistics_target=100
-c random_page_cost=1.1
-c effective_io_concurrency=200
-c work_mem=4MB
-c min_wal_size=1GB
-c max_wal_size=4GB
networks:
frontend:
driver: bridge
backend:
driver: bridge
internal: true
volumes:
nginx-cache:
app-data:
redis-data:
postgres-data:
driver: local
driver_opts:
type: ext4
o: noatime,nodiratime
postgres-wal:
driver: local
driver_opts:
type: ext4
o: noatime,nodiratime,sync
Summary
This section demonstrated practical networking and storage applications:
Microservices Architecture
- Service Isolation: Network segmentation for different service tiers
- Database Separation: Isolated networks for each service’s database
- Shared Services: Common infrastructure like Redis and message queues
High Availability
- Database Clustering: Master-slave replication with connection pooling
- Load Balancing: HAProxy for database and application load distribution
- Distributed Storage: GlusterFS and Ceph for scalable storage solutions
Security Implementation
- Zero-Trust Networks: mTLS and certificate management
- Network Policies: Traffic control and access restrictions
- Encryption: TLS termination and secure communications
Performance Optimization
- Resource Tuning: Kernel parameters and system limits
- Storage Optimization: Separate volumes for different data types
- Caching Strategies: Multiple caching layers for improved performance
Next Steps: Part 4 covers advanced techniques including custom network plugins, storage drivers, and enterprise-grade networking solutions.