---
id: docker-network
title: "Docker network"
shortTitle: "Docker network"
track: docker
trackTitle: "Docker"
order: 10
level: important
status: published
estimatedMinutes: 30
prerequisites:
  - docker-registry
next: docker-lxc
reviewedAgainst: 2026-10-15
sources:
  - title: "KodeKloud Engineer — 100 Days of DevOps"
    url: https://engineer.kodekloud.com/practice
  - title: "Docker network overview"
    url: https://docs.docker.com/engine/network/
  - title: "Bridge network driver"
    url: https://docs.docker.com/engine/network/drivers/bridge/
  - title: "docker network create"
    url: https://docs.docker.com/reference/cli/docker/network/create/
  - title: "docker network ls"
    url: https://docs.docker.com/reference/cli/docker/network/ls/
---

# Docker network

Hai container không gọi nhau bằng `localhost`. `localhost` trong container là chính container đó. Cùng một user-defined network thì chúng gọi nhau bằng tên.

## Để làm gì

Tạo một network, chạy Nginx trên đó, và lấy trang từ container thứ hai bằng tên `lab-web`.

## Gồm những gì

- Bridge mặc định và user-defined bridge.
- `docker network create` / `ls` / `rm`. Mặc định `--driver bridge`.
- `--subnet`, `--ip-range`, `--gateway` khi lab đòi CIDR riêng.
- DNS nội bộ theo tên container trên user-defined bridge.
- `docker run --network`.

Không gồm overlay nhiều máy. Đó là Swarm hoặc một driver khác, không cần cho Compose trên một laptop.

## Dùng khi nào

App và database trong Compose. File Compose tự tạo network cho project, các service gọi nhau bằng tên service. Bài này là cùng cơ chế, gọi bằng tay để thấy.

Đừng dùng `--network host` để khỏi nghĩ tới DNS. Trên Docker Desktop cho Windows và Mac, host network không giống Linux. Và container dùng chung namespace mạng với máy thì đụng cổng với app khác.

## Kiến thức cốt lõi

Bridge mặc định tên `bridge`. Container trên đó có IP, nhưng không có DNS theo tên. User-defined bridge có DNS: tên container và bí danh phân giải được trong network đó.

`docker network create TÊN` tạo user-defined bridge. Bỏ `--driver` thì mặc định `bridge`. `-d overlay` là Swarm nhiều máy — không cần lab một host. `docker network ls` liệt kê; `--filter driver=bridge` hoặc `--filter type=custom` lọc. Tên phải unique trên daemon.

Lab đòi CIDR: `--subnet=192.168.0.0/16` (một subnet trên bridge). Thêm `--ip-range` và `--gateway` khi đề ghi rõ dải cấp IP và cổng. Hai subnet chồng nhau thì `create` fail. Đừng đoán CIDR trùng mạng host.

`docker run --network=lab-net` gắn lúc start. Container đã chạy thì `docker network connect`. Cùng user-defined network: gọi nhau bằng tên container, không cần `-p`.

Publish `-p 8080:80` mở cổng ra host. Việc publish không giúp container khác gọi nhau. Hai đường tách nhau: traffic từ laptop vào, và traffic giữa các container.

Một container có thể gắn nhiều network. Database chỉ gắn network nội bộ, không publish cổng, thì máy host không nối được bằng `localhost:5432`. Đúng khi bạn muốn vậy.

## Lệnh và code mẫu

```bash
docker network create lab-net
docker network create --driver bridge --subnet 172.28.0.0/16 lab-cidr
docker network ls --filter type=custom
docker run -d --name lab-web --network lab-net nginx:1.27-alpine
docker run --rm --network lab-net alpine:3.20 wget -qO- http://lab-web
docker rm -f lab-web
docker network rm lab-net lab-cidr
```

