Docker Networks 🌐

āφāϗ⧇ āĻŦā§‹āĻā§‹ - Problem āϟāĻž āϕ⧀?

āϤ⧁āĻŽāĻŋ āϝāĻĻāĻŋ āĻĻ⧁āχāϟāĻž container āϚāĻžāϞāĻžāĻ“:

Container 1: Node.js App (port 3000)
Container 2: MongoDB (port 27017)
[Node App Container]     [MongoDB Container]
      🔒                       🔒
   āĻ•āĻĨāĻž āĻŦāϞāϤ⧇ āĻĒāĻžāϰāϛ⧇ āύāĻž ❌

Real Life Analogy

Network āĻ›āĻžāĻĄāĻŧāĻž:
āϤ⧁āĻŽāĻŋ āφāϰ āϤ⧋āĻŽāĻžāϰ āĻŦāĻ¨ā§āϧ⧁ āĻĻ⧁āχāϟāĻž āφāϞāĻžāĻĻāĻž āĻŦāĻžāĻĄāĻŧāĻŋāϤ⧇ āĻŦāĻ¨ā§āĻĻā§€
āϕ⧋āύ⧋ āϰāĻžāĻ¸ā§āϤāĻž āύ⧇āχ → āĻ•āĻĨāĻž āĻšāĻŦ⧇ āύāĻž

Network āĻĻāĻŋāϞ⧇:
āĻĻ⧁āχāϟāĻž āĻŦāĻžāĻĄāĻŧāĻŋāϰ āĻŽāĻžāĻā§‡ āϰāĻžāĻ¸ā§āϤāĻž āϤ⧈āϰāĻŋ āĻšāϞ⧋
āĻāĻ–āύ āϝ⧋āĻ—āĻžāϝ⧋āĻ— āϏāĻŽā§āĻ­āĻŦ ✅

Docker āĻ āĻ•āϤāϗ⧁āϞ⧋ Network Type āφāϛ⧇?

1. bridge    → Default, most common (āφāϜāϕ⧇ āĻāϟāĻžāχ āĻļāĻŋāĻ–āĻŦā§‹)
2. host      → Container host āĻāϰ network directly use āĻ•āϰ⧇
3. none      → āϕ⧋āύ⧋ network āύ⧇āχ, āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ isolated
4. overlay   → Multiple machines āĻāϰ āĻŽāĻ§ā§āϝ⧇ (Swarm/K8s āĻ āϞāĻžāϗ⧇)

Bridge Network āϕ⧀āĻ­āĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇?

[Docker Host Machine]
┌─────────────────────────────────────┐
│                                     │
│   [bridge network: mynet]           │
│   ┌─────────┐     ┌─────────┐      │
│   │  app    │────â–ļ│   db    │      │
│   │container│     │container│      │
│   └─────────┘     └─────────┘      │
│                                     │
└─────────────────────────────────────┘

Same network āĻ āĻĨāĻžāĻ•āϞ⧇:

Default Bridge vs Custom Bridge

Docker āĻ āĻāĻ•āϟāĻž default bridge network āφāϛ⧇, āĻ•āĻŋāĻ¨ā§āϤ⧁ āϏ⧇āϟāĻž use āĻ•āϰāĻž āωāϚāĻŋāϤ āύāĻžāĨ¤

Default Bridge āϏāĻŽāĻ¸ā§āϝāĻž:
❌ Container āύāĻžāĻŽ āĻĻāĻŋāϝāĻŧ⧇ āĻšā§‡āύāĻž āϝāĻžāϝāĻŧ āύāĻž
❌ IP āĻĻāĻŋāϝāĻŧ⧇ communicate āĻ•āϰāϤ⧇ āĻšāϝāĻŧ
❌ IP change āĻšāϞ⧇ āϏāĻŦ āĻ­āĻžāϙ⧇

Custom Bridge:
✅ Container āύāĻžāĻŽ āĻĻāĻŋāϝāĻŧ⧇ āĻšā§‡āύāĻž āϝāĻžāϝāĻŧ (DNS automatic)
✅ Isolated — āĻļ⧁āϧ⧁ same network āĻāϰ containers āĻ•āĻĨāĻž āĻŦāϞāϤ⧇ āĻĒāĻžāϰ⧇
✅ Production ready

Step by Step Practice

Step 1: Default Network āĻĻ⧇āĻ–ā§‹

# Docker āĻ āϕ⧀ āϕ⧀ network āφāϛ⧇ āĻĻ⧇āĻ–ā§‹
docker network ls

Output:

NETWORK ID     NAME      DRIVER    SCOPE
abc123         bridge    bridge    local
def456         host      host      local
ghi789         none      null      local

Step 2: Default Bridge āĻāϰ āϏāĻŽāĻ¸ā§āϝāĻž Prove āĻ•āϰ⧋

