Docker Container Linking
This chapter covers how Docker containers communicate with each other, including networking, container linking, and service discovery.
Communication Methods Overview
| Method | Description | Recommended |
|---|---|---|
| User-defined networks | Communication via Docker networks | ⭐⭐⭐ Recommended |
| --link parameter | Legacy linking method | ⚠️ Deprecated |
| Shared network namespace | Containers share the same network stack | Special cases |
| Host network | Container uses host network directly | Special cases |
User-Defined Networks (Recommended)
Create a Custom Network
bash
docker network create my-network
docker network ls
docker network inspect my-networkConnect Containers to a Network
bash
# Specify network at startup
docker run -d --name web --network my-network nginx
docker run -d --name db --network my-network -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0
# Connect existing container
docker network connect my-network existing-container
# Disconnect
docker network disconnect my-network existing-containerCommunicate by Container Name
Containers on the same custom network can reach each other by name:
bash
docker exec web ping dbDocker's built-in DNS server automatically resolves container names to IP addresses.
Example: Web App + Database
bash
docker network create app-network
docker run -d \
--name mysql-db \
--network app-network \
-e MYSQL_ROOT_PASSWORD=secret \
-e MYSQL_DATABASE=myapp \
mysql:8.0
docker run -d \
--name web-app \
--network app-network \
-p 8080:8080 \
-e DB_HOST=mysql-db \
-e DB_PORT=3306 \
my-web-app--link Method (Deprecated)
⚠️
--linkis deprecated. Use custom networks instead.
bash
# Old way (not recommended)
docker run -d --name db mysql:8.0
docker run -d --name web --link db:database nginxLimitations: one-directional only, no cross-host support, no dynamic service discovery.
Shared Network Namespace
Multiple containers can share the same network namespace:
bash
docker run -d --name pod-main nginx
docker run -d --name pod-sidecar --network container:pod-main busybox sleep 3600This is similar to the Kubernetes Pod network model.
Port Mapping
bash
docker run -d -p 8080:80 nginx # Specific port
docker run -d -p 127.0.0.1:8080:80 nginx # Specific IP
docker run -d -P nginx # Random port
docker port my-nginx # View mappingsAccessing Host Services from Containers
bash
# Use host.docker.internal (Docker 20.10+)
docker run -it --add-host=host.docker.internal:host-gateway alpine ping host.docker.internalNetwork Management Commands
bash
docker network create my-net
docker network ls
docker network inspect my-net
docker network connect my-net container-name
docker network disconnect my-net container-name
docker network rm my-net
docker network pruneChapter Summary
Container linking is fundamental to building multi-container applications. Use custom Docker networks for container communication — they provide automatic DNS resolution, network isolation, and flexible management.