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.

Cài đặt Nginx Reverse Proxy sử dụng Docker

Để 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.comnextcloud1.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:

5. Video hướng dẫn

Bình luận

Bài viết liên quan