Hướng dẫn nhanh về Docker Networking cho người mới

Tìm hiểu các loại mạng trong Docker như Bridge, Host, None, Overlay và MacVlan. Hướng dẫn cách tạo network, kết nối container và map port chi tiết dễ hiểu.

Hướng dẫn nhanh về Docker Networking cho người mới

Các loại mạng trong Docker

Mặc định, Docker đi kèm với 5 loại mạng (network driver) được tích hợp sẵn:

  1. Bridge (mặc định)
  2. Host
  3. None
  4. Overlay
  5. MacVlan

Bạn có thể tham khảo tài liệu chính thức về network driver tại đây.

Hãy cùng tìm hiểu về từng loại mạng này và xem cách chúng hoạt động trong các tình huống thực tế nhé!

Bridge Network - Sự lựa chọn mặc định

Khi bạn cài đặt Docker, nó sẽ tự động tạo một mạng bridge mặc định. Tất cả các container sẽ sử dụng mạng này trừ khi bạn chỉ định một mạng khác. Hãy tưởng tượng mạng bridge giống như một bộ chuyển mạch ảo (virtual switch) - nó cho phép các container trên cùng một mạng có thể giao tiếp với nhau.

Trước tiên, hãy kiểm tra xem chúng ta đang có sẵn những mạng nào bằng lệnh sau:

docker network ls

Bạn sẽ thấy kết quả tương tự như thế này:

NETWORK ID     NAME      DRIVER    SCOPE
abc123def456   bridge    bridge    local
xyz789uvw321   host      host      local
123abc456def   none      null      local

Tạo một Bridge Network của riêng bạn

Mặc dù mạng bridge mặc định hoạt động rất tốt, nhưng việc tạo một mạng riêng cho mình sẽ mang lại một vài lợi ích tốt hơn:

  • Các container của bạn có thể tìm thấy nhau thông qua tên (ví dụ: wordpress-app hoặc mysql-db).
  • Bạn có được sự cô lập tốt hơn so với các container khác trên hệ thống.
  • Bạn có thể kết nối và ngắt kết nối các container ngay cả khi chúng đang chạy.

Dưới đây là cách tạo một mạng bridge của riêng bạn. Chúng ta sẽ gọi nó là my-network:

docker network create my-network

Bây giờ hãy thử làm một cái gì đó thực tế hơn - chúng ta sẽ chạy một container Nginx và một container để test xem chúng có thể nói chuyện với nhau không:

# Khởi chạy một container Nginx
docker run -d --name web --network my-network nginx

# Khởi chạy một container Ubuntu
docker run -it --name ubuntu --network my-network ubuntu bash

Từ bên trong container Ubuntu, bây giờ bạn có thể ping đến container Nginx bằng tên của nó. Điều này cực kỳ hữu ích khi thiết lập kết nối giữa ứng dụng của bạn và cơ sở dữ liệu:

ping web

Host Network - Truy cập trực tiếp

Mạng host thì lại khác - nó loại bỏ sự cô lập mạng giữa container và máy chủ Docker của bạn. Điều này giống như việc bạn đang chạy chương trình trực tiếp trên máy của mình vậy. Tính năng này có thể hữu ích trong các trường hợp cụ thể khi bạn cần hiệu suất mạng tốt nhất.

Dưới đây là cách sử dụng mạng host:

docker run -d --network host nginx

Bây giờ Nginx đã có sẵn trực tiếp trên cổng 80 của máy chủ host - bạn không cần phải ánh xạ (map) bất kỳ cổng nào cả!

Cảnh báo: Hãy cẩn thận với mạng host. Chỉ sử dụng nó khi bạn thực sự cần vì nó cấp cho các container toàn quyền truy cập vào mạng của máy chủ host.

Port Mapping

Khi bạn sử dụng mạng bridge (thường là hầu hết các trường hợp), bạn cần phải ánh xạ các cổng của container ra các cổng của máy chủ host nếu bạn muốn truy cập chúng từ bên ngoài. Để tôi chỉ cho bạn cách hoạt động của nó:

docker run -d -p 8080:80 nginx

Lệnh này nói với Docker rằng: “Hãy lấy cổng 80 bên trong container và cung cấp nó ra ngoài như là cổng 8080 trên máy chủ host của tôi.” Bây giờ bạn có thể truy cập Nginx tại địa chỉ http://localhost:8080.

Ví dụ thực tế: Chạy Wordpress với MySQL

Hãy thiết lập một ví dụ thực tế hơn - một ứng dụng wordpress chạy với MySQL. Chúng ta sẽ tạo một mạng để chúng có thể giao tiếp và thiết lập mọi thứ một cách đúng chuẩn.

