Danh sách bài viết trong series Sử dụng Docker từ cơ bản đến nâng cao
- Bài 1. Cơ Bản Docker: Hiểu Container và Vai Trò trong DevOps
- Bài 2. Docker Image: cách xây Dựng và tối Ưu
- Bài 3. Docker Networking: Kết Nối Container Hiệu Quả
- Bài 4. Docker Volume: Quản Lý Dữ Liệu Hiệu Quả cho Container
- Bài 5. Docker Compose: Điều Phối Multi-Container Hiệu Quả
- Bài 6. Docker Swarm: Orchestration Cơ Bản để Scale Container
- Bài 7. Docker Security: Bảo Mật Container Hiệu Quả
- Bài 8. Docker CI/CD: Tích Hợp Container vào Pipeline DevOps
- Bài 9. Docker Monitoring: Theo Dõi và Logging Container Hiệu Quả
- Bài 10. Docker resources: Tối Ưu và Debug Container Hiệu Quả
- Bài 11. Docker và Microservices: Thiết Kế Ứng Dụng Phân Tán
- Bài 12. Docker Registry: Tự Host và Quản Lý Image Hiệu Quả
- Bài 13. Docker với Cloud: Tích Hợp Container trên AWS ECS và GCP Cloud Run
Trong DevOps, container không hoạt động đơn lẻ – chúng cần “nói chuyện” với nhau, với host, hoặc với thế giới bên ngoài. Docker Networking trong DevOps là chìa khóa để đảm bảo điều đó. Trong bài thứ ba của series, chúng ta sẽ đi sâu vào các loại mạng Docker – bridge network, overlay network, cách container kết nối, và thực hành để tối ưu mạng cho pipeline CI/CD và microservices. Hãy sẵn sàng để hiểu cách Docker quản lý lưu lượng!
Docker Networking Là Gì?
Tổng Quan Docker Network
Docker Networking là hệ thống cho phép container giao tiếp với nhau, với host, hoặc với mạng bên ngoài.
- Driver: Bridge (mặc định), host, overlay, none.
- Mục tiêu: Cô lập, kết nối, và mở rộng khả năng giao tiếp.
Ví dụ: Một container web (Nginx) cần gọi container API (Flask) – Docker network giúp chúng tìm nhau qua tên hoặc IP.
Tại Sao Quan Trọng trong DevOps?
- Pipeline CI/CD: Container test cần gọi DB hoặc registry.
- Microservices: Mỗi service chạy container riêng, cần giao tiếp.
- Scalability: Mạng hỗ trợ scale container trên nhiều host.
Tình huống thực tế: Một team DevOps gặp lỗi khi container runner không gọi được GitLab do mạng mặc định bị cô lập. Tạo bridge network đã giải quyết vấn đề.
Các Loại Docker Network
Bridge Network: Mạng Cơ Bản
- Bridge: Mạng mặc định, cô lập container trên host, dùng NAT để ra ngoài.
- Cơ chế: Docker tạo
docker0
bridge, gán IP trong subnet (VD:172.17.0.0/16
). - Ví dụ:
docker run -d --name web nginx docker run -d --name api python:3.9
web
vàapi
không thấy nhau trừ khi cùng network.
DevOps: Bridge phù hợp cho test đơn giản trên một host.
Host Network: Dùng Mạng Host
- Host: Container dùng trực tiếp network stack của host, không cô lập.
- Ví dụ:
docker run -d --network host nginx
- Truy cập
localhost:80
trên host thấy Nginx.
- Truy cập
DevOps: Dùng host network khi cần hiệu năng cao (VD: monitoring agent).
Overlay Network: Kết Nối Multi-Host
- Overlay: Kết nối container trên nhiều host (dùng Swarm hoặc Kubernetes).
- Cơ chế: VXLAN tạo mạng ảo giữa các node.
- Ví dụ:
docker network create -d overlay my-overlay docker service create --network my-overlay nginx
DevOps: Overlay cần thiết cho microservices scale trên cluster.
None Network
- None: Container không có mạng, hoàn toàn cô lập.
- Ví dụ:
docker run --network none alpine
Container Kết Nối: Cách Hoạt Động
Bridge Network Tùy Chỉnh
- Tạo network:
docker network create my-bridge
- Chạy container:
docker run -d --name web --network my-bridge nginx docker run -d --name api --network my-bridge python:3.9
- Kết nối:
web
pingapi
bằng tên (DNS tự động trong cùng network).
DevOps: Dùng bridge tùy chỉnh để test multi-container trong pipeline.
Port Mapping
- Map port container ra host:
docker run -d -p 8080:80 nginx
- Host gọi
localhost:8080
thấy Nginx.
DevOps: Port mapping cho phép truy cập service từ bên ngoài (VD: runner gọi API).
Thực Hành: Kết Nối Container
Tạo Ứng Dụng Web-API
-
Dockerfile API:
FROM python:3.9-slim WORKDIR /app COPY requirements.txt . RUN pip install flask COPY api.py . CMD ["python", "api.py"]
-
api.py
:from flask import Flask app = Flask(__name__) @app.route('/') def hello(): return "API says Hello!" if __name__ == "__main__": app.run(host="0.0.0.0", port=5000)
-
- Build:
docker build -t my-api .
Chạy và Kết Nối
- Tạo network:
docker network create app-net
- Chạy container:
docker run -d --name web --network app-net -p 8080:80 nginx docker run -d --name api --network app-net my-api
- Test kết nối:
docker exec -it web curl http://api:5000
- Kết quả: “API says Hello!”.
Debug Mạng
- Xem network:
docker network ls docker network inspect app-net
- Ping:
docker exec -it web ping api
Debug tip:
- Không gọi được: Kiểm tra container trong cùng network (
docker network inspect
). - Port lỗi: Dùng
docker logs
xem service có chạy không.
Ứng Dụng trong DevOps
Pipeline CI/CD
- Test multi-container:
test: image: docker script: - docker network create test-net - docker run -d --name db --network test-net postgres - docker run -d --name app --network test-net my-app - docker exec app pytest
- Kết quả: App test gọi DB qua network nội bộ.
Microservices
- Overlay network kết nối web, API, DB trên nhiều host trong Swarm.
- Ví dụ: Một team dùng overlay để scale API từ 1 lên 10 container, không cần thay đổi code.
Case study: Một hệ thống DevOps giảm thời gian test từ 5 phút xuống 1 phút nhờ bridge network thay vì port mapping phức tạp.
Kết Luận
Docker Networking trong DevOps là nền tảng để container giao tiếp hiệu quả, từ bridge network cho test đơn giản, overlay network cho scale multi-host, đến container kết nối trong pipeline. Thực hành với Nginx và Flask cho thấy bạn có thể tối ưu mạng cho CI/CD và microservices. Bài tiếp theo, chúng ta sẽ khám phá Docker Volume và Storage – cách quản lý dữ liệu trong DevOps.
Bài tập nhỏ:
- Tạo bridge network, chạy 2 container Alpine, ping qua lại bằng tên.
- Chạy Nginx với host network, so sánh với bridge về truy cập port.