Nhiệm vụ: Khắc phục định tuyến mạng của dự án con thông qua Traefik
Khắc phục định tuyến mạng của dự án con thông qua Traefik
Tự động kết nối dự án đang chạy với mạng Traefik chung mà không cần thao tác Docker thủ công.
Bối cảnh
Thí điểm của một dự án tùy ý đã xác nhận sơ đồ Narasim → DinD bên ngoài → Docker Compose bên trong → ứng dụng. Hiện tại, buildAndRunProject không tự động kết nối container bên ngoài với mạng Traefik. Khi có đồng thời cả bridge và docker_default, Traefik đã chọn sai IP; để chạy được, cần phải kết nối thủ công docker_default, ngắt kết nối bridge và khởi động lại container.
Những việc cần xử lý
- Biến mạng Traefik thành một phần trong quy trình khởi động chuẩn của dự án.
- Loại bỏ việc lựa chọn IP mơ hồ khi có nhiều mạng Docker.
- Xác định hợp đồng định tuyến tối thiểu: tên miền/host, cổng HTTP bên trong, tên router/service độc đáo, điểm vào/TLS.
- Không yêu cầu công khai host-port riêng cho từng dự án.
- Kiểm tra việc chạy đồng thời nhiều dự án con.
- Kiểm tra xem giải pháp hoạt động đồng nhất ở máy cục bộ và trên máy chủ đích.
Tiêu chí
Dự án Docker Compose mới được khởi động thông qua API, tự động có sẵn thông qua Traefik theo host/domain được chỉ định và không yêu cầu docker network connect/disconnect thủ công hoặc host-port riêng lẻ.
Ворклоги
2026-09-27 — Chuyển tiếp lưu lượng truy cập trong DinD qua Traefik
Đã kiểm tra và hoàn thiện việc định tuyến đến dự án con được chạy thông qua Docker Compose bên trong DinD.
Kết quả
Chuỗi hoạt động: Traefik bên ngoài → DinD:2015 → socat → Traefik bên trong:80 → app:3000. Dự án nextjs-test đã truy cập thành công qua http://nextjs-test.localhost:2015/.
socat và bash đã được thêm vào Dockerfile của dự án con, đồng thời Traefik bên ngoài được cấu hình trỏ tới cổng 2015 của container DinD. Sau khi khởi động Compose, socat sẽ chuyển tiếp cổng này sang Traefik bên trong.
Quản lý mạng Docker
Ban đầu, việc kết nối DinD với docker_default được thêm trực tiếp vào buildAndRunProject, nhưng đã quyết định không giữ lại phần cứng mã hóa (hardcode) này. Mạng cần được quản lý một cách minh bạch thông qua API.
Đã thêm:
- Kiểu
DockerContainerNetwork(name,networkID,ipAddress,gateway,macAddress); - Trường lười (lazy field)
DockerContainer.networks; - Hàm hỗ trợ
mapContainerNetworks; - Query
containerNetworks; - Mutation
connectContainerToNetwork; - Mutation
disconnectContainerFromNetwork.
Giờ đây, container có thể được kết nối lập trình với mạng của Traefik bên ngoài và ngắt kết nối khỏi mạng đó mà không cần dùng Docker CLI.
Điểm lưu ý phát hiện được
Nếu kết nối container với mạng sau khi tuyến đường (route) đã tồn tại, Traefik bên ngoài có thể tiếp tục sử dụng điểm cuối (endpoint) cũ. Trong bài kiểm tra thực tế, cần phải khởi động lại (restart) Traefik. Điều này cần được tính đến trong vòng đời khởi chạy và định tuyến dự án trong tương lai.