+4

Docker Compose và Traefik: Triển khai nhiều dịch vụ dễ dàng

Thêm một service, sửa nginx. Thêm cái domain, vọc SSL. Deploy xong thì... 404 not found. Là dev chứ đâu phải thầy bói mà đoán sai ở đâu!?

Nhưng rồi Docker ComposeTraefik xuất hiện như combo mì gói + trứng – nhanh, gọn, lẹ. Compose thì gom tụi microservice lại “chung mâm”, Traefik đứng canh cổng như bảo vệ , ai tới là chỉ đường đúng ngay, lại còn cấp SSL chảnh choẹ miễn phí.

Dev sướng, server vui, sếp không la – còn gì tuyệt hơn? 😎

image.png

1. Docker Compose và Traefik

  • Docker Compose là công cụ giúp định nghĩa và quản lý các container thông qua một file cấu hình duy nhất (docker-compose.yml). Điều này giúp giảm thiểu thao tác thủ công, tăng tính nhất quán và dễ dàng mở rộng.
  • Traefik là một reverse proxy hiện đại, được thiết kế để hoạt động tốt với hệ sinh thái container. Điểm mạnh nổi bật của Traefik là khả năng tự động phát hiện các container mới, định tuyến traffic dựa trên label, và tích hợp cấp chứng chỉ HTTPS miễn phí từ Let’s Encrypt – tất cả đều tự động, không cần cấu hình thủ công phức tạp.

2. Tại sao lại là Traefik?

  • Tự động phát hiện dịch vụ: Có khả năng tự động phát hiện các dịch vụ mới được triển khai trong hệ thống mà không cần cấu hình lại thủ công. Điều này giúp giảm thiểu việc quản lý cấu hình khi số lượng dịch vụ tăng lên, đặc biệt trong môi trường container hóa.
  • Cung cấp SSL tự động với Let’s Encrypt: hỗ trợ cấp chứng chỉ SSL tự động miễn phí qua Let’s Encrypt, giúp bảo mật giao tiếp giữa client và server mà không cần bạn phải lo về việc cấu hình SSL thủ công cho từng dịch vụ.
  • Hỗ trợ nhiều loại backends: làm reverse proxy cho nhiều nền tảng khác nhau, từ Docker, Kubernetes đến Mesos hay thậm chí là các dịch vụ cloud như AWS hoặc Azure, giúp việc triển khai trên các môi trường đa dạng trở nên dễ dàng hơn.
  • Dễ dàng cấu hình với Docker và Kubernetes: Do có khả năng tự động phát hiện các container hoặc pods mới, sử dụng labels trong Docker hoặc annotations trong Kubernetes để cấu hình routing mà không cần phải thay đổi cấu hình thủ công.
  • Bảng điều khiển trực quan: cung cấp một dashboard trực quan, giúp bạn dễ dàng theo dõi trạng thái các dịch vụ, log và các routing rules trong thời gian thực, cải thiện khả năng giám sát và xử lý sự cố.
  • Mạnh mẽ và hiệu suất cao: dễ dàng xử lý các yêu cầu HTTP và HTTPS với hiệu suất cao, giúp giảm độ trễ và tăng tốc độ xử lý khi có nhiều dịch vụ và traffic đến.

3. docker-compose.yml file

3.1 Thành phần chính

  • version: Phiên bản Docker Compose mà bạn sử dụng/
  • services: Chứa các dịch vụ (container) cho mỗi thành phần trong project (backend, frontend, database, redis, minio,....)
  • Container: Chưa đựng thành phần, cấu hình của thành phần (backend, frontend, database,...)
  • networks: Định nghĩa các mạng riêng cho các dịch vụ hoặc các service khác nhau liên lạc với nhau. Giúp cho các container truy cập tới nhau bằng tên hoặc ip.
  • volumes: Dùng để chia sẻ dữ liệu giữa các container hoặc giữa container và máy chủ.
  • environment: Các biến môi trường để cấu hình cho container.
  • ....

3.2 docker-compose.yml

version: "3.8"

services:
  traefik:
    image: traefik:v2.10
    command:
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--entrypoints.web.address=:80"
    ports:
      - "80:80"
      - "8080:8080" # Dashboard của Traefik
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"

  node-app:
    image: node:18
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.node.rule=Host(`node.localhost`)"
      - "traefik.http.services.node.loadbalancer.server.port=3000"
    command: >
      sh -c "npm install -g http-server &&
             echo 'Hello from Node + Traefik!' > index.html &&
             http-server -p 3000"
    networks:
      - default