Đầu tiên, hãy tạo một mạng cho ứng dụng wordpress của chúng ta:

# Tạo một network cho ứng dụng wordpress
docker network create wordpress-net

Bây giờ, hãy khởi động MySQL. Chúng ta sẽ đặt cho nó một cái tên cụ thể để ứng dụng wordpress có thể tìm thấy nó:

# Khởi chạy MySQL với các cấu hình cho Wordpress
docker run -d \
    --name mysql-db \
    --network wordpress-net \
    -e MYSQL_ROOT_PASSWORD=secret \
    -e MYSQL_DATABASE=wordpress \
    -e MYSQL_USER=wordpress \
    -e MYSQL_PASSWORD=secret \
    mysql:5.7

Hãy phân tích xem lệnh trên làm gì:

  • Tạo một container có tên là mysql-db
  • Kết nối nó vào mạng wordpress-net của chúng ta
  • Thiết lập mật khẩu root
  • Tạo một database có tên là wordpress
  • Tạo một user wordpress với mật khẩu là secret

Bây giờ là đến ứng dụng wordpress của chúng ta:

# Khởi chạy ứng dụng wordpress
docker run -d \
    --name wordpress-app \
    --network wordpress-net \
    -p 8000:80 \
    -e DB_HOST=mysql-db \
    -e DB_DATABASE=wordpress \
    -e DB_USERNAME=wordpress \
    -e DB_PASSWORD=secret \
    your-wordpress-image

Đây là những gì đang diễn ra:

  • Ứng dụng được đặt tên là wordpress-app
  • Nó được kết nối vào cùng một mạng với MySQL
  • Cổng 80 bên trong container được ánh xạ ra cổng 8000 trên máy chủ host
  • Các biến môi trường được thiết lập để kết nối với MySQL

Lưu ý rằng chúng ta sử dụng mysql-db làm database host - đó chính là tên của container!

Kiểm tra các Container Network

Dưới đây là một số lệnh hữu ích để kiểm tra các mạng container của bạn. Mình thường xuyên sử dụng những lệnh này khi cần gỡ lỗi (debug):

Bạn muốn xem một container đang sử dụng mạng nào? Hãy thử lệnh này:

docker inspect -f '{{range $key, $value := .NetworkSettings.Networks}}{{$key}} {{end}}' wordpress-app

Cần danh sách tất cả các mạng của bạn?

docker network ls

Bạn muốn xem thông tin chi tiết về một mạng? Lệnh này sẽ hiển thị tất cả các container đang kết nối vào nó:

docker network inspect wordpress-net

Các mẹo Troubleshooting

Dưới đây là một số vấn đề phổ biến và cách khắc phục chúng:

Nếu ứng dụng wordpress của bạn không thể kết nối với MySQL:

  • Kiểm tra xem cả hai container có nằm trên cùng một mạng hay không.
  • Thử lệnh docker exec wordpress-app ping mysql-db.
  • Kiểm tra lại các biến môi trường trong ứng dụng wordpress của bạn.

Nếu bạn không thể truy cập ứng dụng wordpress từ trình duyệt của mình:

  • Kiểm tra xem các cổng đã được ánh xạ chính xác chưa bằng lệnh docker ps.
  • Đảm bảo rằng không có service nào khác đang sử dụng cổng 8000 trên máy chủ host của bạn.
  • Thử dùng lệnh curl localhost:8000 ngay từ máy chủ host.

Mạng có vẻ chậm?

  • Cân nhắc sử dụng mạng host cho môi trường phát triển (development).
  • Kiểm tra log của container để xem có bất kỳ thông báo lỗi nào không.
  • Theo dõi tài nguyên của container bằng lệnh docker stats.

Lời kết

Đó là những kiến thức cơ bản nhất về Docker networking! Hãy ghi nhớ những điểm chính sau:

  • Sử dụng mạng bridge để kết nối các container của bạn với nhau.
  • Hãy tạo mạng của riêng bạn thay vì sử dụng mạng bridge mặc định.
  • Sử dụng tên container làm hostname khi các container cần giao tiếp.
  • Ánh xạ cổng (map ports) khi bạn cần truy cập vào container từ bên ngoài.

Bây giờ bạn đã có thể thiết lập hệ thống mạng chuẩn chỉnh cho các ứng dụng wordpress của mình trong Docker. Hãy thử tạo các mạng khác nhau và kết nối các container để xem cách chúng hoạt động cùng nhau nhé. Chúc bạn thành công!

Bình luận

Bài viết liên quan