Tìm hiểu cách thiết lập, cấu hình và tối ưu hóa NGINX trong Docker. Hướng dẫn này bao gồm chạy container, phục vụ nội dung tùy chỉnh, xây dựng image, thiết lập reverse proxy và dùng Docker Compose để triển khai hiệu quả.
Chạy NGINX bên trong container Docker có thể cung cấp một dịch vụ web ổn định trong nhiều môi trường. Bạn có thể đang làm việc trên một trang web cá nhân, một dịch vụ web gọn nhẹ hoặc một dự án phòng lab tại nhà. Docker giúp bạn giữ tính nhất quán trên nhiều máy và cấu hình khác nhau. Cách tiếp cận này cho phép chạy NGINX với ít lo ngại về chi phí quản trị khi chuyển giữa môi trường phát triển và sản xuất. Việc dựa vào Docker để đóng gói đơn giản máy chủ web khá phổ biến, giúp dễ dàng chia sẻ dự án mà không cần các bước thủ công rườm rà.
Bài viết này giải thích cách chạy một image NGINX sẵn có, cách phục vụ nội dung từ máy cục bộ, và cách tự xây dựng image với các tính năng tùy chỉnh. Bài cũng đề cập đến các bước thiết lập reverse proxy, cùng cách sử dụng Docker Compose cho triển khai đa dịch vụ. Cuối cùng, bạn sẽ thấy cách quản lý container chỉ với vài lệnh đơn giản và có cái nhìn chi tiết về cách tích hợp Docker và NGINX cho các tác vụ thực tế.
Docker NGINX nghĩa là chạy máy chủ web NGINX bên trong một container nhẹ. Container Docker giống như các gói nhỏ chứa ứng dụng và mọi phụ thuộc cần thiết.
NGINX là máy chủ web phổ biến nhờ hiệu năng cao, cấu hình đơn giản và khả năng xử lý linh hoạt lưu lượng HTTP. Kết hợp NGINX với Docker rất hấp dẫn vì giữ môi trường nhất quán. Dù bạn triển khai trên macOS, Windows hay Linux, nội dung của container vẫn như nhau. Điều đó có nghĩa là hành vi của nó không đổi, bất kể hệ điều hành máy chủ.
Một image Docker điển hình cho NGINX bao gồm phần mềm máy chủ, cấu hình mặc định và cấu trúc thư mục cho tệp được lưu trữ. Bạn có thể chạy container ngay hoặc điều chỉnh bằng cách ánh xạ các thư mục cụ thể, chỉnh sửa tệp cấu hình, hoặc xây dựng image dựa trên Dockerfile của riêng bạn. Bằng cách đó, bạn có thể thêm module hoặc script tùy chỉnh để điều chỉnh NGINX theo ứng dụng của mình.
Để tìm hiểu thêm về cách container hóa ứng dụng, hãy tham khảo bài hướng dẫn Cách container hóa một ứng dụng bằng Docker. Bài viết đi sâu vào cách container hóa các ứng dụng máy học bằng Docker một cách thân thiện với người mới.
Yêu cầu tiên quyết
Trước khi bắt đầu chạy container NGINX, hãy xác nhận Docker đã được cài đặt. Docker có bộ cài chính thức cho macOS, Windows và nhiều bản phân phối Linux. Tài liệu Docker cung cấp quy trình từng bước cho mỗi hệ điều hành.
Xem khóa học Giới thiệu về Docker của chúng tôi để có hướng dẫn toàn diện về cách bắt đầu với Docker.
Kiểm tra cài đặt với một lệnh nhanh như sau:
docker version
derrickmwiti@Derricks-MacBook-Pro% docker version
Client:
Version: 28.0.1
API version: 1.48
Go version: go1.23.6
Git commit: 068a01e
Built: Wed Feb 2610:38:16 2025
OS/Arch: darwin/arm64
Context: desktop-linux
Server: Docker Desktop 4.39.0 (184744)
Engine:
Version: 28.0.1
API version: 1.48(minimum version 1.24)
Go version: go1.23.6
Git commit: bbd0a17
Built: Wed Feb 2610:40:57 2025
OS/Arch: linux/arm64
Experimental: false
containerd:
Version: 1.7.25
GitCommit: bcc810d6b9066471b0b6fa75f557a15a1cbf31bb
runc:
Version: 1.2.4
GitCommit: v1.2.4-0-g6c52b3f
docker-init:
Version: 0.19.0
GitCommit: de40ad0Được hỗ trợ bởi
Nếu bạn thấy thông tin phiên bản, nghĩa là Docker đã sẵn sàng. Ngoài Docker, bạn cần có kết nối internet để kéo image NGINX từ Docker Hub. Nếu bạn định tạo image của riêng mình, bạn sẽ cần một trình soạn thảo văn bản để viết Dockerfile. Bất kỳ trình soạn thảo nào cũng được, hãy chọn cái bạn thấy thoải mái.
Thiết lập NGINX trong Docker Container
Chạy NGINX từ một image sẵn có thường là cách nhanh nhất. Bạn có thể kéo từ Docker Hub trong vài giây rồi khởi chạy container. Sau đó, bạn sẽ thấy trang mặc định trong trình duyệt. Quy trình ngắn này thường là bước đầu trong nhiều thiết lập máy chủ dựa trên Docker.
Kéo image Docker NGINX
Image NGINX chính thức được công khai trên Docker Hub với tên nginx.
Lệnh này truy cập registry và lấy phiên bản mới nhất. Khi hoàn tất, bạn có thể kiểm tra image đã tồn tại trên máy:
docker images
derrickmwiti@Derricks-MacBook-Pro% docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 124b44bfc9cc 6 weeks ago 280MB
keras-custom-training-container latest <none> 7de0f04013e5 7Được hỗ trợ bởi
Lệnh đó hiển thị danh sách image trong thư viện cục bộ. Bạn sẽ thấy image nginx trong bảng. Điều đó có nghĩa là bạn đã sẵn sàng tạo container từ image này. Khám phá danh sách các image bạn có thể cần cho dự án khoa học dữ liệu trong bài Top 12 Docker Container Images cho Machine Learning và AI.
Chạy container NGINX
Khi image NGINX đã có trên hệ thống, bạn có thể khởi động container với một lệnh duy nhất:
docker run --name mynginx -p8080:80 -d nginx
derrickmwiti@Derricks-MacBook-Pro % docker run --name mynginx -p8080:80 -d nginx
ec44d1a43016e9684b602437b967c0ed8e11c933a8a76b341b68c25168d2af70Được hỗ trợ bởi
Lệnh này làm vài việc. Nó chạy một container tên mynginx ở chế độ nền (nhờ tùy chọn -d). Nó ánh xạ cổng 8080 trên máy chủ của bạn tới cổng 80 bên trong container. Ánh xạ cổng này có nghĩa là bạn có thể truy cập http://localhost:8080 trong trình duyệt và thấy trang mặc định của NGINX. Container sử dụng image nginx đã kéo từ Docker Hub.
Container mới sẽ tiếp tục chạy vì NGINX đang hoạt động. Nếu bạn kiểm tra log bằng:
docker logs mynginx
derrickmwiti@Derricks-MacBook-Pro % docker logs mynginx
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2025/03/20 04:33:10 [notice]1#1: using the "epoll" event method2025/03/20 04:33:10 [notice]1#1: nginx/1.27.42025/03/20 04:33:10 [notice]1#1: built by gcc 12.2.0 (Debian 12.2.0-14) 2025/03/20 04:33:10 [notice]1#1: OS: Linux 6.10.14-linuxkit2025/03/20 04:33:10 [notice]1#1: getrlimit(RLIMIT_NOFILE): 1048576:10485762025/03/20 04:33:10 [notice]1#1: start worker processes2025/03/20 04:3Được hỗ trợ bởi
Bạn có thể xem các thông báo mà NGINX ghi ra.
Phục vụ nội dung tùy chỉnh với NGINX
Bạn có thể muốn phục vụ một trang HTML thay vì trang mặc định đi kèm image. Bạn có thể tạo một tệp đơn giản trên máy cục bộ rồi mount vào container. Cách này giữ nội dung của bạn tách biệt với container. Bất cứ khi nào chỉnh sửa trang, bạn chỉ cần tải lại trình duyệt để thấy thay đổi.
Tạo trang HTML tùy chỉnh
Chọn một vị trí thuận tiện trên máy của bạn. Ví dụ một thư mục tên html_content trong thư mục Home. Tạo tệp index.html tại đó. Nội dung có thể như sau:
<html><head><title>My NGINX Page</title></head><body><h1>Hello from my Docker NGINX setup!</h1><p>This is a custom page served from a local folder.</p></body></html>Được hỗ trợ bởi
Đó là một trang HTML cơ bản. Bạn có thể đặt bất kỳ văn bản hay kiểu dáng nào bạn muốn. Thêm hình ảnh hoặc JavaScript hay bất cứ thứ gì phù hợp nhu cầu.
Mount trang HTML vào container NGINX
Image NGINX chính thức mặc định phục vụ nội dung từ /usr/share/nginx/html. Bạn có thể ánh xạ thư mục cục bộ của mình tới vị trí đó trong container. Thao tác này được thực hiện với cờ -v (volume) trong Docker. Dừng bất kỳ container tên mynginx đang chạy để tránh xung đột cổng:
docker run --name mynginx -p8080:80 -d\-v /Users/derrickmwiti/Documents/html_content:/usr/share/nginx/html \
nginx
6f68085733eeac418c3302e5c580a4f7c5c0c36d3591d8e2a7f35f69f6308d18Được hỗ trợ bởi
Thay /path/to/html_content bằng đường dẫn thực tế trên máy bạn. Bằng cách này, mỗi khi bạn truy cập http://localhost:8080, container sẽ phục vụ tệp HTML bạn đặt trong html_content. Theo mặc định, nếu bạn đặt tên là index.html, NGINX sẽ tự động tải tệp đó.
Cách này hữu ích khi bạn muốn thường xuyên điều chỉnh nội dung. Bạn không cần rebuild container mỗi lần. Máy chủ sẽ đọc nội dung từ thư mục cục bộ của bạn theo thời gian thực.
Nếu gặp cảnh báo liên quan đến quyền, bạn có thể cần đảm bảo người dùng cục bộ và Docker có thể đọc thư mục đó.
Trên Linux, điều đó có thể là điều chỉnh sở hữu hoặc quyền tệp. Trên Windows hoặc macOS, có thể cần cấp quyền cho Docker truy cập ổ đĩa của bạn.
Xây dựng Image Docker NGINX tùy chỉnh
Mount một thư mục cục bộ là giải pháp nhanh cho việc thử nghiệm đơn giản. Bạn có thể cần thêm module, cấu hình đặc biệt hoặc tinh chỉnh khác. Khi đó, xây dựng image sẽ hữu ích.
Docker giúp bạn dễ dàng tạo một tệp công thức nhỏ, gọi là Dockerfile, để thiết lập container đúng như ý. Sau đó, bạn có một image có thể chia sẻ với người khác hoặc đẩy lên registry. Điều này tiện hơn so với việc yêu cầu mọi người mount hàng loạt tệp cục bộ.
Tạo Dockerfile
Dockerfile chỉ là một tệp văn bản thuần. Bạn có thể đặt tên là Dockerfile hoặc tên khác nếu thích. Đặt nó trong một thư mục mới. Đây là ví dụ đơn giản:
FROM nginx:latest
COPY index.html /usr/share/nginx/html/index.htmlĐược hỗ trợ bởi
Tệp này dùng image nginx:latest chính thức làm nền tảng. Sau đó, nó sao chép tệp cục bộ tên index.html vào thư mục nội dung web mặc định trong container. Bạn có thể thêm nhiều dòng nữa nếu cần. Ví dụ, có thể sao chép nginx.conf tùy chỉnh hoặc thêm các module muốn cài. Tùy nhu cầu của bạn. Nếu chỉ cần đặt một trang tĩnh, đoạn trên là đủ.
Khi đã có Dockerfile, hãy thêm index.html tùy chỉnh trong cùng thư mục. Sau đó bạn có thể build. Lệnh thường dùng là:
Dấu chấm ở cuối chỉ định thư mục hiện tại là ngữ cảnh build. Docker đọc Dockerfile trong thư mục đó. Bạn sẽ có một image tên mynginximage trên hệ thống cục bộ. Kiểm tra bằng:
docker images
mynginximage latest d35c2bbe10ab 36 seconds ago 281MBĐược hỗ trợ bởi
Bạn sẽ thấy tên mới trong danh sách. Cách này kết hợp Dockerfile và HTML của bạn vào một image duy nhất. Bạn không phải mount gì khi chạy.
Build và chạy image tùy chỉnh
Bây giờ khi mynginximage đã được build, bạn có thể chạy nó:
docker run --name mycustomnginx -p8080:80 -d mynginximageĐược hỗ trợ bởi
Hãy nhớ dừng container trước đó để tránh xung đột cổng.
Container này sẽ tự động phục vụ trang bạn đã đưa vào Dockerfile. Nếu mở trình duyệt tại http://localhost:8080, bạn sẽ thấy nội dung HTML đó.
Bạn có thể chia sẻ Dockerfile với người khác hoặc đẩy image đã build lên registry. Khi đó, đồng đội hoặc đồng nghiệp có thể khởi chạy mà không cần sao chép thư mục cục bộ.
Như vậy là hoàn tất quy trình xây dựng một image NGINX tùy chỉnh tối giản. Bạn bắt đầu từ image nền tảng chính thức, sao chép một vài tệp và tạo ra container mới bao gồm trang web tùy chỉnh của bạn. Bạn có thể mở rộng Dockerfile hơn nữa. Ví dụ, có thể chuyển cấu hình để xử lý PHP với php-fpm trong một build đa giai đoạn hoặc thêm các module mà NGINX không cung cấp sẵn.
Cách tiếp cận này nhấn mạnh tính linh hoạt của Docker: mỗi lớp trong Dockerfile có thể xử lý một tác vụ, và image cuối cùng có thể được phân phối dễ dàng. Bạn có quyền kiểm soát nội dung web, cùng với tùy chọn tinh chỉnh cài đặt để container phù hợp với dự án.
Khám phá 10 ý tưởng dự án Docker để học Docker qua các dự án thực hành tập trung vào xây dựng và tối ưu ứng dụng khoa học dữ liệu.
Thiết lập NGINX làm Reverse Proxy
NGINX có thể chuyển hướng các yêu cầu đến những dịch vụ khác trên cùng hệ thống hoặc trên các máy riêng biệt. Điều này thường được gọi là thiết lập reverse proxy. Bạn có thể đặt NGINX ở phía trước một nhóm ứng dụng để các yêu cầu đi qua một điểm vào duy nhất.
Điều này phổ biến khi bạn có nhiều container Docker lắng nghe ở các cổng khác nhau, và bạn muốn một tên miền duy nhất cho tất cả. NGINX lắng nghe ở cổng chuẩn như 80 hoặc 443, sau đó định tuyến lưu lượng tới dịch vụ đúng dựa trên đường dẫn, hostname hoặc yếu tố khác.
Tìm hiểu reverse proxy
Khi NGINX được cấu hình theo cách này, phía client không biết về giao tiếp nền. NGINX đóng vai trò mặt tiền công khai, nhận và chuyển tiếp yêu cầu rồi gửi phản hồi lại cho client.
Thiết kế này đơn giản hóa cấu trúc mạng. Nó cũng là cơ hội để điều chỉnh cache, thêm chứng chỉ TLS, xử lý cân bằng tải, hoặc làm những tác vụ nâng cao khác. Thường dễ quản lý các tác vụ này tại một nơi hơn là rải rác ở nhiều dịch vụ.
Một kịch bản điển hình có thể gồm một container chạy NGINX ở cổng 80, gửi yêu cầu tới một container ứng dụng ở cổng 3000. Trong khi client truy cập http://yourdomain.com, lưu lượng được chuyển đến container khác ở phía sau.
Cách này cho phép container ứng dụng giữ nguyên cổng mặc định, đồng thời người dùng không gặp thêm phức tạp. Một lý do khác là bạn có thể muốn ẩn các chi tiết nội bộ của dịch vụ hoặc trình bày cấu trúc URL đồng nhất.
Cấu hình NGINX cho reverse proxy
Để thực hiện việc này, bạn cần tệp cấu hình cho NGINX tùy chỉnh sử dụng các chỉ thị proxy. Bạn có thể mount một tệp cấu hình mới khi chạy container, hoặc build một image tùy chỉnh có sẵn tệp đó. Dưới đây là ví dụ đơn giản minh họa ý tưởng chung:
server {
listen 80;
location / {
proxy_pass http://myapp:3000/;}}Được hỗ trợ bởi
Trong đoạn trên, bất kỳ yêu cầu nào đến container NGINX ở cổng 80 sẽ được chuyển tới myapp:3000. Tên myapp gợi ý rằng có một container khác có thể truy cập bằng tên đó, điều này phổ biến khi bạn dùng Docker networking.
Nếu bạn dùng container độc lập, bạn có thể ánh xạ địa chỉ IP của container hoặc dùng IP của host. Bạn cũng có thể thêm các cài đặt nâng cao, như proxy_set_header Host $host, hoặc điều chỉnh timeout cho phù hợp ứng dụng.
Nếu bạn chọn mount tệp này khi chạy, bạn có thể làm như sau:
docker run --name nginxproxy -p8080:80 -d\-v /path/to/nginx.conf:/etc/nginx/conf.d/default.conf \--network mynetwork \
nginxĐược hỗ trợ bởi
Lệnh này chạy container NGINX, mount nginx.conf cục bộ của bạn làm cấu hình mặc định. Nó cũng kết nối container vào mạng Docker tên mynetwork, nơi container khác (myapp) của bạn tồn tại. Đây thường là cách đơn giản nhất nếu bạn muốn giữ cấu hình bên ngoài container.
Bạn cũng có thể đặt tệp đó vào Dockerfile nếu muốn bố trí cố định. Cách nào cũng được, miễn là các tham chiếu khớp với tên container và mạng bạn đã đặt.
Thiết kế này cho phép bạn có một tên miền hoặc IP duy nhất cho tất cả dịch vụ web, cùng một cổng chung. Nếu bạn làm việc với nhiều container backend, bạn có thể định nghĩa nhiều location trong cấu hình, mỗi cái trỏ đến một cổng container khác nhau. NGINX sau đó có thể định tuyến đến từng dịch vụ dựa trên đường dẫn URL. Đây là cách phổ biến cho microservices vì nó gom các điểm vào một cách gọn gàng.
Sử dụng Docker Compose để triển khai NGINX
Reverse proxy thường trở nên hữu ích hơn khi bạn có nhiều container hoạt động cùng nhau. Docker Compose là công cụ cho phép bạn định nghĩa nhiều dịch vụ trong một tệp. Sau đó, bạn có thể bật hoặc tắt tất cả chỉ với một lệnh. Nó giảm khả năng sai sót khi tạo container hoặc ánh xạ cổng vì mọi chi tiết đều nằm trong một tệp chuẩn.
Giới thiệu về Docker Compose
Docker Compose cho phép bạn quản lý tập hợp container. Bạn mô tả từng dịch vụ, chỉ định image sử dụng, các cổng xuất bản, volume để mount và mạng để tham gia. Sau đó một lệnh đơn giản (docker compose up -d) sẽ khởi động tất cả cùng lúc.
Cách tiếp cận này hữu ích cho phát triển cục bộ hoặc môi trường staging nơi bạn cần phối hợp nhiều container Docker. Định dạng tệp thường là YAML.
Mặc dù Docker Compose có thể hoạt động trên nhiều hệ điều hành, bạn cần đảm bảo nó đã được cài đặt và nhận diện. Các bản cài Docker Desktop hiện đại thường bao gồm sẵn. Kiểm tra phiên bản bằng:
docker compose version
Docker Compose version v2.33.1-desktop.1Được hỗ trợ bởi
Nếu bạn thấy chi tiết phiên bản, bạn đã sẵn sàng. Nếu không, hãy xem tài liệu Docker để bật hoặc cài đặt Docker Compose.
Tạo tệp docker-compose.yml
Tệp này thường bao gồm phần services. Dưới đây là ví dụ đơn giản về tệp docker-compose.yml thiết lập một container NGINX đơn để phục vụ nội dung tĩnh:
services:web:image: nginx:latest
ports:-"8080:80"volumes:- ./html:/usr/share/nginx/htmlĐược hỗ trợ bởi
Cách hiểu tệp như sau:
services: Định nghĩa các dịch vụ (container) tạo nên ứng dụng của bạn.
web: Dịch vụ này dùng image NGINX mới nhất.
ports: Ánh xạ cổng 80 trong container sang cổng 8080 trên máy của bạn. Điều này cho phép truy cập máy chủ web qua http://localhost:8080.
volumes: Mount thư mục cục bộ html vào thư mục nội dung mặc định của NGINX trong container (/usr/share/nginx/html). Thiết lập này giúp NGINX phục vụ nội dung tĩnh tùy chỉnh của bạn.
Triển khai dịch vụ với Docker Compose
Trong cùng thư mục với tệp docker-compose.yml, hãy tạo thư mục con tên html.
Đặt các tệp HTML tĩnh của bạn (ví dụ, index.html) vào thư mục html này. Ở đây, tôi đã tạo một trang phong cách Bootstrap để minh họa.
Mở terminal và điều hướng đến thư mục dự án chứa tệp docker-compose.yml.
Chạy lệnh sau để khởi động dịch vụ:
docker compose up -d[+] Running 1/1
✔ Container html_content-web-1 Started Được hỗ trợ bởi
Cờ -d chạy container ở chế độ tách rời, cho phép nó chạy nền.
Docker Compose sẽ xem tệp docker-compose.yml trong thư mục hiện tại. Nó sẽ kéo các image chưa có sẵn rồi khởi chạy từng container.
Mở trình duyệt và truy cập http://localhost:8080.
Bạn sẽ thấy nội dung tĩnh của mình được NGINX phục vụ.
Bạn có thể kiểm tra trạng thái dịch vụ đang chạy bằng:
Lệnh đó dừng và xóa tất cả cùng lúc. Nếu bạn muốn sao chép toàn bộ môi trường, chỉ cần chép tệp Docker Compose và mã liên quan sang máy mới, rồi chạy lại các lệnh tương tự. Điều này đảm bảo bạn có kết quả nhất quán với tối thiểu các bước thủ công.
Quản lý các container NGINX
Mặc dù cách dùng Docker Compose rất phổ biến cho quy trình đa dịch vụ, đôi khi bạn chỉ cần quản lý một container hoặc một cụm nhỏ. Docker cung cấp vài lệnh cơ bản giúp bạn xem những gì đang chạy, tạm dừng hoặc dừng container, và xóa chúng khi cần.
Đây là những việc thiết yếu cho dọn dẹp, đặc biệt khi bạn đang thử nghiệm với nhiều container NGINX hoặc build lặp lại.
Xem các container đang chạy
Bất cứ khi nào muốn xem container nào đang chạy, bạn có thể dùng:
dockerps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2d386c085129 mynginximage "/docker-entrypoint.…"4 minutes ago Up 4 minutes 0.0.0.0:8080->80/tcp mycustomnginxĐược hỗ trợ bởi
Lệnh này in một bảng các container đang hoạt động, mỗi cái có ID, image, tên và nhiều thông tin khác. Nếu cần xem tất cả container, bao gồm cả những cái đã dừng, hãy dùng:
Lệnh này hiển thị mọi container tồn tại trên hệ thống, kể cả những cái đã thoát. Điều này hữu ích để xem những container còn lại từ các lần chạy trước. Bạn có thể có các container tên mynginx, mycustomnginx, hoặc tên khác nếu bạn đã thử nghiệm với nhiều image.
Dừng và xóa container
Khi xong việc với container, bạn có thể dừng nó theo tên:
docker stop mynginx
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2d386c085129 mynginximage "/docker-entrypoint.…"4 minutes ago Up 4 minutes 0.0.0.0:8080->80/tcp mycustomnginxĐược hỗ trợ bởi
Lệnh đó yêu cầu Docker gửi tín hiệu dừng đến container, khiến NGINX tắt một cách trật tự. Nếu muốn xóa container ngay sau đó, bạn có thể chạy:
Lệnh này buộc xóa, dừng container nếu nó vẫn đang chạy. Hãy cẩn trọng khi dùng cách này trong môi trường sản xuất, vì nó kết thúc container mà không cho phép tắt trật tự. Một lệnh dọn dẹp khác là docker rmi, dùng để xóa image khỏi hệ thống.
Điều này hữu ích nếu bạn không còn cần một số image và muốn giải phóng dung lượng. Tuy nhiên, Docker chỉ xóa image không được container nào đang chạy sử dụng.
Kết luận
NGINX trong Docker là cách tiện lợi để phục vụ trang web hoặc định tuyến lưu lượng đến các dịch vụ khác. Bạn có thể chạy image chính thức hoặc tự build bằng một Dockerfile đơn giản. Docker Compose có thể điều phối nhiều container, giúp xử lý các thiết lập phức tạp dễ dàng hơn.
Với các phương pháp này, bạn có thể phân phối nội dung, xử lý chuyển tiếp và duy trì môi trường đáng tin cậy cho các dự án web.
Nếu bạn cần cách học Docker thực hành hơn, hãy xem Khóa học Giới thiệu về Docker để khám phá tầm quan trọng của nó trong bộ công cụ của chuyên gia dữ liệu.
Câu hỏi thường gặp về Docker NGINX
Làm thế nào để chạy container NGINX bằng Docker?⌄
Bạn có thể khởi chạy một container NGINX với lệnh sau:
Lệnh này chạy một container NGINX ở chế độ nền và ánh xạ cổng 8080 trên máy của bạn tới cổng 80 trong container. Sau đó, bạn có thể truy cập bằng cách vào http://localhost:8080 trong trình duyệt.
Làm sao để phục vụ nội dung tùy chỉnh với NGINX trong Docker?
⌄
Để phục vụ các tệp HTML của bạn, hãy mount một thư mục cục bộ vào container NGINX như sau:
docker run --name mynginx -p8080:80 -d-v /path/to/html:/usr/share/nginx/html nginxĐược hỗ trợ bởi
Thay /path/to/html bằng đường dẫn thực tế tới các tệp HTML của bạn. Container sẽ phục vụ nội dung từ thư mục đó thay vì trang mặc định.
Làm thế nào để cấu hình NGINX làm reverse proxy trong Docker?
⌄
Tạo tệp nginx.conf tùy chỉnh với nội dung sau:
server {
listen 80;
location / {
proxy_pass http://myapp:3000/;}}Được hỗ trợ bởi
Sau đó, chạy container NGINX với tệp cấu hình được mount:
docker run --name nginxproxy -p8080:80 -d-v /path/to/nginx.conf:/etc/nginx/conf.d/default.conf nginxĐược hỗ trợ bởi
Lệnh này sẽ chuyển tiếp yêu cầu từ http://localhost:8080 đến ứng dụng của bạn đang chạy ở cổng 3000.
Làm sao sử dụng Docker Compose để triển khai NGINX cùng các dịch vụ khác?⌄
Tìm hiểu về Docker và khám phá tầm quan trọng của nó trong bộ công cụ của chuyên gia dữ liệu. Tìm hiểu về Docker container, Docker image và nhiều nội dung khác.
Chạy NGINX bên trong container Docker có thể cung cấp một dịch vụ web ổn định trong nhiều môi trường. Bạn có thể đang làm việc trên một trang web cá nhân, một dịch vụ web gọn nhẹ hoặc một dự án phòng lab tại nhà. Docker giúp bạn giữ tính nhất quán trên nhiều máy và cấu hình khác nhau. Cách tiếp cận này cho phép chạy NGINX với ít lo ngại về chi phí quản trị khi chuyển giữa môi trường phát triển và sản xuất. Việc dựa vào Docker để đóng gói đơn giản máy chủ web khá phổ biến, giúp dễ dàng chia sẻ dự án mà không cần các bước thủ công rườm rà.
Bài viết này giải thích cách chạy một image NGINX sẵn có, cách phục vụ nội dung từ máy cục bộ, và cách tự xây dựng image với các tính năng tùy chỉnh. Bài cũng đề cập đến các bước thiết lập reverse proxy, cùng cách sử dụng Docker Compose cho triển khai đa dịch vụ. Cuối cùng, bạn sẽ thấy cách quản lý container chỉ với vài lệnh đơn giản và có cái nhìn chi tiết về cách tích hợp Docker và NGINX cho các tác vụ thực tế.
Nếu bạn mới dùng Docker, hãy xem hướng dẫn Docker cho người mới bắt đầu để nắm các kiến thức cốt lõi.
Docker NGINX là gì?
Docker NGINX nghĩa là chạy máy chủ web NGINX bên trong một container nhẹ. Container Docker giống như các gói nhỏ chứa ứng dụng và mọi phụ thuộc cần thiết.
NGINX là máy chủ web phổ biến nhờ hiệu năng cao, cấu hình đơn giản và khả năng xử lý linh hoạt lưu lượng HTTP. Kết hợp NGINX với Docker rất hấp dẫn vì giữ môi trường nhất quán. Dù bạn triển khai trên macOS, Windows hay Linux, nội dung của container vẫn như nhau. Điều đó có nghĩa là hành vi của nó không đổi, bất kể hệ điều hành máy chủ.
Một image Docker điển hình cho NGINX bao gồm phần mềm máy chủ, cấu hình mặc định và cấu trúc thư mục cho tệp được lưu trữ. Bạn có thể chạy container ngay hoặc điều chỉnh bằng cách ánh xạ các thư mục cụ thể, chỉnh sửa tệp cấu hình, hoặc xây dựng image dựa trên Dockerfile của riêng bạn. Bằng cách đó, bạn có thể thêm module hoặc script tùy chỉnh để điều chỉnh NGINX theo ứng dụng của mình.
Để tìm hiểu thêm về cách container hóa ứng dụng, hãy tham khảo bài hướng dẫn Cách container hóa một ứng dụng bằng Docker. Bài viết đi sâu vào cách container hóa các ứng dụng máy học bằng Docker một cách thân thiện với người mới.
Yêu cầu tiên quyết
Trước khi bắt đầu chạy container NGINX, hãy xác nhận Docker đã được cài đặt. Docker có bộ cài chính thức cho macOS, Windows và nhiều bản phân phối Linux. Tài liệu Docker cung cấp quy trình từng bước cho mỗi hệ điều hành.
Xem khóa học Giới thiệu về Docker của chúng tôi để có hướng dẫn toàn diện về cách bắt đầu với Docker.
Kiểm tra cài đặt với một lệnh nhanh như sau:
Nếu bạn thấy thông tin phiên bản, nghĩa là Docker đã sẵn sàng. Ngoài Docker, bạn cần có kết nối internet để kéo image NGINX từ Docker Hub. Nếu bạn định tạo image của riêng mình, bạn sẽ cần một trình soạn thảo văn bản để viết Dockerfile. Bất kỳ trình soạn thảo nào cũng được, hãy chọn cái bạn thấy thoải mái.
Thiết lập NGINX trong Docker Container
Chạy NGINX từ một image sẵn có thường là cách nhanh nhất. Bạn có thể kéo từ Docker Hub trong vài giây rồi khởi chạy container. Sau đó, bạn sẽ thấy trang mặc định trong trình duyệt. Quy trình ngắn này thường là bước đầu trong nhiều thiết lập máy chủ dựa trên Docker.
Kéo image Docker NGINX
Image NGINX chính thức được công khai trên Docker Hub với tên
nginx.Kéo image như sau:
Lệnh này truy cập registry và lấy phiên bản mới nhất. Khi hoàn tất, bạn có thể kiểm tra image đã tồn tại trên máy:
Lệnh đó hiển thị danh sách image trong thư viện cục bộ. Bạn sẽ thấy image
nginxtrong bảng. Điều đó có nghĩa là bạn đã sẵn sàng tạo container từ image này. Khám phá danh sách các image bạn có thể cần cho dự án khoa học dữ liệu trong bài Top 12 Docker Container Images cho Machine Learning và AI.Chạy container NGINX
Khi image NGINX đã có trên hệ thống, bạn có thể khởi động container với một lệnh duy nhất:
Lệnh này làm vài việc. Nó chạy một container tên
mynginxở chế độ nền (nhờ tùy chọn-d). Nó ánh xạ cổng 8080 trên máy chủ của bạn tới cổng 80 bên trong container. Ánh xạ cổng này có nghĩa là bạn có thể truy cập http://localhost:8080 trong trình duyệt và thấy trang mặc định của NGINX. Container sử dụng imagenginxđã kéo từ Docker Hub.Container mới sẽ tiếp tục chạy vì NGINX đang hoạt động. Nếu bạn kiểm tra log bằng:
Bạn có thể xem các thông báo mà NGINX ghi ra.
Phục vụ nội dung tùy chỉnh với NGINX
Bạn có thể muốn phục vụ một trang HTML thay vì trang mặc định đi kèm image. Bạn có thể tạo một tệp đơn giản trên máy cục bộ rồi mount vào container. Cách này giữ nội dung của bạn tách biệt với container. Bất cứ khi nào chỉnh sửa trang, bạn chỉ cần tải lại trình duyệt để thấy thay đổi.
Tạo trang HTML tùy chỉnh
Chọn một vị trí thuận tiện trên máy của bạn. Ví dụ một thư mục tên
html_contenttrong thư mục Home. Tạo tệpindex.htmltại đó. Nội dung có thể như sau:Đó là một trang HTML cơ bản. Bạn có thể đặt bất kỳ văn bản hay kiểu dáng nào bạn muốn. Thêm hình ảnh hoặc JavaScript hay bất cứ thứ gì phù hợp nhu cầu.
Mount trang HTML vào container NGINX
Image NGINX chính thức mặc định phục vụ nội dung từ
/usr/share/nginx/html. Bạn có thể ánh xạ thư mục cục bộ của mình tới vị trí đó trong container. Thao tác này được thực hiện với cờ-v(volume) trong Docker. Dừng bất kỳ container tênmynginxđang chạy để tránh xung đột cổng:Sau đó khởi chạy container mới:
Thay
/path/to/html_contentbằng đường dẫn thực tế trên máy bạn. Bằng cách này, mỗi khi bạn truy cập http://localhost:8080, container sẽ phục vụ tệp HTML bạn đặt tronghtml_content. Theo mặc định, nếu bạn đặt tên làindex.html, NGINX sẽ tự động tải tệp đó.Cách này hữu ích khi bạn muốn thường xuyên điều chỉnh nội dung. Bạn không cần rebuild container mỗi lần. Máy chủ sẽ đọc nội dung từ thư mục cục bộ của bạn theo thời gian thực.
Nếu gặp cảnh báo liên quan đến quyền, bạn có thể cần đảm bảo người dùng cục bộ và Docker có thể đọc thư mục đó.
Trên Linux, điều đó có thể là điều chỉnh sở hữu hoặc quyền tệp. Trên Windows hoặc macOS, có thể cần cấp quyền cho Docker truy cập ổ đĩa của bạn.
Xây dựng Image Docker NGINX tùy chỉnh
Mount một thư mục cục bộ là giải pháp nhanh cho việc thử nghiệm đơn giản. Bạn có thể cần thêm module, cấu hình đặc biệt hoặc tinh chỉnh khác. Khi đó, xây dựng image sẽ hữu ích.
Docker giúp bạn dễ dàng tạo một tệp công thức nhỏ, gọi là Dockerfile, để thiết lập container đúng như ý. Sau đó, bạn có một image có thể chia sẻ với người khác hoặc đẩy lên registry. Điều này tiện hơn so với việc yêu cầu mọi người mount hàng loạt tệp cục bộ.
Tạo Dockerfile
Dockerfile chỉ là một tệp văn bản thuần. Bạn có thể đặt tên là
Dockerfilehoặc tên khác nếu thích. Đặt nó trong một thư mục mới. Đây là ví dụ đơn giản:Tệp này dùng image
nginx:latestchính thức làm nền tảng. Sau đó, nó sao chép tệp cục bộ tênindex.htmlvào thư mục nội dung web mặc định trong container. Bạn có thể thêm nhiều dòng nữa nếu cần. Ví dụ, có thể sao chépnginx.conftùy chỉnh hoặc thêm các module muốn cài. Tùy nhu cầu của bạn. Nếu chỉ cần đặt một trang tĩnh, đoạn trên là đủ.Khi đã có Dockerfile, hãy thêm
index.htmltùy chỉnh trong cùng thư mục. Sau đó bạn có thể build. Lệnh thường dùng là:Dấu chấm ở cuối chỉ định thư mục hiện tại là ngữ cảnh build. Docker đọc Dockerfile trong thư mục đó. Bạn sẽ có một image tên
mynginximagetrên hệ thống cục bộ. Kiểm tra bằng:Bạn sẽ thấy tên mới trong danh sách. Cách này kết hợp Dockerfile và HTML của bạn vào một image duy nhất. Bạn không phải mount gì khi chạy.
Build và chạy image tùy chỉnh
Bây giờ khi
mynginximageđã được build, bạn có thể chạy nó:Hãy nhớ dừng container trước đó để tránh xung đột cổng.
Container này sẽ tự động phục vụ trang bạn đã đưa vào Dockerfile. Nếu mở trình duyệt tại http://localhost:8080, bạn sẽ thấy nội dung HTML đó.
Bạn có thể chia sẻ Dockerfile với người khác hoặc đẩy image đã build lên registry. Khi đó, đồng đội hoặc đồng nghiệp có thể khởi chạy mà không cần sao chép thư mục cục bộ.
Như vậy là hoàn tất quy trình xây dựng một image NGINX tùy chỉnh tối giản. Bạn bắt đầu từ image nền tảng chính thức, sao chép một vài tệp và tạo ra container mới bao gồm trang web tùy chỉnh của bạn. Bạn có thể mở rộng Dockerfile hơn nữa. Ví dụ, có thể chuyển cấu hình để xử lý PHP với
php-fpmtrong một build đa giai đoạn hoặc thêm các module mà NGINX không cung cấp sẵn.Cách tiếp cận này nhấn mạnh tính linh hoạt của Docker: mỗi lớp trong Dockerfile có thể xử lý một tác vụ, và image cuối cùng có thể được phân phối dễ dàng. Bạn có quyền kiểm soát nội dung web, cùng với tùy chọn tinh chỉnh cài đặt để container phù hợp với dự án.
Khám phá 10 ý tưởng dự án Docker để học Docker qua các dự án thực hành tập trung vào xây dựng và tối ưu ứng dụng khoa học dữ liệu.
Thiết lập NGINX làm Reverse Proxy
NGINX có thể chuyển hướng các yêu cầu đến những dịch vụ khác trên cùng hệ thống hoặc trên các máy riêng biệt. Điều này thường được gọi là thiết lập reverse proxy. Bạn có thể đặt NGINX ở phía trước một nhóm ứng dụng để các yêu cầu đi qua một điểm vào duy nhất.
Điều này phổ biến khi bạn có nhiều container Docker lắng nghe ở các cổng khác nhau, và bạn muốn một tên miền duy nhất cho tất cả. NGINX lắng nghe ở cổng chuẩn như 80 hoặc 443, sau đó định tuyến lưu lượng tới dịch vụ đúng dựa trên đường dẫn, hostname hoặc yếu tố khác.
Tìm hiểu reverse proxy
Khi NGINX được cấu hình theo cách này, phía client không biết về giao tiếp nền. NGINX đóng vai trò mặt tiền công khai, nhận và chuyển tiếp yêu cầu rồi gửi phản hồi lại cho client.
Thiết kế này đơn giản hóa cấu trúc mạng. Nó cũng là cơ hội để điều chỉnh cache, thêm chứng chỉ TLS, xử lý cân bằng tải, hoặc làm những tác vụ nâng cao khác. Thường dễ quản lý các tác vụ này tại một nơi hơn là rải rác ở nhiều dịch vụ.
Một kịch bản điển hình có thể gồm một container chạy NGINX ở cổng 80, gửi yêu cầu tới một container ứng dụng ở cổng 3000. Trong khi client truy cập http://yourdomain.com, lưu lượng được chuyển đến container khác ở phía sau.
Cách này cho phép container ứng dụng giữ nguyên cổng mặc định, đồng thời người dùng không gặp thêm phức tạp. Một lý do khác là bạn có thể muốn ẩn các chi tiết nội bộ của dịch vụ hoặc trình bày cấu trúc URL đồng nhất.
Cấu hình NGINX cho reverse proxy
Để thực hiện việc này, bạn cần tệp cấu hình cho NGINX tùy chỉnh sử dụng các chỉ thị proxy. Bạn có thể mount một tệp cấu hình mới khi chạy container, hoặc build một image tùy chỉnh có sẵn tệp đó. Dưới đây là ví dụ đơn giản minh họa ý tưởng chung:
Trong đoạn trên, bất kỳ yêu cầu nào đến container NGINX ở cổng 80 sẽ được chuyển tới
myapp:3000. Tênmyappgợi ý rằng có một container khác có thể truy cập bằng tên đó, điều này phổ biến khi bạn dùng Docker networking.Nếu bạn dùng container độc lập, bạn có thể ánh xạ địa chỉ IP của container hoặc dùng IP của host. Bạn cũng có thể thêm các cài đặt nâng cao, như
proxy_set_header Host $host, hoặc điều chỉnh timeout cho phù hợp ứng dụng.Nếu bạn chọn mount tệp này khi chạy, bạn có thể làm như sau:
Lệnh này chạy container NGINX, mount
nginx.confcục bộ của bạn làm cấu hình mặc định. Nó cũng kết nối container vào mạng Docker tênmynetwork, nơi container khác (myapp) của bạn tồn tại. Đây thường là cách đơn giản nhất nếu bạn muốn giữ cấu hình bên ngoài container.Bạn cũng có thể đặt tệp đó vào Dockerfile nếu muốn bố trí cố định. Cách nào cũng được, miễn là các tham chiếu khớp với tên container và mạng bạn đã đặt.
Thiết kế này cho phép bạn có một tên miền hoặc IP duy nhất cho tất cả dịch vụ web, cùng một cổng chung. Nếu bạn làm việc với nhiều container backend, bạn có thể định nghĩa nhiều location trong cấu hình, mỗi cái trỏ đến một cổng container khác nhau. NGINX sau đó có thể định tuyến đến từng dịch vụ dựa trên đường dẫn URL. Đây là cách phổ biến cho microservices vì nó gom các điểm vào một cách gọn gàng.
Sử dụng Docker Compose để triển khai NGINX
Reverse proxy thường trở nên hữu ích hơn khi bạn có nhiều container hoạt động cùng nhau. Docker Compose là công cụ cho phép bạn định nghĩa nhiều dịch vụ trong một tệp. Sau đó, bạn có thể bật hoặc tắt tất cả chỉ với một lệnh. Nó giảm khả năng sai sót khi tạo container hoặc ánh xạ cổng vì mọi chi tiết đều nằm trong một tệp chuẩn.
Giới thiệu về Docker Compose
Docker Compose cho phép bạn quản lý tập hợp container. Bạn mô tả từng dịch vụ, chỉ định image sử dụng, các cổng xuất bản, volume để mount và mạng để tham gia. Sau đó một lệnh đơn giản (
docker compose up -d) sẽ khởi động tất cả cùng lúc.Cách tiếp cận này hữu ích cho phát triển cục bộ hoặc môi trường staging nơi bạn cần phối hợp nhiều container Docker. Định dạng tệp thường là YAML.
Mặc dù Docker Compose có thể hoạt động trên nhiều hệ điều hành, bạn cần đảm bảo nó đã được cài đặt và nhận diện. Các bản cài Docker Desktop hiện đại thường bao gồm sẵn. Kiểm tra phiên bản bằng:
Nếu bạn thấy chi tiết phiên bản, bạn đã sẵn sàng. Nếu không, hãy xem tài liệu Docker để bật hoặc cài đặt Docker Compose.
Tạo tệp docker-compose.yml
Tệp này thường bao gồm phần services. Dưới đây là ví dụ đơn giản về tệp
docker-compose.ymlthiết lập một container NGINX đơn để phục vụ nội dung tĩnh:Cách hiểu tệp như sau:
htmlvào thư mục nội dung mặc định của NGINX trong container (/usr/share/nginx/html). Thiết lập này giúp NGINX phục vụ nội dung tĩnh tùy chỉnh của bạn.Triển khai dịch vụ với Docker Compose
Trong cùng thư mục với tệp
docker-compose.yml, hãy tạo thư mục con tênhtml.Đặt các tệp HTML tĩnh của bạn (ví dụ,
index.html) vào thư mụchtmlnày. Ở đây, tôi đã tạo một trang phong cách Bootstrap để minh họa.Mở terminal và điều hướng đến thư mục dự án chứa tệp
docker-compose.yml.Chạy lệnh sau để khởi động dịch vụ:
Cờ
-dchạy container ở chế độ tách rời, cho phép nó chạy nền.Docker Compose sẽ xem tệp
docker-compose.ymltrong thư mục hiện tại. Nó sẽ kéo các image chưa có sẵn rồi khởi chạy từng container.Mở trình duyệt và truy cập http://localhost:8080.
Bạn sẽ thấy nội dung tĩnh của mình được NGINX phục vụ.
Bạn có thể kiểm tra trạng thái dịch vụ đang chạy bằng:
Nếu cần hạ toàn bộ, một lệnh duy nhất có thể xóa các container:
Lệnh đó dừng và xóa tất cả cùng lúc. Nếu bạn muốn sao chép toàn bộ môi trường, chỉ cần chép tệp Docker Compose và mã liên quan sang máy mới, rồi chạy lại các lệnh tương tự. Điều này đảm bảo bạn có kết quả nhất quán với tối thiểu các bước thủ công.
Quản lý các container NGINX
Mặc dù cách dùng Docker Compose rất phổ biến cho quy trình đa dịch vụ, đôi khi bạn chỉ cần quản lý một container hoặc một cụm nhỏ. Docker cung cấp vài lệnh cơ bản giúp bạn xem những gì đang chạy, tạm dừng hoặc dừng container, và xóa chúng khi cần.
Đây là những việc thiết yếu cho dọn dẹp, đặc biệt khi bạn đang thử nghiệm với nhiều container NGINX hoặc build lặp lại.
Xem các container đang chạy
Bất cứ khi nào muốn xem container nào đang chạy, bạn có thể dùng:
Lệnh này in một bảng các container đang hoạt động, mỗi cái có ID, image, tên và nhiều thông tin khác. Nếu cần xem tất cả container, bao gồm cả những cái đã dừng, hãy dùng:
Lệnh này hiển thị mọi container tồn tại trên hệ thống, kể cả những cái đã thoát. Điều này hữu ích để xem những container còn lại từ các lần chạy trước. Bạn có thể có các container tên
mynginx,mycustomnginx, hoặc tên khác nếu bạn đã thử nghiệm với nhiều image.Dừng và xóa container
Khi xong việc với container, bạn có thể dừng nó theo tên:
Lệnh đó yêu cầu Docker gửi tín hiệu dừng đến container, khiến NGINX tắt một cách trật tự. Nếu muốn xóa container ngay sau đó, bạn có thể chạy:
Nếu bạn muốn dừng và xóa chỉ với một lệnh, hãy thử:
Lệnh này buộc xóa, dừng container nếu nó vẫn đang chạy. Hãy cẩn trọng khi dùng cách này trong môi trường sản xuất, vì nó kết thúc container mà không cho phép tắt trật tự. Một lệnh dọn dẹp khác là
docker rmi, dùng để xóa image khỏi hệ thống.Điều này hữu ích nếu bạn không còn cần một số image và muốn giải phóng dung lượng. Tuy nhiên, Docker chỉ xóa image không được container nào đang chạy sử dụng.
Kết luận
NGINX trong Docker là cách tiện lợi để phục vụ trang web hoặc định tuyến lưu lượng đến các dịch vụ khác. Bạn có thể chạy image chính thức hoặc tự build bằng một Dockerfile đơn giản. Docker Compose có thể điều phối nhiều container, giúp xử lý các thiết lập phức tạp dễ dàng hơn.
Với các phương pháp này, bạn có thể phân phối nội dung, xử lý chuyển tiếp và duy trì môi trường đáng tin cậy cho các dự án web.
Nếu bạn cần cách học Docker thực hành hơn, hãy xem Khóa học Giới thiệu về Docker để khám phá tầm quan trọng của nó trong bộ công cụ của chuyên gia dữ liệu.