thêm vào /etc/hosts
127.0.0.1 node.localhost

Run:

docker-compose up

4. Cấu hình Traefik tự động routing và cấp HTTPS 🔧

Một trong những điều tuyệt vời nhất khi dùng Traefik là... bạn gần như chẳng cần làm gì nhiều 😎. Chỉ cần gắn vài cái label là Traefik tự động "đánh hơi" được dịch vụ của bạn, gán domain, mở cổng, thậm chí còn chạy đi xin HTTPS về nữa.

🚀 Tự động routing bằng label

labels:
  - "traefik.enable=true"
  - "traefik.http.routers.myapp.rule=Host(`myapp.localhost`)"
  - "traefik.http.services.myapp.loadbalancer.server.port=3000"

Thì ông ấy sẽ:

  • Nhận diện "à, đây là hàng xóm mới",
  • Tự thêm route vào hệ thống,
  • Trỏ đúng cổng nội bộ của container (3000 ở trên),
  • Và bạn có thể truy cập ngay qua http://myapp.localhost.

🎯 Lưu ý: Đừng quên thêm domain ảo vào /etc/hosts hoặc file tương ứng.

🔒 Tự động cấp HTTPS (Let's Encrypt)

Nếu bạn dùng domain thật (VD: myapp.example.com) và server của bạn có public IP, bạn có thể cấu hình Traefik tự động xin chứng chỉ SSL từ Let's Encrypt, miễn phí 100%.

Cấu hình bổ sung trong command của service traefik:

command:
  - "--entrypoints.web.address=:80"
  - "--entrypoints.websecure.address=:443"
  - "--certificatesresolvers.myresolver.acme.httpchallenge=true"
  - "--certificatesresolvers.myresolver.acme.httpchallenge.entrypoint=web"
  - "--certificatesresolvers.myresolver.acme.storage=/data/acme.json"

Traefik sẽ:

  • Gửi yêu cầu đến Let's Encrypt.
  • Tự xác thực qua HTTP challenge.
  • Nhận chứng chỉ về và gắn vào router.
  • Lưu lại để lần sau khỏi xin lại nữa.

🎯 Lưu ý: Cần volume để lưu chứng chỉ:

volumes:
  - "./data:/data"

✅ Kết quả?

  • Không cần tự viết Nginx config.
  • Không cần xin SSL bằng tay rồi copy vào server.
  • Không cần restart mỗi lần thay đổi.
  • Chỉ cần... chạy Docker Compose và đi uống cà phê ☕

5. Traefik Dashboard

Bạn đã bao giờ chạy một mớ container, cấu hình loạn xạ, rồi tự hỏi: “Ủa cái route nào đang hoạt động vậy trời?”.

Thì chào mừng đến với Traefik Dashboard — nơi bạn có thể nhìn thấy tận mắt toàn bộ hệ thống routing của mình, không cần đoán!

🔍 Dashboard có gì hay?

  • Danh sách tất cả các routers, services, và middlewares đang hoạt động.
  • Xem được mỗi service đang lắng nghe ở port nào, domain nào.
  • Biết được request đang đi theo route nào (và có đi đúng không).
  • Cực kỳ hữu ích để debug khi có lỗi 404 hoặc HTTPS không hoạt động.

🛠 Cách bật Dashboard:

command:
  - "--api.dashboard=true"
  - "--api.insecure=true"

👉 --api.insecure=true sẽ mở dashboard ở:

http://localhost:8080/dashboard/

🛡 Một chút cảnh báo:

api.insecure=true chỉ nên dùng trong môi trường phát triển (dev)!

Nếu bạn triển khai lên môi trường thật (production), hãy cấu hình dashboard chạy qua một router có auth hoặc IP whitelist.

Tổng kết

📚 Tài liệu tham khảo

Với Docker Compose và Traefik, việc triển khai nhiều dịch vụ trên cùng một máy chủ trở nên gọn gàng, dễ kiểm soát và tự động hoá đến mức. Hy vọng bài viết giúp bạn hiểu rõ hơn và mạnh dạn áp dụng Traefik vào dự án của mình. 🚀


All rights reserved

Bình luận

Đang tải thêm bình luận...
Avatar
+4
Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí