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.
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:
- Bridge (mặc định)
- Host
- None
- Overlay
- 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-apphoặcmysql-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-netcủ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
wordpressvớ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:8000ngay 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
Hướng Dẫn Cài Đặt GitLab Runner Với Docker Cho Người Mới
Hướng dẫn từng bước cách cài đặt và cấu hình GitLab Runner bằng Docker trên máy chủ (EC2/VPS). Giải pháp hoàn hảo giúp tự động hóa quy trình CI/CD dễ hiểu cho cả người không chuyên kỹ thuật.
Tạo chứng chỉ SSL Wildcard cho Subdomain với Cloudflare và Docker
Hướng dẫn chi tiết cách tạo chứng chỉ SSL Wildcard miễn phí từ Let's Encrypt cho mọi Subdomain tự động thông qua DNS Challenge của Cloudflare và Docker.
Script cài đặt nhanh Docker và Docker Compose trên Debian
Chia sẻ script tự động cài đặt Docker và Docker Compose siêu tốc trên Debian (9, 10, 11, 12) giúp bạn tiết kiệm thời gian triển khai.