# āĻĻ⧁āχāϟāĻž container āϚāĻžāϞāĻžāĻ“, āϕ⧋āύ⧋ network specify āĻ•āϰ⧋āύāĻŋ
docker run -d --name container1 alpine sleep 3600
docker run -d --name container2 alpine sleep 3600
# container1 āĻāϰ āϭ⧇āϤāϰ⧇ āϝāĻžāĻ“
docker exec -it container1 sh
# container2 āϕ⧇ āύāĻžāĻŽ āĻĻāĻŋāϝāĻŧ⧇ ping āĻ•āϰ⧋
ping container2
# Output: ping: bad address 'container2' ❌
# āύāĻžāĻŽ āĻĻāĻŋāϝāĻŧ⧇ āϚāĻŋāύāϤ⧇ āĻĒāĻžāϰāϛ⧇ āύāĻž!

exit
# cleanup
docker rm -f container1 container2

Step 3: Custom Network āϤ⧈āϰāĻŋ āĻ•āϰ⧋

# Custom bridge network āϤ⧈āϰāĻŋ
docker network create mynet

Output:

a1b2c3d4e5f6...  (network āĻāϰ ID)
# āĻĻ⧇āĻ–ā§‹ network āϤ⧈āϰāĻŋ āĻšāϝāĻŧ⧇āϛ⧇
docker network ls

Output:

NETWORK ID     NAME      DRIVER    SCOPE
abc123         bridge    bridge    local
def456         host      host      local
ghi789         none      null      local
xyz000         mynet     bridge    local  ✅

Step 4: Custom Network āĻ DNS āĻ•āĻžāϜ āĻ•āϰ⧇ āĻĻ⧇āĻ–ā§‹

# āĻĻ⧁āχāϟāĻž container āϚāĻžāϞāĻžāĻ“, āĻāĻŦāĻžāϰ --network mynet āĻĻāĻžāĻ“
docker run -d --name container1 --network mynet alpine sleep 3600
docker run -d --name container2 --network mynet alpine sleep 3600
# container1 āĻāϰ āϭ⧇āϤāϰ⧇ āϝāĻžāĻ“
docker exec -it container1 sh
# container2 āϕ⧇ āύāĻžāĻŽ āĻĻāĻŋāϝāĻŧ⧇ ping āĻ•āϰ⧋
ping container2
# Output:
# PING container2 (172.18.0.3): 56 data bytes
# 64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.123 ms ✅
# āĻ•āĻžāϜ āĻ•āϰāϛ⧇!

exit
# cleanup
docker rm -f container1 container2

Step 5: Network Inspect āĻ•āϰ⧋

docker network inspect mynet
[
    {
        "Name": "mynet",
        "Id": "01f3c05598fd017323583c8b8e41f3eb7a046bac46c821dfa74c496ae6b70d00",
        "Created": "2026-03-01T10:58:49.596105971Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv4": true,
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {
            "com.docker.network.enable_ipv4": "true",
            "com.docker.network.enable_ipv6": "false"
        },
        "Labels": {}
    }
]

Step 6: Real World Example — Node App + MongoDB

āĻāĻ–āύ āĻāĻ•āϟāĻž real scenario practice āĻ•āϰāĻŦā§‹āĨ¤

āĻĢāĻžāχāϞ structure:

~/network-practice/
    index.js
    package.json
    Dockerfile
mkdir ~/network-practice
cd ~/network-practice
{
  "name": "network-practice",
  "version": "1.0.0",
  "main": "index.js",
  "dependencies": {
    "express": "^4.18.0",
    "mongoose": "^7.0.0"
  }
}
const express = require('express');
const mongoose = require('mongoose');

const app = express();
app.use(express.json());

// āĻāĻ–āĻžāύ⧇ 'mongodb' āĻšāϞ⧋ container āĻāϰ āύāĻžāĻŽ
// Docker DNS automatically resolve āĻ•āϰāĻŦ⧇
const MONGO_URL = 'mongodb://mongodb:27017/mydb';

mongoose.connect(MONGO_URL)
  .then(() => console.log('MongoDB connected ✅'))
  .catch(err => console.log('MongoDB error:', err));

// Simple Schema
const ItemSchema = new mongoose.Schema({ name: String });
const Item = mongoose.model('Item', ItemSchema);

// Routes
app.get('/', (req, res) => {
  res.json({ message: 'App āϚāϞāϛ⧇!' });
});

app.post('/items', async (req, res) => {
  const item = await Item.create({ name: req.body.name });
  res.json(item);
});

app.get('/items', async (req, res) => {
  const items = await Item.find();
  res.json(items);
});

app.listen(3000, () => console.log('Server running on port 3000'));
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "index.js"]

Step 1: Network āϤ⧈āϰāĻŋ āĻ•āϰ⧋

docker network create appnet

Step 2: MongoDB container āϚāĻžāϞāĻžāĻ“

docker run -d \
  --name mongodb \
  --network appnet \
  -v mongodata:/data/db \
  mongo:6

Step 3: App āĻāϰ Image build āĻ•āϰ⧋

docker build -t myapp .

Step 4: App container āϚāĻžāϞāĻžāĻ“

docker run -d \
  --name myapp \
  --network appnet \
  -p 3000:3000 \
  myapp

Step 3: App āĻāϰ Image build āĻ•āϰ⧋

docker build -t myapp .

Step 4: App container āϚāĻžāϞāĻžāĻ“

docker run -d \
  --name myapp \
  --network appnet \
  -p 3000:3000 \
  myapp