Mosquitto Docker: Cách thiết lập Eclipse Mosquitto MQTT Broker với Docker và Docker Compose
Hướng dẫn từng bước triển khai Mosquitto MQTT broker sẵn sàng cho môi trường sản xuất bằng Docker containers. Bao gồm xác thực, mã hóa TLS, cấu hình lưu bền và tích hợp với Home Assistant.
Thiết lập một MQTT broker từ đầu không nên tốn hàng giờ cấu hình và khắc phục sự cố.
Eclipse Mosquitto là một MQTT broker mã nguồn mở hỗ trợ các giao thức MQTT v5, 3.1.1 và 3.1, rất phù hợp cho thiết bị IoT, hệ thống nhà thông minh, ứng dụng đám mây và mọi kiến trúc hướng thông điệp. Nhưng cài đặt và cấu hình Mosquitto trực tiếp trên hệ thống của bạn thường dẫn đến xung đột phụ thuộc, vấn đề phân quyền và các lỗi đặc thù nền tảng làm tốn thời gian phát triển. Cuối cùng bạn dành nhiều thời gian chiến đấu với thiết lập hơn là xây dựng ứng dụng thực sự.
Docker loại bỏ những nhức đầu này bằng cách cung cấp môi trường nhất quán, cách ly để chạy Mosquitto trên mọi nền tảng. Bạn có thể có một MQTT broker hoạt động đầy đủ chỉ trong vài phút, kèm cấu hình tùy chỉnh, xác thực và lưu bền dữ liệu.
Trong hướng dẫn này, tôi sẽ dẫn bạn triển khai Eclipse Mosquitto bằng Docker và Docker Compose, cấu hình xác thực và ghi log, thiết lập lưu bền dữ liệu, và kiểm thử broker với các client MQTT thực tế.
Bạn hoàn toàn mới với Docker? Tôi khuyên bạn bắt đầu với khóa học Introduction to Docker để nắm vững các kiến thức nền tảng.
Mosquitto là gì và vì sao dùng nó với Docker
Bạn không cần một hệ thống nhắn tin nặng nề khi điều bạn muốn là giao tiếp nhanh, tin cậy giữa các thiết bị.
MQTT là giao thức publish-subscribe gọn nhẹ, thiết kế cho tình huống băng thông hạn chế và độ tin cậy quan trọng. Hãy nghĩ đến cảm biến IoT, ứng dụng di động, hoặc bất kỳ kịch bản nào thiết bị cần trao đổi thông điệp nhỏ nhanh chóng mà không phải polling liên tục.
Mosquitto đóng vai trò trung gian - broker - giữa publisher và subscriber.
Publisher gửi thông điệp đến các topic cụ thể. Subscriber lắng nghe các topic đó. Mosquitto xử lý định tuyến, đảm bảo thông điệp được chuyển đến đúng nơi mà publisher và subscriber không cần biết về nhau.
Đây là lý do Docker khiến thiết lập Mosquitto càng hiệu quả hơn:
Thiết lập nhất quán đa nền tảng: Windows, macOS hay Linux - container Docker chạy theo cùng một cách. Không cần săn lùng trình cài đặt đặc thù nền tảng hay xử lý xung đột phụ thuộc.
Quản lý phiên bản dễ dàng: Bạn có thể cố định phiên bản Mosquitto qua image tag, quay lui nếu có sự cố, và thử phiên bản mới mà không đụng vào hệ thống host.
Tính di động thực sự: Cùng một thiết lập Mosquitto trên Docker hoạt động ở development, staging và production. Môi trường cục bộ của bạn khớp với những gì chạy trên máy chủ.
Mosquitto có hai phiên bản: bản mã nguồn mở (đáp ứng hầu hết nhu cầu) và Pro Edition thương mại của Cedalo với các tính năng nâng cao như clustering và bảo mật mở rộng. Với đa số dự án, bản mã nguồn mở là đủ.
Tiếp theo, tôi sẽ đi qua các yêu cầu tiên quyết rồi chúng ta sẽ bắt đầu cài đặt Mosquitto.
Yêu cầu tiên quyết
Bạn cần Docker đang chạy trên hệ thống trước khi có thể triển khai Mosquitto.
Docker Desktop phù hợp nhất cho người dùng Windows và macOS vì gói sẵn mọi thứ bạn cần. Người dùng Linux có thể cài đặt Docker CLI trực tiếp qua trình quản lý gói hoặc kho chính thức của Docker.
Docker Compose không bắt buộc, nhưng giúp quản lý các thiết lập nhiều container dễ hơn nhiều. Hầu hết cài đặt Docker Desktop có sẵn Compose mặc định. Nếu bạn dùng Linux, có thể cần cài riêng.
Bạn cũng cần kỹ năng dòng lệnh cơ bản. Không có gì phức tạp, chỉ cần chạy lệnh, di chuyển thư mục và chỉnh sửa tệp văn bản.
Thiết lập từng bước
Chạy Mosquitto trên Docker gồm ba bước: tạo thư mục, chạy container và (tùy chọn) thiết lập Docker Compose để quản lý dễ hơn.
Tạo các thư mục cần thiết
Mosquitto cần không gian lưu trữ có tổ chức cho cấu hình, dữ liệu và log.
Tạo các thư mục này để bắt đầu:
mkdir mosquitto-docker
cd mosquitto-docker
mkdir config data logsĐược hỗ trợ bởi
Việc này giúp bạn có các thư mục gọn gàng cho tệp cấu hình của Mosquitto, dữ liệu lưu bền và đầu ra log.
Chức năng của từng thư mục:
/mosquitto/config lưu mosquitto.conf và mọi tệp cấu hình bổ sung
/mosquitto/data chứa dữ liệu thông điệp lưu bền và thông tin đăng ký
/mosquitto/log chứa tệp log của Mosquitto để gỡ lỗi và giám sát
Các thư mục này sẽ được mount làm volume trong container Docker, nên cài đặt và dữ liệu của bạn vẫn còn sau khi khởi động lại container.
Chạy Mosquitto với Docker
Lệnh Docker cơ bản sẽ khởi chạy Mosquitto với ánh xạ cổng và mount volume thích hợp.
docker run -d\--name mosquitto \-p1883:1883 \-v$(pwd)/mosquitto/config:/mosquitto/config \-v$(pwd)/mosquitto/data:/mosquitto/data \-v$(pwd)/mosquitto/log:/mosquitto/log \
eclipse-mosquitto:latestĐược hỗ trợ bởi
Hình 1 - Chạy Mosquitto với Docker
Giải thích các flag:
-d chạy container ở chế độ nền (detached)
--name mosquitto đặt tên thân thiện cho container để tham chiếu dễ dàng
-p 1883:1883 ánh xạ cổng 1883 trên host tới cổng 1883 trong container
-v mount các thư mục cục bộ làm volume trong container
Mosquitto 2.0+ mặc định chạy ở chế độ chỉ cục bộ. Nghĩa là nó chỉ chấp nhận kết nối từ localhost trừ khi bạn cấu hình khác đi. Bạn cần tạo tệp cấu hình để cho phép kết nối từ bên ngoài.
Dùng Docker Compose
Docker Compose cho Mosquitto giúp quản lý cài đặt đơn giản hơn nhiều, đặc biệt khi bạn chạy nhiều dịch vụ.
Việc ánh xạ volume hoạt động giống như lệnh Docker, nhưng Compose xử lý phần phức tạp. Cấu hình cổng bao phủ mọi giao thức MQTT phổ biến: MQTT chuẩn (1883), MQTTS an toàn (8883), và kết nối WebSocket (9001).
Compose thực sự tỏa sáng với thiết lập nhiều dịch vụ. Ví dụ, nếu bạn chạy Home Assistant, Node-RED hoặc công cụ IoT khác cùng Mosquitto, bạn có thể định nghĩa tất cả trong một tệp và khởi động đồng thời.
Tiếp theo, chúng ta đi sâu hơn vào phần cấu hình.
Bạn thấy các khái niệm Docker nâng cao gây rối? Khóa học Intermediate Docker của chúng tôi vượt xa phần nền tảng.
Cấu hình Mosquitto
Mosquitto sẽ không chấp nhận kết nối ngoài ngay từ đầu, bạn cần tệp cấu hình để làm điều đó.
Cấu hình cơ bản (mosquitto.conf)
Tạo tệp mosquitto.conf trong thư mục mosquitto/config của bạn và thêm nội dung sau:
Thiết lập allow_anonymous true cho phép client kết nối không cần thông tin đăng nhập. Thiết lập này ổn cho môi trường phát triển hoặc mạng nội bộ, nhưng bạn nên tắt trong môi trường sản xuất. Khi đặt allow_anonymous false, mọi client phải xác thực bằng tên người dùng và mật khẩu.
Listener WebSocket trên cổng 9001 cho phép client MQTT dựa trên trình duyệt. Ứng dụng web có thể kết nối trực tiếp tới broker bằng thư viện JavaScript như Paho MQTT.
Thiết lập xác thực
Xác thực yêu cầu tạo tệp mật khẩu và cập nhật cấu hình.
Tạo tệp mật khẩu bên trong container:
dockerexec-it mosquitto mosquitto_passwd -c /mosquitto/config/passwd usernameĐược hỗ trợ bởi
Hình 3 - Xác thực Mosquitto
Lệnh này tạo tệp mật khẩu mới và nhắc bạn nhập mật khẩu. Với người dùng bổ sung, bỏ cờ -c:
dockerexec-it mosquitto mosquitto_passwd /mosquitto/config/passwd another_userĐược hỗ trợ bởi
Bạn sẽ cần lấy chứng chỉ SSL cho tên miền của mình. Let's Encrypt cung cấp chứng chỉ miễn phí, hoặc bạn có thể dùng reverse proxy như Caddy Server để tự động cấp chứng chỉ. Đặt các tệp chứng chỉ trong thư mục mosquitto/config để chúng khả dụng bên trong container.
Lưu bền và ghi log
Lưu bền ghi thông điệp và đăng ký xuống đĩa, còn cấu hình log phù hợp giúp bạn gỡ lỗi vấn đề kết nối.
Bạn có thể cấu hình lưu bền trong mosquitto.conf như sau:
# Enable persistence
persistence true
persistence_location /mosquitto/data/
# Save to disk every 300 seconds
autosave_interval 300# Keep messages for offline clients
persistent_client_expiration 1dĐược hỗ trợ bởi
Về ghi log, bạn có thể thiết lập chi tiết như sau:
# Log to file and stdout
log_dest file /mosquitto/log/mosquitto.log
log_dest stdout
# Choose what to log
log_type error
log_type warning
log_type notice
log_type information
log_type debug
# Log connection details
connection_messages true
log_timestamp trueĐược hỗ trợ bởi
Các tùy chọn log_type cho phép bạn lọc nội dung log:
error và warning cho giám sát production
notice và information cho cái nhìn vận hành chung
debug cho gỡ lỗi vấn đề kết nối
Các volume mount đảm bảo dữ liệu lưu bền và log vẫn tồn tại sau khi container khởi động lại. Thư mục data lưu mọi thông điệp và thông tin đăng ký lưu bền, còn thư mục log giữ thông tin gỡ lỗi truy cập được từ hệ thống host.
Các tệp cấu hình giúp bạn kiểm soát hoàn toàn hành vi của Mosquitto mà không cần dựng lại container.
Kiểm thử thiết lập
Broker của bạn chỉ hữu dụng khi xác minh client có thể kết nối và trao đổi thông điệp.
Dùng mosquitto_pub và mosquitto_sub
Các công cụ dòng lệnh mosquitto_pub và mosquitto_sub là cách nhanh nhất để kiểm thử broker.
Bắt đầu bằng việc cài Mosquitto tùy theo nền tảng của bạn:
Linux (Ubuntu/Debian): sudo apt-get install mosquitto-clients
macOS:brew install mosquitto
Windows: Tải từ trang chính thức Eclipse Mosquitto hoặc dùng WSL
Hãy kiểm thử trước không dùng xác thực. Bạn cần hai cửa sổ hoặc tab terminal. Chạy các lệnh này ở hai phiên khác nhau:
# Subscribe to a topic (run this first)
mosquitto_sub -h localhost -p1883-t test/topic
# Publish a message (run in another terminal)
mosquitto_pub -h localhost -p1883-t test/topic -m"Hello MQTT"Được hỗ trợ bởi
Trong tab publish, bạn sẽ thấy như sau:
Hình 4 - Gửi một thông điệp
Và trong tab subscribe, bạn sẽ thấy thông điệp ngay lập tức:
Hình 5 - Đăng ký một topic của Mosquitto
Nếu bạn yêu cầu xác thực, các lệnh cũng tương tự - chỉ cần truyền tên người dùng và mật khẩu:
# Subscribe with username and password
mosquitto_sub -h localhost -p1883-t test/topic -u username -P password
# Publish with credentials
mosquitto_pub -h localhost -p1883-t test/topic -m"Authenticated message"-u username -P passwordĐược hỗ trợ bởi
Nếu bạn không muốn cài client Mosquitto trên máy cục bộ, hãy chạy chúng bên trong container Docker:
# Subscribe using the containerdockerexec-it mosquitto mosquitto_sub -h localhost -t test/topic
# Publish using the containerdockerexec-it mosquitto mosquitto_pub -h localhost -t test/topic -m"Container message"Được hỗ trợ bởi
Bạn sẽ thấy như sau trong tab publish:
Hình 6 - Gửi thông điệp không có xác thực
Và trong tab subscribe, bạn sẽ thấy thông điệp:
Hình 7 - Đăng ký topic Mosquitto không có xác thực
Kiểm thử với các client MQTT
Client giao diện đồ họa giúp kiểm thử các kịch bản phức tạp và theo dõi luồng thông điệp dễ hơn.
MQTT Explorer cung cấp giao diện gọn gàng để duyệt topic và gửi thông điệp. Kết nối tới localhost:1883 và bạn sẽ thấy dạng cây của mọi topic đang hoạt động. Rất phù hợp để gỡ lỗi luồng thông điệp và hiểu cấu trúc topic.
Hình 8 - Ứng dụng MQTT Explorer
MQTTX cung cấp nhiều tính năng nâng cao như scripting và gửi thông điệp hàng loạt. Cả hai client đều hỗ trợ xác thực, kết nối TLS và giao thức WebSocket.
Người dùng Home Assistant có thể kiểm thử tích hợp MQTT trực tiếp từ công cụ dành cho nhà phát triển. Thêm thông tin broker vào tích hợp MQTT và dùng giao diện publish/subscribe tích hợp sẵn.
Để kiểm thử bằng lập trình, client Paho MQTT cho Python hoạt động rất tốt:
import paho.mqtt.client as mqtt
defon_connect(client, userdata, flags, rc):print(f"Connected with result code {rc}")
client.subscribe("test/topic")defon_message(client, userdata, msg):print(f"Received: {msg.payload.decode()}")
client = mqtt.Client()# client.username_pw_set("username", "password") # If using auth
client.on_connect = on_connect
client.on_message = on_message
client.connect("localhost",1883,60)
client.loop_forever()Được hỗ trợ bởi
Chạy script này ở một terminal, rồi publish thông điệp từ terminal khác hoặc client GUI. Script sẽ in ra mọi thông điệp nhận được, xác nhận broker định tuyến lưu lượng chính xác.
Bạn cần làm như sau để publish một thông điệp:
Hình 9 - Gửi thông điệp cho ví dụ Python
Và bạn sẽ thấy như sau trong phiên terminal đang chạy script Python:
Hình 10 - Nhận thông điệp cho ví dụ Python
Publish và subscribe hoạt động nghĩa là thiết lập Mosquitto Docker của bạn sẵn sàng cho ứng dụng thực tế.
Tích hợp Mosquitto Docker với Home Assistant
Chạy Mosquitto cùng Home Assistant trong Docker tạo nên một trung tâm nhắn tin IoT hoàn chỉnh mà không cần cấu hình mạng rườm rà.
Docker Compose giúp việc này đơn giản. Cả hai dịch vụ có thể giao tiếp qua mạng nội bộ của Docker mà không cần mở thêm cổng hay xử lý địa chỉ IP.
Đây là tệp docker-compose.yml đầy đủ để chạy cả hai dịch vụ:
Phần networks tạo mạng dùng chung để cả hai container có thể gọi nhau theo tên. Home Assistant có thể kết nối đến mosquitto:1883 thay vì dùng localhost hoặc địa chỉ IP.
Tiếp theo, cấu hình tích hợp MQTT qua giao diện web của Home Assistant. Điều hướng tới Settings > Devices & Services > Add Integration, rồi tìm "MQTT".
Nhập các thông tin kết nối sau:
Broker: mosquitto (tên container)
Port: 1883
Username/Password: Thông tin đăng nhập của bạn nếu bật xác thực
Giữ các thiết lập khác mặc định
Nhấn Submit và Home Assistant sẽ kiểm thử kết nối. Nếu thành công, bạn sẽ thấy MQTT xuất hiện trong danh sách tích hợp.
Hình 11 - Cấu hình Mosquitto với Homelab
Giờ bạn có thể thêm thiết bị MQTT, tạo tự động hóa để publish thông điệp, và theo dõi dữ liệu cảm biến qua các topic. Tích hợp MQTT của Home Assistant xử lý tự động khám phá thiết bị với các thiết bị tương thích.
Khắc phục sự cố thường gặp
Đa số vấn đề với Mosquitto trên Docker xuất phát từ phân quyền, cổng hoặc lỗi cấu hình chặn kết nối.
Lỗi phân quyền với volume được mount
Xảy ra khi container không thể ghi vào thư mục trên host. Bạn sẽ thấy lỗi như "Permission denied" hoặc "Cannot create directory" trong log.
Khắc phục bằng cách đặt quyền sở hữu phù hợp cho thư mục:
Điều này gây ra lỗi phân quyền dai dẳng. Container mong đợi chạy với user 1883, nhưng hệ thống host có thể yêu cầu quyền sở hữu khác.
Buộc container chạy với user của bạn:
docker run --user$(id-u):$(id-g) eclipse-mosquitto:latestĐược hỗ trợ bởi
Hoặc điều chỉnh quyền thư mục trên host để khớp với kỳ vọng của container. Cách chạy container theo user của bạn phù hợp cho phát triển, còn sửa quyền trên host phù hợp cho triển khai production.
Kiểm tra log container khi có sự cố - chúng thường cho bạn biết chính xác vấn đề là gì.
Nâng cao: Tính năng Mosquitto Pro Edition
Mosquitto mã nguồn mở đáp ứng phần lớn nhu cầu, nhưng môi trường doanh nghiệp cần các tính năng chỉ có trong Pro Edition.
Quản lý người dùng dựa trên vai trò cho phép bạn định nghĩa quyền chi tiết cho các nhóm người dùng khác nhau. Thay vì quản lý từng người dùng, bạn tạo vai trò như "sensor-readers", "actuator-controllers" hoặc "admin-users" và gán quyền cho cả vai trò. Người dùng thừa hưởng quyền từ vai trò được gán, giúp quản lý truy cập cho hàng trăm hay hàng nghìn thiết bị dễ dàng hơn.
Bạn có thể hạn chế truy cập theo mẫu topic, dải IP, hoặc khung thời gian. Điều này hiệu quả hơn nhiều so với cấu hình ACL thủ công khi quản lý triển khai IoT phức tạp với yêu cầu bảo mật khác nhau.
Tùy chọn xác thực nâng cao vượt xa kết hợp tên người dùng/mật khẩu đơn giản. Xác thực token JWT tích hợp với các nhà cung cấp định danh hiện có như Auth0, Okta hoặc hệ thống SSO của công ty bạn. Tích hợp LDAP kết nối trực tiếp với Active Directory hoặc các dịch vụ thư mục doanh nghiệp khác.
Giám sát và kiểm tra chuyên sâu mang đến khả năng quan sát theo thời gian thực với luồng thông điệp, mẫu kết nối và hiệu năng broker. Pro Edition có sẵn bảng điều khiển hiển thị client nào tiêu thụ băng thông nhiều nhất, topic nào có tốc độ thông điệp cao nhất và nơi nào hình thành nút thắt cổ chai.
Bạn nhận được số liệu chi tiết về độ trễ thông điệp, độ sâu hàng đợi và mẫu hành vi client. Dữ liệu này giúp tối ưu cấu trúc topic và xác định client có vấn đề trước khi ảnh hưởng toàn hệ thống.
Tích hợp cơ sở dữ liệu và dịch vụ đám mây loại bỏ nhu cầu về ứng dụng bridge tùy chỉnh. Pro Edition có thể tự động chuyển tiếp thông điệp tới PostgreSQL, MongoDB, InfluxDB, AWS IoT Core, Azure IoT Hub hoặc Google Cloud IoT. Bạn định nghĩa quy tắc định tuyến xác định thông điệp nào đi đâu dựa trên mẫu topic, nội dung thông điệp hoặc metadata của client.
Hàng đợi lưu bền xử lý kịch bản lưu lượng lớn nơi lưu bền tiêu chuẩn của Mosquitto là chưa đủ. Pro Edition có thể đệm hàng triệu thông điệp cho client ngoại tuyến và phân phối tải qua nhiều broker. Nó bao gồm quản lý hàng đợi tự động để ngăn cạn kiệt bộ nhớ và duy trì đảm bảo thứ tự thông điệp.
Hỗ trợ clustering cho phép chạy nhiều broker cùng chia sẻ tải thông điệp và cung cấp khả năng chuyển đổi dự phòng. Khi một broker ngừng, client tự động kết nối lại tới phiên bản khỏe mạnh mà không mất thông điệp hay đăng ký.
Pro Edition hợp lý khi bạn cần độ tin cậy cấp doanh nghiệp và tính năng quản trị mà tự xây sẽ tốn hàng tháng.
Ưu và nhược điểm khi dùng Mosquitto trong Docker
Docker giúp triển khai dễ hơn, nhưng không phải giải pháp hoàn hảo cho mọi kịch bản.
Ưu điểm
Tính nhất quán đa nền tảng loại bỏ nhức đầu từ cài đặt theo hệ điều hành. Cùng một lệnh Docker chạy trên Windows, macOS và Linux mà không phải tìm gói cài khác nhau hay xử lý xung đột phụ thuộc. Thiết lập phát triển khớp hoàn toàn với production, đồng nghĩa ít bất ngờ khi triển khai.
Nâng cấp phiên bản đơn giản chỉ bằng đổi image tag. Thay vì gỡ phiên bản cũ và hy vọng nâng cấp không làm hỏng cấu hình, bạn chỉ cần pull image mới và khởi động lại container. Quay lui mất vài giây nếu có trục trặc.
Sao lưu và di chuyển dễ dàng nhờ dùng volume cho dữ liệu. Chép thư mục mosquitto sang máy khác, chạy cùng lệnh Docker, và bạn hoạt động trở lại. Di chuyển giữa nhà cung cấp đám mây hoặc nâng cấp phần cứng chỉ là thao tác sao chép tệp.
Nhược điểm
Docker không chỉ toàn lợi ích.
Vấn đề quyền với volume gây phiền toái trên một số hệ điều hành, đặc biệt khi chuyển đổi giữa host Windows và Linux. Bạn sẽ tốn thời gian sửa quyền sở hữu và xử lý không khớp UID/GID vốn không tồn tại với cài đặt native.
Cần thêm cấu hình cho bảo mật cấp production nghĩa là Docker thêm độ phức tạp thay vì loại bỏ. Bạn phải quản lý chính sách mạng, ngữ cảnh bảo mật container, và mã hóa volume bên cạnh các tính năng bảo mật của chính Mosquitto. Cài đặt native cho phép dùng trực tiếp khung bảo mật sẵn có của hệ điều hành.
Có thể bị giảm hiệu năng trong kịch bản thông lượng cao nơi từng micro giây đều quan trọng. Lớp mạng container và volume mount thêm overhead mà cài đặt native tránh được. Với đa số ứng dụng IoT, khác biệt này không đáng kể, nhưng hệ thống công nghiệp thời gian thực có thể nhận thấy độ trễ.
Docker là lựa chọn tốt khi bạn cần triển khai nhất quán và quản lý dễ dàng trên các môi trường khác nhau.
Kết luận
Chạy Mosquitto trong Docker mang đến một MQTT broker tin cậy, hoạt động nhất quán trên mọi môi trường. Dù bạn đang thử nghiệm thiết bị IoT, xây dựng hệ thống nhà thông minh hay kết nối cảm biến trong phát triển, Docker loại bỏ sự phức tạp khi thiết lập và giúp bạn tập trung vào dự án thực tế.
Nếu bạn có kế hoạch đưa Mosquitto vào production, hãy ghi nhớ:
Bảo mật broker trước khi mở ra internet
Bật xác thực với mosquitto_passwd, cấu hình mã hóa TLS với chứng chỉ phù hợp
Hạn chế truy cập chỉ cho những client cần thiết
Một MQTT broker không bảo mật trở thành cánh cửa mở để kẻ tấn công theo dõi giao tiếp thiết bị hoặc chèn lệnh độc hại.
Với triển khai doanh nghiệp cần tính năng nâng cao như kiểm soát truy cập dựa trên vai trò, clustering, hoặc tích hợp LDAP, Mosquitto Pro Edition cung cấp công cụ quản trị và khả năng mở rộng vượt xa bản mã nguồn mở.
Sự khác biệt giữa chạy Mosquitto native và trong Docker là gì?⌄
Docker mang lại tính nhất quán đa nền tảng và loại bỏ xung đột phụ thuộc thường gặp ở cài đặt native. Thiết lập Mosquitto của bạn hoạt động y hệt trên Windows, macOS và Linux mà không cần tìm gói chuyên biệt cho từng nền tảng. Docker cũng giúp nâng cấp phiên bản và quay lui dễ dàng - chỉ cần đổi image tag và khởi động lại container. Tuy nhiên, cài đặt native có thể cho hiệu năng nhỉnh hơn một chút trong kịch bản thông lượng cao.
Tôi có cần Docker Compose để chạy Mosquitto không, hay có thể dùng lệnh Docker thông thường?⌄
Bạn hoàn toàn có thể chạy Mosquitto bằng các lệnh Docker thông thường với docker run. Docker Compose chỉ giúp quản lý dễ hơn, đặc biệt khi bạn chạy nhiều dịch vụ như Home Assistant hoặc Node-RED cùng Mosquitto. Nếu bạn chỉ chạy mỗi Mosquitto, một lệnh docker run đơn giản là đủ.
Chạy Mosquitto trong Docker có đủ an toàn cho môi trường sản xuất không?⌄
Mosquitto trên Docker có thể sẵn sàng cho production với cấu hình phù hợp. Bạn cần tắt truy cập ẩn danh, thiết lập xác thực với mosquitto_passwd, cấu hình mã hóa TLS, và hạn chế truy cập mạng cho các client tin cậy. Bản thân container không thêm lỗ hổng bảo mật, nhưng bạn chịu trách nhiệm bảo mật cả cấu hình Mosquitto lẫn môi trường Docker.
Vì sao container Mosquitto của tôi khởi chạy nhưng từ chối kết nối từ bên ngoài?⌄
Mosquitto 2.0+ mặc định ở chế độ chỉ cục bộ, chỉ chấp nhận kết nối từ localhost bên trong container. Bạn cần tạo tệp mosquitto.conf với listener 1883 và allow_anonymous true (để thử nghiệm) hoặc thiết lập xác thực phù hợp. Đặt tệp cấu hình này trong thư mục /mosquitto/config đã mount và khởi động lại container.
Làm sao khắc phục lỗi "Permission denied" khi Mosquitto ghi vào volume được mount?⌄
Container Mosquitto chạy với user ID 1883, nhưng thư mục trên host có thể có quyền sở hữu khác. Chạy sudo chown -R 1883:1883 mosquitto/ để sửa quyền sở hữu, hoặc tạo user mosquitto trước với sudo useradd -u 1883 mosquitto rồi đổi quyền sở hữu. Trên một số hệ thống, bạn cũng có thể chạy container với --user $(id -u):$(id -g) để khớp user trên host.
Chuyên gia Khoa học Dữ liệu Cấp cao, làm việc tại Croatia. Tác giả Công nghệ Hàng đầu với hơn 700 bài viết đã xuất bản, đạt trên 10 triệu lượt xem. Tác giả cuốn sách Tự động hóa Machine Learning với TPOT.
Tìm hiểu về Docker và khám phá tầm quan trọng của nó trong bộ công cụ của chuyên gia dữ liệu. Tìm hiểu về Docker container, Docker image và nhiều nội dung khác.
Thiết lập một MQTT broker từ đầu không nên tốn hàng giờ cấu hình và khắc phục sự cố.
Eclipse Mosquitto là một MQTT broker mã nguồn mở hỗ trợ các giao thức MQTT v5, 3.1.1 và 3.1, rất phù hợp cho thiết bị IoT, hệ thống nhà thông minh, ứng dụng đám mây và mọi kiến trúc hướng thông điệp. Nhưng cài đặt và cấu hình Mosquitto trực tiếp trên hệ thống của bạn thường dẫn đến xung đột phụ thuộc, vấn đề phân quyền và các lỗi đặc thù nền tảng làm tốn thời gian phát triển. Cuối cùng bạn dành nhiều thời gian chiến đấu với thiết lập hơn là xây dựng ứng dụng thực sự.
Docker loại bỏ những nhức đầu này bằng cách cung cấp môi trường nhất quán, cách ly để chạy Mosquitto trên mọi nền tảng. Bạn có thể có một MQTT broker hoạt động đầy đủ chỉ trong vài phút, kèm cấu hình tùy chỉnh, xác thực và lưu bền dữ liệu.
Trong hướng dẫn này, tôi sẽ dẫn bạn triển khai Eclipse Mosquitto bằng Docker và Docker Compose, cấu hình xác thực và ghi log, thiết lập lưu bền dữ liệu, và kiểm thử broker với các client MQTT thực tế.
Bạn hoàn toàn mới với Docker? Tôi khuyên bạn bắt đầu với khóa học Introduction to Docker để nắm vững các kiến thức nền tảng.
Mosquitto là gì và vì sao dùng nó với Docker
Bạn không cần một hệ thống nhắn tin nặng nề khi điều bạn muốn là giao tiếp nhanh, tin cậy giữa các thiết bị.
MQTT là giao thức publish-subscribe gọn nhẹ, thiết kế cho tình huống băng thông hạn chế và độ tin cậy quan trọng. Hãy nghĩ đến cảm biến IoT, ứng dụng di động, hoặc bất kỳ kịch bản nào thiết bị cần trao đổi thông điệp nhỏ nhanh chóng mà không phải polling liên tục.
Mosquitto đóng vai trò trung gian - broker - giữa publisher và subscriber.
Publisher gửi thông điệp đến các topic cụ thể. Subscriber lắng nghe các topic đó. Mosquitto xử lý định tuyến, đảm bảo thông điệp được chuyển đến đúng nơi mà publisher và subscriber không cần biết về nhau.
Đây là lý do Docker khiến thiết lập Mosquitto càng hiệu quả hơn:
Mosquitto có hai phiên bản: bản mã nguồn mở (đáp ứng hầu hết nhu cầu) và Pro Edition thương mại của Cedalo với các tính năng nâng cao như clustering và bảo mật mở rộng. Với đa số dự án, bản mã nguồn mở là đủ.
Tiếp theo, tôi sẽ đi qua các yêu cầu tiên quyết rồi chúng ta sẽ bắt đầu cài đặt Mosquitto.
Yêu cầu tiên quyết
Bạn cần Docker đang chạy trên hệ thống trước khi có thể triển khai Mosquitto.
Docker Desktop phù hợp nhất cho người dùng Windows và macOS vì gói sẵn mọi thứ bạn cần. Người dùng Linux có thể cài đặt Docker CLI trực tiếp qua trình quản lý gói hoặc kho chính thức của Docker.
Docker Compose không bắt buộc, nhưng giúp quản lý các thiết lập nhiều container dễ hơn nhiều. Hầu hết cài đặt Docker Desktop có sẵn Compose mặc định. Nếu bạn dùng Linux, có thể cần cài riêng.
Bạn cũng cần kỹ năng dòng lệnh cơ bản. Không có gì phức tạp, chỉ cần chạy lệnh, di chuyển thư mục và chỉnh sửa tệp văn bản.
Thiết lập từng bước
Chạy Mosquitto trên Docker gồm ba bước: tạo thư mục, chạy container và (tùy chọn) thiết lập Docker Compose để quản lý dễ hơn.
Tạo các thư mục cần thiết
Mosquitto cần không gian lưu trữ có tổ chức cho cấu hình, dữ liệu và log.
Tạo các thư mục này để bắt đầu:
Việc này giúp bạn có các thư mục gọn gàng cho tệp cấu hình của Mosquitto, dữ liệu lưu bền và đầu ra log.
Chức năng của từng thư mục:
/mosquitto/configlưumosquitto.confvà mọi tệp cấu hình bổ sung/mosquitto/datachứa dữ liệu thông điệp lưu bền và thông tin đăng ký/mosquitto/logchứa tệp log của Mosquitto để gỡ lỗi và giám sátCác thư mục này sẽ được mount làm volume trong container Docker, nên cài đặt và dữ liệu của bạn vẫn còn sau khi khởi động lại container.
Chạy Mosquitto với Docker
Lệnh Docker cơ bản sẽ khởi chạy Mosquitto với ánh xạ cổng và mount volume thích hợp.
Hình 1 - Chạy Mosquitto với Docker
Giải thích các flag:
-dchạy container ở chế độ nền (detached)--name mosquittođặt tên thân thiện cho container để tham chiếu dễ dàng-p 1883:1883ánh xạ cổng 1883 trên host tới cổng 1883 trong container-vmount các thư mục cục bộ làm volume trong containerMosquitto 2.0+ mặc định chạy ở chế độ chỉ cục bộ. Nghĩa là nó chỉ chấp nhận kết nối từ localhost trừ khi bạn cấu hình khác đi. Bạn cần tạo tệp cấu hình để cho phép kết nối từ bên ngoài.
Dùng Docker Compose
Docker Compose cho Mosquitto giúp quản lý cài đặt đơn giản hơn nhiều, đặc biệt khi bạn chạy nhiều dịch vụ.
Tạo tệp
docker-compose.ymlvà dán nội dung sau:Khởi động với:
Hình 2 - Chạy Mosquitto với Docker Compose
Việc ánh xạ volume hoạt động giống như lệnh Docker, nhưng Compose xử lý phần phức tạp. Cấu hình cổng bao phủ mọi giao thức MQTT phổ biến: MQTT chuẩn (1883), MQTTS an toàn (8883), và kết nối WebSocket (9001).
Compose thực sự tỏa sáng với thiết lập nhiều dịch vụ. Ví dụ, nếu bạn chạy Home Assistant, Node-RED hoặc công cụ IoT khác cùng Mosquitto, bạn có thể định nghĩa tất cả trong một tệp và khởi động đồng thời.
Tiếp theo, chúng ta đi sâu hơn vào phần cấu hình.
Bạn thấy các khái niệm Docker nâng cao gây rối? Khóa học Intermediate Docker của chúng tôi vượt xa phần nền tảng.
Cấu hình Mosquitto
Mosquitto sẽ không chấp nhận kết nối ngoài ngay từ đầu, bạn cần tệp cấu hình để làm điều đó.
Cấu hình cơ bản (mosquitto.conf)
Tạo tệp
mosquitto.conftrong thư mụcmosquitto/configcủa bạn và thêm nội dung sau:Thiết lập
allow_anonymous truecho phép client kết nối không cần thông tin đăng nhập. Thiết lập này ổn cho môi trường phát triển hoặc mạng nội bộ, nhưng bạn nên tắt trong môi trường sản xuất. Khi đặtallow_anonymous false, mọi client phải xác thực bằng tên người dùng và mật khẩu.Listener WebSocket trên cổng 9001 cho phép client MQTT dựa trên trình duyệt. Ứng dụng web có thể kết nối trực tiếp tới broker bằng thư viện JavaScript như Paho MQTT.
Thiết lập xác thực
Xác thực yêu cầu tạo tệp mật khẩu và cập nhật cấu hình.
Tạo tệp mật khẩu bên trong container:
Hình 3 - Xác thực Mosquitto
Lệnh này tạo tệp mật khẩu mới và nhắc bạn nhập mật khẩu. Với người dùng bổ sung, bỏ cờ
-c:Giờ hãy cập nhật
mosquitto.confđể buộc xác thực:Tệp mật khẩu được lưu trong volume cấu hình đã mount, nên vẫn còn sau khi container khởi động lại.
Bật TLS/SSL
Mã hóa TLS bảo vệ lưu lượng MQTT của bạn khỏi nghe lén và giả mạo.
Thêm các dòng này vào
mosquitto.conf:Bạn sẽ cần lấy chứng chỉ SSL cho tên miền của mình. Let's Encrypt cung cấp chứng chỉ miễn phí, hoặc bạn có thể dùng reverse proxy như Caddy Server để tự động cấp chứng chỉ. Đặt các tệp chứng chỉ trong thư mục
mosquitto/configđể chúng khả dụng bên trong container.Lưu bền và ghi log
Lưu bền ghi thông điệp và đăng ký xuống đĩa, còn cấu hình log phù hợp giúp bạn gỡ lỗi vấn đề kết nối.
Bạn có thể cấu hình lưu bền trong
mosquitto.confnhư sau:Về ghi log, bạn có thể thiết lập chi tiết như sau:
Các tùy chọn
log_typecho phép bạn lọc nội dung log:errorvàwarningcho giám sát productionnoticevàinformationcho cái nhìn vận hành chungdebugcho gỡ lỗi vấn đề kết nốiCác volume mount đảm bảo dữ liệu lưu bền và log vẫn tồn tại sau khi container khởi động lại. Thư mục data lưu mọi thông điệp và thông tin đăng ký lưu bền, còn thư mục log giữ thông tin gỡ lỗi truy cập được từ hệ thống host.
Các tệp cấu hình giúp bạn kiểm soát hoàn toàn hành vi của Mosquitto mà không cần dựng lại container.
Kiểm thử thiết lập
Broker của bạn chỉ hữu dụng khi xác minh client có thể kết nối và trao đổi thông điệp.
Dùng mosquitto_pub và mosquitto_sub
Các công cụ dòng lệnh
mosquitto_pubvàmosquitto_sublà cách nhanh nhất để kiểm thử broker.Bắt đầu bằng việc cài Mosquitto tùy theo nền tảng của bạn:
sudo apt-get install mosquitto-clientsbrew install mosquittoHãy kiểm thử trước không dùng xác thực. Bạn cần hai cửa sổ hoặc tab terminal. Chạy các lệnh này ở hai phiên khác nhau:
Trong tab publish, bạn sẽ thấy như sau:
Hình 4 - Gửi một thông điệp
Và trong tab subscribe, bạn sẽ thấy thông điệp ngay lập tức:
Hình 5 - Đăng ký một topic của Mosquitto
Nếu bạn yêu cầu xác thực, các lệnh cũng tương tự - chỉ cần truyền tên người dùng và mật khẩu:
Nếu bạn không muốn cài client Mosquitto trên máy cục bộ, hãy chạy chúng bên trong container Docker:
Bạn sẽ thấy như sau trong tab publish:
Hình 6 - Gửi thông điệp không có xác thực
Và trong tab subscribe, bạn sẽ thấy thông điệp:
Hình 7 - Đăng ký topic Mosquitto không có xác thực
Kiểm thử với các client MQTT
Client giao diện đồ họa giúp kiểm thử các kịch bản phức tạp và theo dõi luồng thông điệp dễ hơn.
MQTT Explorer cung cấp giao diện gọn gàng để duyệt topic và gửi thông điệp. Kết nối tới
localhost:1883và bạn sẽ thấy dạng cây của mọi topic đang hoạt động. Rất phù hợp để gỡ lỗi luồng thông điệp và hiểu cấu trúc topic.Hình 8 - Ứng dụng MQTT Explorer
MQTTX cung cấp nhiều tính năng nâng cao như scripting và gửi thông điệp hàng loạt. Cả hai client đều hỗ trợ xác thực, kết nối TLS và giao thức WebSocket.
Người dùng Home Assistant có thể kiểm thử tích hợp MQTT trực tiếp từ công cụ dành cho nhà phát triển. Thêm thông tin broker vào tích hợp MQTT và dùng giao diện publish/subscribe tích hợp sẵn.
Để kiểm thử bằng lập trình, client Paho MQTT cho Python hoạt động rất tốt:
Chạy script này ở một terminal, rồi publish thông điệp từ terminal khác hoặc client GUI. Script sẽ in ra mọi thông điệp nhận được, xác nhận broker định tuyến lưu lượng chính xác.
Bạn cần làm như sau để publish một thông điệp:
Hình 9 - Gửi thông điệp cho ví dụ Python
Và bạn sẽ thấy như sau trong phiên terminal đang chạy script Python:
Hình 10 - Nhận thông điệp cho ví dụ Python
Publish và subscribe hoạt động nghĩa là thiết lập Mosquitto Docker của bạn sẵn sàng cho ứng dụng thực tế.
Tích hợp Mosquitto Docker với Home Assistant
Chạy Mosquitto cùng Home Assistant trong Docker tạo nên một trung tâm nhắn tin IoT hoàn chỉnh mà không cần cấu hình mạng rườm rà.
Docker Compose giúp việc này đơn giản. Cả hai dịch vụ có thể giao tiếp qua mạng nội bộ của Docker mà không cần mở thêm cổng hay xử lý địa chỉ IP.
Đây là tệp
docker-compose.ymlđầy đủ để chạy cả hai dịch vụ:Phần
networkstạo mạng dùng chung để cả hai container có thể gọi nhau theo tên. Home Assistant có thể kết nối đếnmosquitto:1883thay vì dùng localhost hoặc địa chỉ IP.Khởi động cả hai dịch vụ với:
Tiếp theo, cấu hình tích hợp MQTT qua giao diện web của Home Assistant. Điều hướng tới Settings > Devices & Services > Add Integration, rồi tìm "MQTT".
Nhập các thông tin kết nối sau:
mosquitto(tên container)1883Nhấn Submit và Home Assistant sẽ kiểm thử kết nối. Nếu thành công, bạn sẽ thấy MQTT xuất hiện trong danh sách tích hợp.
Hình 11 - Cấu hình Mosquitto với Homelab
Giờ bạn có thể thêm thiết bị MQTT, tạo tự động hóa để publish thông điệp, và theo dõi dữ liệu cảm biến qua các topic. Tích hợp MQTT của Home Assistant xử lý tự động khám phá thiết bị với các thiết bị tương thích.
Khắc phục sự cố thường gặp
Đa số vấn đề với Mosquitto trên Docker xuất phát từ phân quyền, cổng hoặc lỗi cấu hình chặn kết nối.
Lỗi phân quyền với volume được mount
Xảy ra khi container không thể ghi vào thư mục trên host. Bạn sẽ thấy lỗi như "Permission denied" hoặc "Cannot create directory" trong log.
Khắc phục bằng cách đặt quyền sở hữu phù hợp cho thư mục:
Container Mosquitto chạy với user ID 1883, nên thư mục trên host cần khớp. Trên một số hệ thống, bạn có thể cần tạo user trước:
Xung đột cổng
Xảy ra khi có dịch vụ khác dùng cổng 1883. Kiểm tra dịch vụ đang chạy trên cổng đó:
Nếu dịch vụ khác đang dùng cổng, hãy dừng nó hoặc ánh xạ Mosquitto sang cổng khác:
Chế độ chỉ cục bộ ngăn kết nối bên ngoài
Điều này xảy ra ngay cả khi container đang chạy. Mosquitto 2.0+ mặc định chỉ chấp nhận kết nối từ localhost trừ khi bạn cấu hình khác đi.
Tạo tệp
mosquitto.confcơ bản để cho phép kết nối bên ngoài:Đặt tệp này trong thư mục
mosquitto/configvà khởi động lại container.Thư mục rỗng khi khởi động
Điều này nghĩa là volume mount không hoạt động đúng. Kiểm tra đường dẫn là tuyệt đối và thư mục tồn tại:
Tạo thư mục trước khi khởi động container:
Xung đột UID/GID giữa host và container
Điều này gây ra lỗi phân quyền dai dẳng. Container mong đợi chạy với user 1883, nhưng hệ thống host có thể yêu cầu quyền sở hữu khác.
Buộc container chạy với user của bạn:
Hoặc điều chỉnh quyền thư mục trên host để khớp với kỳ vọng của container. Cách chạy container theo user của bạn phù hợp cho phát triển, còn sửa quyền trên host phù hợp cho triển khai production.
Kiểm tra log container khi có sự cố - chúng thường cho bạn biết chính xác vấn đề là gì.
Nâng cao: Tính năng Mosquitto Pro Edition
Mosquitto mã nguồn mở đáp ứng phần lớn nhu cầu, nhưng môi trường doanh nghiệp cần các tính năng chỉ có trong Pro Edition.
Quản lý người dùng dựa trên vai trò cho phép bạn định nghĩa quyền chi tiết cho các nhóm người dùng khác nhau. Thay vì quản lý từng người dùng, bạn tạo vai trò như "sensor-readers", "actuator-controllers" hoặc "admin-users" và gán quyền cho cả vai trò. Người dùng thừa hưởng quyền từ vai trò được gán, giúp quản lý truy cập cho hàng trăm hay hàng nghìn thiết bị dễ dàng hơn.
Bạn có thể hạn chế truy cập theo mẫu topic, dải IP, hoặc khung thời gian. Điều này hiệu quả hơn nhiều so với cấu hình ACL thủ công khi quản lý triển khai IoT phức tạp với yêu cầu bảo mật khác nhau.
Tùy chọn xác thực nâng cao vượt xa kết hợp tên người dùng/mật khẩu đơn giản. Xác thực token JWT tích hợp với các nhà cung cấp định danh hiện có như Auth0, Okta hoặc hệ thống SSO của công ty bạn. Tích hợp LDAP kết nối trực tiếp với Active Directory hoặc các dịch vụ thư mục doanh nghiệp khác.
Giám sát và kiểm tra chuyên sâu mang đến khả năng quan sát theo thời gian thực với luồng thông điệp, mẫu kết nối và hiệu năng broker. Pro Edition có sẵn bảng điều khiển hiển thị client nào tiêu thụ băng thông nhiều nhất, topic nào có tốc độ thông điệp cao nhất và nơi nào hình thành nút thắt cổ chai.
Bạn nhận được số liệu chi tiết về độ trễ thông điệp, độ sâu hàng đợi và mẫu hành vi client. Dữ liệu này giúp tối ưu cấu trúc topic và xác định client có vấn đề trước khi ảnh hưởng toàn hệ thống.
Tích hợp cơ sở dữ liệu và dịch vụ đám mây loại bỏ nhu cầu về ứng dụng bridge tùy chỉnh. Pro Edition có thể tự động chuyển tiếp thông điệp tới PostgreSQL, MongoDB, InfluxDB, AWS IoT Core, Azure IoT Hub hoặc Google Cloud IoT. Bạn định nghĩa quy tắc định tuyến xác định thông điệp nào đi đâu dựa trên mẫu topic, nội dung thông điệp hoặc metadata của client.
Hàng đợi lưu bền xử lý kịch bản lưu lượng lớn nơi lưu bền tiêu chuẩn của Mosquitto là chưa đủ. Pro Edition có thể đệm hàng triệu thông điệp cho client ngoại tuyến và phân phối tải qua nhiều broker. Nó bao gồm quản lý hàng đợi tự động để ngăn cạn kiệt bộ nhớ và duy trì đảm bảo thứ tự thông điệp.
Hỗ trợ clustering cho phép chạy nhiều broker cùng chia sẻ tải thông điệp và cung cấp khả năng chuyển đổi dự phòng. Khi một broker ngừng, client tự động kết nối lại tới phiên bản khỏe mạnh mà không mất thông điệp hay đăng ký.
Pro Edition hợp lý khi bạn cần độ tin cậy cấp doanh nghiệp và tính năng quản trị mà tự xây sẽ tốn hàng tháng.
Ưu và nhược điểm khi dùng Mosquitto trong Docker
Docker giúp triển khai dễ hơn, nhưng không phải giải pháp hoàn hảo cho mọi kịch bản.
Ưu điểm
mosquittosang máy khác, chạy cùng lệnh Docker, và bạn hoạt động trở lại. Di chuyển giữa nhà cung cấp đám mây hoặc nâng cấp phần cứng chỉ là thao tác sao chép tệp.Nhược điểm
Docker không chỉ toàn lợi ích.
Docker là lựa chọn tốt khi bạn cần triển khai nhất quán và quản lý dễ dàng trên các môi trường khác nhau.
Kết luận
Chạy Mosquitto trong Docker mang đến một MQTT broker tin cậy, hoạt động nhất quán trên mọi môi trường. Dù bạn đang thử nghiệm thiết bị IoT, xây dựng hệ thống nhà thông minh hay kết nối cảm biến trong phát triển, Docker loại bỏ sự phức tạp khi thiết lập và giúp bạn tập trung vào dự án thực tế.
Nếu bạn có kế hoạch đưa Mosquitto vào production, hãy ghi nhớ:
mosquitto_passwd, cấu hình mã hóa TLS với chứng chỉ phù hợpMột MQTT broker không bảo mật trở thành cánh cửa mở để kẻ tấn công theo dõi giao tiếp thiết bị hoặc chèn lệnh độc hại.
Với triển khai doanh nghiệp cần tính năng nâng cao như kiểm soát truy cập dựa trên vai trò, clustering, hoặc tích hợp LDAP, Mosquitto Pro Edition cung cấp công cụ quản trị và khả năng mở rộng vượt xa bản mã nguồn mở.
Sẵn sàng nâng tầm kỹ năng Docker và Kubernetes? Hãy đăng ký Containerization and Virtualization with Docker and Kubernetes để xây dựng kỹ năng phù hợp và ghi điểm tuyển dụng.