Cài đặt Nginx Reverse Proxy sử dụng Docker
Hướng dẫn chi tiết cách cài đặt hệ thống Nginx Reverse Proxy bằng Docker và Docker Compose kết hợp với Let's Encrypt.
Để triển khai nhiều ứng dụng trên Docker ngoài việc mapping port hoặc expose ra bên ngoài thì chúng ta còn cách khác để triển khai đó là tạo một Reverse Proxy Nginx.
Bài viết này mình chia sẻ với các bạn làm thế nào để cài đặt một hệ thống Nginx Reverse Proxy sử dụng Docker một cách tự động, kết hợp bảo mật SSL miễn phí.
1. Yêu cầu chuẩn bị
Máy ảo/VPS sử dụng hệ điều hành Ubuntu/Debian/CentOS. Bạn nào mới bắt đầu thì có thể đăng kí một tài khoản trên DigitalOcean. Hiện tại có chương trình khuyến mãi tặng $200 dùng trong 60 ngày cho khách mới lần đầu đăng kí.
1.1 Cài đặt Docker
Đầu tiên anh em truy cập SSH vào server và cài đặt Docker bằng các câu lệnh sau:
sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common -y
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
apt-cache policy docker-ce
sudo apt install docker-ce -y
sudo systemctl status docker
# Cấp quyền chạy docker cho user hiện tại
sudo usermod -aG docker ${USER}
su - ${USER}
(Lưu ý: Có thể thay username bằng tên user bạn đang dùng nếu bạn không chạy bằng root)
1.2 Cài đặt Docker Compose
Tiếp theo, cài đặt Docker Compose để hỗ trợ khởi chạy tệp cấu hình .yml.
sudo curl -L "https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
2. Cài đặt Nginx Reverse Proxy
Tạo thư mục chứa file cấu hình cài đặt:
mkdir reverse-proxy && cd reverse-proxy
Tạo một mạng lưới (network) chung cho proxy và các ứng dụng giao tiếp:
docker network create net
Tạo file docker-compose.yml cấu hình Nginx Reverse Proxy:
nano docker-compose.yml
Dán cấu hình dưới đây vào:
version: "3.7"
services:
reverse-proxy:
image: "jwilder/nginx-proxy:latest"
container_name: "reverse-proxy"
volumes:
- "html:/usr/share/nginx/html"
- "dhparam:/etc/nginx/dhparam"
- "vhost:/etc/nginx/vhost.d"
- "certs:/etc/nginx/certs"
- "/run/docker.sock:/tmp/docker.sock:ro"
restart: "always"
networks:
- "net"
ports:
- "80:80"
- "443:443"
letsencrypt:
image: "jrcs/letsencrypt-nginx-proxy-companion:latest"
container_name: "letsencrypt-helper"
volumes:
- "html:/usr/share/nginx/html"
- "dhparam:/etc/nginx/dhparam"
- "vhost:/etc/nginx/vhost.d"
- "certs:/etc/nginx/certs"
- "/run/docker.sock:/var/run/docker.sock:ro"
environment:
NGINX_PROXY_CONTAINER: "reverse-proxy"
DEFAULT_EMAIL: "[email protected]"
restart: "always"
depends_on:
- "reverse-proxy"
networks:
- "net"
volumes:
certs:
html:
vhost:
dhparam:
networks:
net:
external: true
Khởi chạy hệ thống Reverse Proxy:
docker-compose up -d
Thử nghiệm với ứng dụng Nginx Dummy
Sau khi Proxy đã chạy, hãy thử test một ứng dụng nginx-dummy để xem việc điều hướng có thành công không bằng lệnh sau:
docker run --rm --name nginx-dummy -e VIRTUAL_HOST=nginx-dummy.kienletv.com -e LETSENCRYPT_HOST=nginx-dummy.kienletv.com -e VIRTUAL_PORT=80 --network net -d nginx:latest
Trong đó:
VIRTUAL_HOST: Khai báo tên host hoặc domain để Nginx điều hướng traffic vào.LETSENCRYPT_HOST: Khai báo tên domain để hệ thống Let’s Encrypt tự động cấp phát chứng chỉ SSL (HTTPS).VIRTUAL_PORT: Cổng ứng dụng nội bộ (Nginx mặc định là cổng 80).
Sau khi test xong, để xóa container tạm này:
docker stop nginx-dummy
3. Triển khai ứng dụng khác (Nextcloud)
Bây giờ hệ thống Proxy đã sẵn sàng. Ở đây mình ví dụ triển khai ứng dụng Nextcloud lần lượt cho 2 container với 2 domain khác nhau: nextcloud0.kienletv.com và nextcloud1.kienletv.com.
Chạy ứng dụng thứ 1:
docker run --name nextcloud1 --network net -e VIRTUAL_HOST="nextcloud0.kienletv.com" -e LETSENCRYPT_HOST="nextcloud0.kienletv.com" -d nextcloud:19.0.2
Chạy ứng dụng thứ 2:
docker run --name nextcloud2 --network net -e VIRTUAL_HOST="nextcloud1.kienletv.com" -e LETSENCRYPT_HOST="nextcloud1.kienletv.com" -d nextcloud:19.0.2
Hãy trỏ bản ghi DNS của 2 Domain trên về IP máy chủ của bạn và truy cập thử. Nginx Proxy sẽ tự động bắt request, cấp chứng chỉ SSL và điều hướng vào đúng Container mong muốn!
Anh em có thể triển khai thêm hàng chục ứng dụng khác chung trên một máy chủ chỉ bằng cách ném chúng vào mạng --network net và cấu hình 2 biến VIRTUAL_HOST, LETSENCRYPT_HOST. Chúc các bạn thành công!
4. Nguồn tham khảo
Một số nguồn tham khảo khác anh em đọc thêm:
- Docker Nginx Reverse Proxy (PhoenixNAP)
- jwilder/nginx-proxy (Docker Hub)
- Hướng dẫn cấu hình Nginx Reverse Proxy Docker (Linux Handbook)
5. Video hướng dẫn
Bình luận
Bài viết liên quan
Quản lý Docker toàn diện chỉ với Arcane UI
Khám phá Arcane UI, một công cụ giao diện trực quan và hiện đại giúp bạn quản lý Docker và Docker Compose một cách dễ dàng.
Hướng dẫn cài đặt Caddy Reverse Proxy cực kỳ nhẹ và dễ sử dụng
Caddy Server là gì? Hướng dẫn chi tiết cách cài đặt Caddy bằng Docker và cấu hình Caddy làm Reverse Proxy tự động cấp phát SSL miễn phí cực kỳ dễ dàng.
Hướng dẫn cài đặt và sử dụng Rancher toàn tập cho người mới
Rancher là gì? Hướng dẫn chi tiết cách cài đặt và sử dụng Rancher bằng Docker Compose để quản lý các cluster Kubernetes một cách hiệu quả và trực quan nhất.