Docker Networks
Chapter objectivesβ
- Understand the Docker network types
- Create and configure networks
- Connect containers to each other
- Isolate applications
1 - Introduction to Docker networksβ
Why Docker networks?β
Docker networks enable:
- Communication between containers
- Application isolation
- Automatic DNS resolution
- Network traffic control
The default networksβ
# Lister les rΓ©seaux
docker network ls
# RΓ©sultat
NETWORK ID NAME DRIVER SCOPE
abc123... bridge bridge local
def456... host host local
ghi789... none null local
2 - Network types (drivers)β
Bridge (default)β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β HΓ΄te β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β docker0 (bridge) β β
β β 172.17.0.1 β β
β ββββββββββ¬ββββββββββββββββββ¬ββββββββββββββββββ¬βββββββββ β
β β β β β
β βββββββΌββββββ βββββββΌββββββ βββββββΌββββββ β
β β Container β β Container β β Container β β
β β 172.17.0.2β β 172.17.0.3β β 172.17.0.4β β
β βββββββββββββ βββββββββββββ βββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
- Isolated network on the host
- Containers can communicate with each other
- NAT to access the outside
Hostβ
# Le conteneur utilise directement le rΓ©seau de l'hΓ΄te
docker run --network host nginx
# Pas d'isolation rΓ©seau
# Port 80 du conteneur = Port 80 de l'hΓ΄te
Noneβ
# Aucune interface rΓ©seau
docker run --network none alpine ip addr
# Uniquement loopback (127.0.0.1)
Overlay (Swarm)β
- Communication between multiple Docker hosts
- Used with Docker Swarm
- Encryption available
Macvlanβ
# Chaque conteneur a sa propre adresse MAC
docker network create -d macvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
-o parent=eth0 \
mon-macvlan
Comparisonβ
| Driver | Isolation | Multi-host | Usage |
|---|---|---|---|
| bridge | Yes | No | Development, simple production |
| host | No | No | Maximum performance |
| none | Total | No | Maximum security |
| overlay | Yes | Yes | Swarm, clusters |
| macvlan | Yes | No | Integration with existing network |
3 - Network managementβ
Create a networkβ
# RΓ©seau bridge simple
docker network create mon-reseau
# Avec configuration personnalisΓ©e
docker network create \
--driver bridge \
--subnet 172.20.0.0/16 \
--ip-range 172.20.240.0/20 \
--gateway 172.20.0.1 \
mon-reseau-custom
# Réseau interne (sans accès externe)
docker network create --internal mon-reseau-interne
List and inspectβ
# Lister les rΓ©seaux
docker network ls
# Filtrer
docker network ls --filter driver=bridge
# Inspecter un rΓ©seau
docker network inspect mon-reseau
# Voir les conteneurs connectΓ©s
docker network inspect mon-reseau --format '{{range .Containers}}{{.Name}} {{end}}'
Delete networksβ
# Supprimer un rΓ©seau
docker network rm mon-reseau
# Supprimer les rΓ©seaux non utilisΓ©s
docker network prune
# Forcer
docker network prune -f
4 - Connect containersβ
At startupβ
# Connecter Γ un rΓ©seau spΓ©cifique
docker run -d --name web --network mon-reseau nginx
# Avec une IP fixe
docker run -d --name db \
--network mon-reseau \
--ip 172.20.0.10 \
postgres:15
After startupβ
# Connecter un conteneur existant
docker network connect mon-reseau mon-conteneur
# Avec une IP spΓ©cifique
docker network connect --ip 172.20.0.20 mon-reseau mon-conteneur
# DΓ©connecter
docker network disconnect mon-reseau mon-conteneur
Container on multiple networksβ
# CrΓ©er deux rΓ©seaux
docker network create frontend
docker network create backend
# Connecter un conteneur aux deux rΓ©seaux
docker run -d --name api --network frontend mon-api
docker network connect backend api
# L'API peut communiquer avec frontend ET backend
5 - DNS resolutionβ
Automatic DNS in custom networksβ
# CrΓ©er un rΓ©seau
docker network create mon-app
# Lancer des conteneurs
docker run -d --name db --network mon-app postgres:15
docker run -d --name web --network mon-app nginx
# Les conteneurs peuvent se rΓ©soudre par leur nom
docker exec web ping db
# PING db (172.20.0.2): 56 data bytes
Network aliasesβ
# CrΓ©er un alias
docker run -d \
--name postgres-primary \
--network mon-app \
--network-alias db \
--network-alias database \
postgres:15
# Les deux alias fonctionnent
docker exec web ping db
docker exec web ping database
DNS Round-Robinβ
# Plusieurs conteneurs avec le mΓͺme alias
docker run -d --name web1 --network mon-app --network-alias web nginx
docker run -d --name web2 --network mon-app --network-alias web nginx
docker run -d --name web3 --network mon-app --network-alias web nginx
# Le DNS retourne toutes les IPs (load balancing basique)
docker run --rm --network mon-app alpine nslookup web
6 - Communication between containersβ
Example: Web application + Databaseβ
# CrΓ©er le rΓ©seau
docker network create webapp
# Lancer la base de donnΓ©es
docker run -d \
--name db \
--network webapp \
-e POSTGRES_PASSWORD=secret \
-e POSTGRES_DB=myapp \
postgres:15
# Lancer l'application
docker run -d \
--name app \
--network webapp \
-e DATABASE_URL=postgres://postgres:secret@db:5432/myapp \
-p 3000:3000 \
mon-app
Example: Microservices architectureβ
# CrΓ©er les rΓ©seaux
docker network create frontend
docker network create backend
# Base de donnΓ©es (backend uniquement)
docker run -d \
--name postgres \
--network backend \
-e POSTGRES_PASSWORD=secret \
postgres:15
# API (frontend + backend)
docker run -d \
--name api \
--network backend \
-e DB_HOST=postgres \
mon-api
docker network connect frontend api
# Frontend (frontend uniquement)
docker run -d \
--name nginx \
--network frontend \
-p 80:80 \
nginx
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β βββββββββββββββββ frontend βββββββββββββββββ β
β β β β
β β βββββββββββββ βββββββββββββ β β
β β β nginx β βββββ β api β β β
β β β :80 β β β β β
β β βββββββββββββ βββββββ¬ββββββ β β
β β β β β
β βββββββββββββββββββββββββββββββΌβββββββββββββ β
β β β
β βββββββββββββββββ backend βββββΌβββββββββββββ β
β β β β β
β β βββββββΌββββββ β β
β β β postgres β β β
β β β :5432 β β β
β β βββββββββββββ β β
β β β β
β ββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
7 - Port publishingβ
Syntaxβ
# Format
-p [IP_HOTE:]PORT_HOTE:PORT_CONTENEUR[/PROTOCOLE]
# Exemples
-p 8080:80 # Toutes les interfaces
-p 127.0.0.1:8080:80 # Localhost uniquement
-p 80:80 -p 443:443 # Plusieurs ports
-p 8080:80/tcp # TCP explicite
-p 5000:5000/udp # UDP
Publish all exposed portsβ
# Publie tous les ports EXPOSE sur des ports alΓ©atoires
docker run -d -P nginx
# Voir les ports assignΓ©s
docker port mon-conteneur
# 80/tcp -> 0.0.0.0:32768
Verify the portsβ
# Ports d'un conteneur
docker port mon-conteneur
# Dans docker ps
docker ps --format "table {{.Names}}\t{{.Ports}}"
# Depuis l'extΓ©rieur
curl http://localhost:8080
8 - Network securityβ
Internal networksβ
# Créer un réseau sans accès externe
docker network create --internal secure-net
# Les conteneurs ne peuvent pas accΓ©der Γ Internet
docker run --network secure-net alpine ping google.com
# ping: bad address 'google.com'
Application isolationβ
# Application 1 sur son propre rΓ©seau
docker network create app1-net
docker run -d --name app1-db --network app1-net postgres:15
docker run -d --name app1-web --network app1-net -p 8001:80 nginx
# Application 2 sur son propre rΓ©seau
docker network create app2-net
docker run -d --name app2-db --network app2-net postgres:15
docker run -d --name app2-web --network app2-net -p 8002:80 nginx
# app1 ne peut PAS communiquer avec app2
Best practicesβ
# β
Utiliser des rΓ©seaux personnalisΓ©s (pas bridge par dΓ©faut)
docker network create mon-app
# β
Exposer uniquement les ports nΓ©cessaires
-p 127.0.0.1:3000:3000 # Localhost uniquement
# β
Utiliser des rΓ©seaux internes pour les BDD
docker network create --internal db-net
# β
SΓ©parer frontend et backend
docker network create frontend
docker network create --internal backend
9 - Network debuggingβ
Inspect connectivityβ
# Voir la configuration rΓ©seau d'un conteneur
docker inspect mon-conteneur --format '{{json .NetworkSettings.Networks}}'
# Tester la connectivitΓ©
docker exec mon-conteneur ping autre-conteneur
# Voir les connexions
docker exec mon-conteneur netstat -an
# RΓ©solution DNS
docker exec mon-conteneur nslookup service-name
Debug toolsβ
# Conteneur de debug avec outils rΓ©seau
docker run -it --network mon-reseau nicolaka/netshoot
# Dans le conteneur netshoot
ping db
nslookup web
curl http://api:3000
tcpdump -i eth0
Common problemsβ
| Problem | Probable cause | Solution |
|---|---|---|
| Container unreachable | Not on the same network | docker network connect |
| DNS does not resolve | Default bridge network | Use a custom network |
| Port unreachable | Not published | Add -p port:port |
| Connection refused | Service not started | Check the logs |
Summaryβ
| Command | Description |
|---|---|
docker network create | Create a network |
docker network ls | List the networks |
docker network inspect | Network details |
docker network connect | Connect a container |
docker network disconnect | Disconnect a container |
docker network rm | Delete a network |
docker network prune | Clean up networks |
| Driver | Usage |
|---|---|
| bridge | Isolated applications (default) |
| host | Performance, no isolation |
| none | Maximum security |
| overlay | Multi-host (Swarm) |
Key points
- Use custom networks for automatic DNS
- Isolate applications with separate networks
- Publish only the necessary ports
- Use internal networks for sensitive services
Hands-on exercisesβ
- Create a network and make two containers communicate by name
- Configure an architecture with isolated frontend/backend
- Test DNS resolution between containers
- Create an internal network and verify the absence of external access