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
Hướng Dẫn Cài Đặt GitLab Runner Với Docker Cho Người Mới
Hướng dẫn từng bước cách cài đặt và cấu hình GitLab Runner bằng Docker trên máy chủ (EC2/VPS). Giải pháp hoàn hảo giúp tự động hóa quy trình CI/CD dễ hiểu cho cả người không chuyên kỹ thuật.
Script tự động xoá Image không gắn Tag (Untagged) trên Amazon ECR
Vấn đề tràn lưu trữ ECR do các Docker Image cũ không gắn tag (untagged). Bài viết chia sẻ Bash Script giúp tự động dọn dẹp hàng loạt Image untagged trên Amazon ECR.
Script cài đặt nhanh Docker và Docker Compose trên Ubuntu
Bài viết này chia sẻ mọi người một script tự động cài đặt Docker và Docker Compose trên Ubuntu (18.04, 20.04, 22.04) giúp bạn tiết kiệm thời gian.