āϤā§āĻŽāĻŋ āϝāĻĻāĻŋ āĻĻā§āĻāĻāĻž container āĻāĻžāϞāĻžāĻ:
Container 1: Node.js App (port 3000)
Container 2: MongoDB (port 27017)
[Node App Container] [MongoDB Container]
đ đ
āĻāĻĨāĻž āĻŦāϞāϤ⧠āĻĒāĻžāϰāĻā§ āύāĻž â
Network āĻāĻžāĻĄāĻŧāĻž:
āϤā§āĻŽāĻŋ āĻāϰ āϤā§āĻŽāĻžāϰ āĻŦāύā§āϧ⧠āĻĻā§āĻāĻāĻž āĻāϞāĻžāĻĻāĻž āĻŦāĻžāĻĄāĻŧāĻŋāϤ⧠āĻŦāύā§āĻĻā§
āĻā§āύ⧠āϰāĻžāϏā§āϤāĻž āύā§āĻ â āĻāĻĨāĻž āĻšāĻŦā§ āύāĻž
Network āĻĻāĻŋāϞā§:
āĻĻā§āĻāĻāĻž āĻŦāĻžāĻĄāĻŧāĻŋāϰ āĻŽāĻžāĻā§ āϰāĻžāϏā§āϤāĻž āϤā§āϰāĻŋ āĻšāϞā§
āĻāĻāύ āϝā§āĻāĻžāϝā§āĻ āϏāĻŽā§āĻāĻŦ â
1. bridge â Default, most common (āĻāĻāĻā§ āĻāĻāĻžāĻ āĻļāĻŋāĻāĻŦā§)
2. host â Container host āĻāϰ network directly use āĻāϰā§
3. none â āĻā§āύ⧠network āύā§āĻ, āϏāĻŽā§āĻĒā§āϰā§āĻŖ isolated
4. overlay â Multiple machines āĻāϰ āĻŽāϧā§āϝ⧠(Swarm/K8s āĻ āϞāĻžāĻā§)
[Docker Host Machine]
âââââââââââââââââââââââââââââââââââââââ
â â
â [bridge network: mynet] â
â âââââââââââ âââââââââââ â
â â app ââââââļâ db â â
â âcontainerâ âcontainerâ â
â âââââââââââ âââââââââââ â
â â
âââââââââââââââââââââââââââââââââââââââ
Docker āĻ āĻāĻāĻāĻž default bridge network āĻāĻā§, āĻāĻŋāύā§āϤ⧠āϏā§āĻāĻž use āĻāϰāĻž āĻāĻāĻŋāϤ āύāĻžāĨ¤
Default Bridge āϏāĻŽāϏā§āϝāĻž:
â Container āύāĻžāĻŽ āĻĻāĻŋāϝāĻŧā§ āĻā§āύāĻž āϝāĻžāϝāĻŧ āύāĻž
â IP āĻĻāĻŋāϝāĻŧā§ communicate āĻāϰāϤ⧠āĻšāϝāĻŧ
â IP change āĻšāϞ⧠āϏāĻŦ āĻāĻžāĻā§
Custom Bridge:
â
Container āύāĻžāĻŽ āĻĻāĻŋāϝāĻŧā§ āĻā§āύāĻž āϝāĻžāϝāĻŧ (DNS automatic)
â
Isolated â āĻļā§āϧ⧠same network āĻāϰ containers āĻāĻĨāĻž āĻŦāϞāϤ⧠āĻĒāĻžāϰā§
â
Production ready
# Docker āĻ āĻā§ āĻā§ network āĻāĻā§ āĻĻā§āĻā§
docker network ls
Output:
NETWORK ID NAME DRIVER SCOPE
abc123 bridge bridge local
def456 host host local
ghi789 none null local
bridge āĻšāϞ⧠defaultāĨ¤ āĻāĻāĻžāϤ⧠container āĻā§āϞ⧠IP āĻĻāĻŋāϝāĻŧā§ āĻāĻĨāĻž āĻŦāϞā§, āύāĻžāĻŽ āĻĻāĻŋāϝāĻŧā§ āύāĻžāĨ¤# āĻĻā§āĻāĻāĻž container āĻāĻžāϞāĻžāĻ, āĻā§āύ⧠network specify āĻāϰā§āύāĻŋ
docker run -d --name container1 alpine sleep 3600
docker run -d --name container2 alpine sleep 3600
sleep 3600 āĻŽāĻžāύ⧠container āĻāĻž 1 āĻāύā§āĻāĻž āĻāϞāϤ⧠āĻĨāĻžāĻāĻŦā§, āĻāĻŋāĻā§ āĻāϰāĻŦā§ āύāĻž â just alive āĻĨāĻžāĻāĻŦā§āĨ¤# container1 āĻāϰ āĻā§āϤāϰ⧠āϝāĻžāĻ
docker exec -it container1 sh
# container2 āĻā§ āύāĻžāĻŽ āĻĻāĻŋāϝāĻŧā§ ping āĻāϰā§
ping container2
# Output: ping: bad address 'container2' â
# āύāĻžāĻŽ āĻĻāĻŋāϝāĻŧā§ āĻāĻŋāύāϤ⧠āĻĒāĻžāϰāĻā§ āύāĻž!
exit
# cleanup
docker rm -f container1 container2
# 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 â
# āĻĻā§āĻāĻāĻž 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
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": {}
}
]
Containers āĻāϰ āĻā§āϤāϰ⧠āĻĻā§āĻāĻž āϝāĻžāĻŦā§ āĻā§ āĻā§ āĻāĻā§āĨ¤āĻāĻāύ āĻāĻāĻāĻž real scenario practice āĻāϰāĻŦā§āĨ¤
~/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"]
docker network create appnet
docker run -d \
--name mongodb \
--network appnet \
-v mongodata:/data/db \
mongo:6
--name mongodb â āĻāĻ āύāĻžāĻŽāĻāĻžāĻ app container āĻĨā§āĻā§ use āĻšāĻŦā§ connection āĻāĨ¤docker build -t myapp .
docker run -d \
--name myapp \
--network appnet \
-p 3000:3000 \
myapp
docker build -t myapp .
docker run -d \
--name myapp \
--network appnet \
-p 3000:3000 \
myapp