Không ghi `--driver` thì vẫn ra bridge. Dòng `--subnet` chỉ khi đề (hoặc lab) cần CIDR riêng. `172.28.0.0/16` lấy từ ví dụ docs `network create`. Đổi nếu trùng mạng máy.

## Thực hành

1. Chạy khối lệnh.
2. Đọc HTML Nginx trả về qua `wget`.
3. Xóa container và network. `docker network rm` fail nếu còn container trong network, nên xóa container trước.

## Kết quả mong đợi

`wget` in một trang HTML có chữ nginx. Không còn container `lab-web` và network `lab-net`.

## Checklist

- [ ] Service gọi nhau bằng tên trên cùng network, không bằng IP container.
- [ ] `docker network create` mặc định bridge. `--subnet` khi đề đòi CIDR.
- [ ] `docker network ls` thấy network vừa tạo trước khi `run --network`.
- [ ] Database lab không publish cổng nếu chỉ app trong Compose cần nối.
- [ ] Dọn network tạo tay sau bài. `rm` fail nếu còn container.

## Thẻ ôn

### docker-network-dns
kind: distinguish
cue: Bridge mặc định không có DNS theo tên. User-defined bridge mới gọi nhau bằng tên container.

Q: Hai container cùng gắn network `bridge` có sẵn. Bạn `wget http://tên-container` từ cái kia và fail. Vì sao, và lệnh nào tạo network có DNS theo tên?

A: Network `bridge` mặc định cấp IP nhưng không phân giải tên container. Gọi bằng tên chỉ có trên user-defined bridge. `docker network create lab-net` (mặc định `--driver bridge`) rồi `docker run --network lab-net`. Compose tự tạo network kiểu đó cho project. Đừng chữa bằng `-p` — publish là đường từ host vào, không phải DNS giữa container.

### docker-network-create
kind: command
cue: `docker network create` mặc định bridge. `--subnet` khi đề đòi CIDR. `ls` kiểm tra. `rm` sau khi xóa hết container.

Q: Lab bảo tạo network bridge với một subnet CIDR, gắn Nginx vào, rồi dọn. Các lệnh nào, và `create` fail thường vì lý do gì?

A: `docker network create --driver bridge --subnet 172.28.0.0/16 TÊN` — bỏ `--driver` vẫn ra bridge. `docker network ls --filter type=custom` thấy dòng mới. `docker run --network TÊN …`. Xóa container trước, rồi `docker network rm TÊN`. `create` fail khi tên trùng, hoặc `--subnet` chồng dải đã dùng / trùng mạng host. Overlay là Swarm nhiều máy, không dùng cho lab một host.

## Lỗi thường gặp

**`wget http://localhost` từ container alpine.** Đó là alpine, không phải Nginx. Connection refused hoặc không có server. Dùng tên `lab-web`.

**Hai container trên bridge mặc định, gọi theo tên.** Không có DNS. Tạo user-defined network, hoặc để Compose tạo.

**`--subnet` trùng dải host hoặc network khác.** `create` từ chối. Đổi CIDR, hoặc bỏ `--subnet` nếu đề không đòi.

**`docker network rm` khi còn container.** Docs: cảnh báo / fail. `rm -f` container trước.

## Nguồn

1. [KodeKloud Engineer — 100 Days of DevOps](https://engineer.kodekloud.com/practice) — đề cương ngày Create a Docker Network. Trang practice cần đăng nhập. Bài này viết lại lệnh, không chép lab.
2. [Networking overview](https://docs.docker.com/engine/network/) — driver và phạm vi.
3. [Bridge network driver](https://docs.docker.com/engine/network/drivers/bridge/) — DNS trên user-defined bridge.
4. [docker network create](https://docs.docker.com/reference/cli/docker/network/create/) — mặc định `bridge`, `--subnet`, `--ip-range`, `--gateway`.
5. [docker network ls](https://docs.docker.com/reference/cli/docker/network/ls/) — `--filter driver` / `type=custom`.

## Tiếp theo

[LXC](./07-lxc.md)
