Tự động proxy các Docker Container

Reverse proxy là một server thường được đặt trước các web server khác giúp cung cấp các chức năng mà tự các web server đó không thể tự cung cấp được.

Chẳng hạn, reverse proxy có thể đóng vai trò làm điểm ngắt SSL (SSL Termination)…

https://avinetworks.com/glossary/ssl-termination/

…hay cân bằng tải, điều hướng request, đệm, nén, hay thậm chí A/B test.

https://www.sidneyw.com/go-reverse-proxy/

Reverse proxy rất hữu dụng khi sử dụng kèm với các docker container để đơn giản hóa quá trình deployment.

Sao lại thế?

Các docker containers được gắn các IP và port một cách ngẫu nhiên, khiến việc định vị để truy cập chúng khá khốn nạn. Một cách mặc định, các IP và port được ẩn trong máy host và không thể được truy cập từ bên ngoài trừ khi chúng được bind tới máy host. Việc này vô hình chung cũng hủy diệt khả năng deploy phiên bản mới mà không dính downtime, bởi container cũ cần được stop trước khi một phiên bản mới được bật lên.

Reverse proxy có thể giúp gỡ bỏ những vấn đề này, cũng như nâng khả năng đáp ứng của server bởi nó là lời giải tự nhiên cho bài toán deploy không downtime.

Tạo một cấu hình Reverse Proxy

Thiết đặt một reverse proxy cần có bảng cấu hình, và tạo cấu hình đó là khá rắc rối, bởi các container thường liên tục bật lên và tắt đi, thế là các cấu hình liên tục cần cập nhật, và cập nhật cấu hình bằng tay luôn đồng nghĩa với bug lòi mắt.

May mắn, Docker cung cấp một API để xét lục các container và tìm hiểu IP, port cùng các metadata khác của chúng. Bên cạnh đó, Docker cũng cung cấp một API nghe event theo thời gian thực, thứ có thể được sử dụng để đánh notify khi container được bật hay tắt. Những khả năng đó là tiền để tạo lập cấu hình reverse proxy một cách tự động.

Docker Gen là một công cụ nhỏ sử dụng những API và trích xuất metadata của các container thành các template. Các template sau đó có thể được render và đồng thời ném ra các command mà có thể được dùng để khởi động lại service. Với công cụ này, chúng ta có thể tạo ra các cấu hình tự đọng cho nginx cũng như khởi động lại nó mỗi khi tập container có thay đổi. Kịch bản tương tự đã được sử dụng trong docker log management.

Nginx Reverse Proxy cho tập Docker Container

Kho thư viện của Golang có một template engine có thể giúp tạo ra các cấu hình cho reverse proxy, ta có thể mang reverse proxy đó vào trong một docker container, chạy như một service để phân luồng. Ta có thể sử dụng chức năng groupBy của template engine để nhóm các containers đang chạy bằng biến môi trường VIRTUAL_HOST của chúng, nếu duyệt qua tất cả các container trong cùng một nhóm, ta dễ dàng thực hiện được thao tác cân bằng tải cũng như deploy không chết site.

Phương án đó hoàn toàn có thể mang ốp vào docker gen. Cho chạy render template mỗi khi có event. Thực tế nó đã được triển khai rồi.

Khi kết hợp với một service khác có khả năng đóng vai trò điểm ngắt SSL, reverse proxy này sẽ có khả năng cung kấp kết nối SSL cho giao tiếp giữa client và các service container, mà service không cần phải làm gì thêm.

https://github.com/JrCs/docker-letsencrypt-nginx-proxy-companion

Kết lại

Tạo một cấu hình cho reverse proxy chạy trong docker container có thể được làm tự động nhờ các API của docker engine và một số templating cơ bản. Khả năng này giúp đơn giản hóa thao tác deploy cũng như tăng khả năng hiệu dụng của dịch vụ. Phương án này triển khai tốt cho các container chạy trên một máy host đơn, để tạo lập cấu hình từ xa cần kết hợp với một bộ phận service discovery nào đó, chẳng hạn docker service discovery.

Tài nguyên khác

Tài liệu tham khảo khác

http://jasonwilder.com/blog/2014/03/25/automated-nginx-reverse-proxy-for-docker/ — nguồn chính của bài viết này

Using Nginx, Confd, and Docker for Zero-Downtime Web Update — Brian Ketelsen

Docker Events — Michael Crosby

Haproxy As A Static Reverse Proxy for Docker Containers — Oskar Hane

Proxy traffic to web application Docker containers with nginx and Let’s Encrypt — Gudjon Jonsson

Một triển khai hoàn chỉnh khác

https://traefik.io

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade