Khi bạn tạo nhiều container để chạy ứng dụng – ví dụ một container chạy web, một container chạy database – thì các container này phải kết nối được với nhau. Vậy làm sao chúng biết địa chỉ của nhau? Làm sao để container này “nói chuyện” với container kia? Câu trả lời nằm ở Docker Network.
Xem thêm:
Hướng dẫn Mapping Port trong Docker – Mở port (expose và publish) – Bài 7
Hướng dẫn sử dụng Docker Volume – Bài 8
1. Docker có những loại mạng nào?
Khi bạn cài Docker lần đầu, mặc định nó sẽ tạo sẵn 3 loại mạng:
| Tên mạng | Giải thích đơn giản |
|---|---|
| bridge | Mạng mặc định, dùng để các container trong cùng network kết nối được với nhau. |
| host | Container dùng luôn network của máy chủ Docker. |
| none | Không gán network cho container. |
2. Bridge network hoạt động như thế nào?
Giả sử bạn tạo hai container: một là web, một là app. Nếu cả hai container cùng nằm trong một bridge network, thì:
- Chúng sẽ tự động cấp phát IP trong cùng một subnet.
- Bạn có thể gọi container kia bằng tên hostname của nó, ví dụ ping app.
- Không cần cấu hình gì thêm.
3. Tạo mạng riêng để tách biệt container
Giống như trong doanh nghiệp, mỗi phòng ban có thể dùng VLAN để tách biệt lưu lượng mạng, thì trong Docker bạn cũng có thể tạo network riêng để tách container của từng ứng dụng:
docker network create my_network Sau đó khi bạn tạo container: docker run -d --name web --network my_network nginx docker run -d --name app --network my_network node-app
Lúc này web và app sẽ thấy nhau, nhưng các container khác không nằm trong my_network sẽ không thể truy cập.
4. Container có thể nằm trong nhiều mạng
Một container có thể nằm trong nhiều mạng cùng lúc. Mỗi mạng sẽ cấp cho nó một IP khác nhau. Ví dụ:
docker network create frontend docker network create backend docker network connect frontend my_container docker network connect backend my_container
5. HandOn Docker Network
Mục tiêu bài thực hành
Chúng ta sẽ tạo một môi trường nhỏ gồm 5 container:
| Tên Container | Vai trò | Mạng |
|---|---|---|
ansible |
Quản lý (management) | Google + Yahoo |
google-web |
Web frontend | Google Network |
google-app |
Backend | Google Network |
yahoo-web |
Web frontend | Yahoo Network |
yahoo-app |
Backend | Yahoo Network |
Mục tiêu là:
- Các container trong cùng một mạng có thể kết nối với nhau.
- Các container ở mạng khác nhau không thể truy cập nhau.
ansiblelà container “quản lý” nên sẽ kết nối được với cả hai mạng.
Bước 1: Tạo 2 mạng riêng biệt
Chúng ta sẽ tạo 2 bridge network riêng là google-network và yahoo-network.
docker network create google-network
docker network create yahoo-network
Kiểm tra lại:
docker network ls
Kết quả sẽ có thêm 2 dòng google-network và yahoo-network.
Bước 2: Tạo container và gán vào mạng tương ứng
Tạo các container Google
docker run -d --name google-web --network google-network php:apache
docker run -d --name google-app --network google-network php:apache
Tạo các container Yahoo
docker run -d --name yahoo-web --network yahoo-network php:apache
docker run -d --name yahoo-app --network yahoo-network php:apache
Bước 3: Tạo container ansible nằm trong mạng bridge mặc định
docker run -d --name ansible php:apache
Lúc này ansible chỉ nằm trong mạng bridge, không thể kết nối với các container Google/Yahoo.
Bước 4: Kết nối ansible vào 2 mạng Google và Yahoo
docker network connect google-network ansible
docker network connect yahoo-network ansible
Giờ đây, ansible nằm trong 3 mạng: bridge (mặc định), google-network, yahoo-network.
Bước 5: Kiểm tra IP và kết nối thử
- Lấy IP của từng container trong từng network:
docker inspect google-web | grep "IPAddress"
docker inspect yahoo-app | grep "IPAddress"
- Vào container
ansibleđể kiểm tra kết nối:
docker exec -it ansible bash
Trong container, cài đặt các công cụ nếu chưa có:
apt update && apt install -y iputils-ping dnsutils curl
- Thử kết nối bằng tên container (do Docker bridge custom có sẵn DNS):
ping google-app
ping yahoo-app
Nếu thấy phản hồi, nghĩa là container ansible đã kết nối thành công đến các container khác qua tên.
- Thử kết nối chéo giữa 2 mạng:
- Vào container
google-app, thử pingyahoo-web→ sẽ bị timeout. - Lý do: chúng nằm ở hai mạng khác nhau và không có container nào chung giữa 2 mạng.
- Vào container
Bước 6: Ngắt container khỏi mạng
Nếu sau này bạn không muốn container ansible kết nối với Google hoặc Yahoo nữa:
docker network disconnect google-network ansible
docker network disconnect yahoo-network ansible
Tổng kết
| Khái niệm | Mô tả |
|---|---|
| Docker network bridge | Mạng nội bộ cho container. Có thể tạo nhiều bridge để tách biệt ứng dụng. |
| Container gắn nhiều network | Một container có thể có nhiều IP thuộc nhiều subnet khác nhau. |
| DNS nội bộ | Docker bridge network tự tạo có DNS giúp container gọi nhau qua tên. |
| Quản lý kết nối | Dùng docker network connect/disconnect để linh hoạt kiểm soát kết nối mạng. |