Bài 3. Docker Networking: Kết Nối Container Hiệu Quả

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
    • webapi 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.

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

  1. Tạo network:
    docker network create my-bridge
  2. Chạy container:
    docker run -d --name web --network my-bridge nginx
    docker run -d --name api --network my-bridge python:3.9
  3. Kết nối:
    • web ping api 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

  1. 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)
  2. Build:
    docker build -t my-api .

Chạy và Kết Nối

  1. Tạo network:
    docker network create app-net
  2. 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
  3. 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.
Điều hướng chuỗi bài viết<< Bài 2. Docker Image: cách xây Dựng và tối Ưu
>> Bài 4. Docker Volume: Quản Lý Dữ Liệu Hiệu Quả cho Container
Chia sẻ bài viết:
Theo dõi
Thông báo của
0 Góp ý
Được bỏ phiếu nhiều nhất
Mới nhất Cũ nhất
Phản hồi nội tuyến
Xem tất cả bình luận

Có thể bạn quan tâm