Chuyển đến nội dung chính

Cách xây dựng Image Docker NGINX tùy chỉnh

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ả.
· 10 phút đọc

Khám phá cùng AI

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.

Các thành phần của Docker NGINX

Để 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 26 10: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 26 10: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

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:

docker pull nginx
derrickmwiti@Derricks-MacBook-Pro % docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
4c7c1a5bd3af: Download complete 
bef2ee7fab45: Download complete 
d9b636547744: Downloading [======================>                            ]  12.58MB/28.04MB
0994e771ba34: Downloading [===>                                               ]  3.146MB/40.56MB
589701e352f8: Download complete 
13f89c653285: Download complete 
8e77214beb25: Download complete 

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                                                  

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 -p 8080:80 -d nginx
derrickmwiti@Derricks-MacBook-Pro % docker run --name mynginx -p 8080:80 -d nginx
ec44d1a43016e9684b602437b967c0ed8e11c933a8a76b341b68c25168d2af70

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 method
2025/03/20 04:33:10 [notice] 1#1: nginx/1.27.4
2025/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-linuxkit
2025/03/20 04:33:10 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2025/03/20 04:33:10 [notice] 1#1: start worker processes
2025/03/20 04:3

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>

Đó 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 stop mynginx
docker rm mynginx

Sau đó khởi chạy container mới:

docker run --name mynginx -p 8080:80 -d \
    -v /Users/derrickmwiti/Documents/html_content:/usr/share/nginx/html \
    nginx
6f68085733eeac418c3302e5c580a4f7c5c0c36d3591d8e2a7f35f69f6308d18

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 đó.

Mounting the HTML page to the NGINX container

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

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à:

docker build -t mynginximage .
[+] Building 2.6s (7/7) FINISHED                                                                                                                                                       docker:desktop-linux
 => [internal] load build definition from Dockerfile                                                                                                                                                   0.0s
 => => transferring dockerfile: 245B                                                                                                                                                                   0.0s
 => [internal] load metadata for docker.io/library/nginx:latest                                                                                                                                        0.0s
 => [internal] load .dockerignore                                                                                                                                                                      0.0s
 => => transferring context: 2B                                                                                                                                                                        0.0s
 => [internal] load build context                                                                                                                                                                      0.0s
 => => transferring context: 365B                                                                                                                                                                      0.0s
 => [1/2] FROM docker.io/library/nginx:latest@sha256:124b44bfc9ccd1f3cedf4b592d4d1e8bddb78b51ec2ed5056c52d3692baebc19                                                                                  2.3s
 => => resolve docker.io/library/nginx:latest@sha256:124b44bfc9ccd1f3cedf4b592d4d1e8bddb78b51ec2ed5056c52d3692baebc19                                                                                  2.3s
 => [2/2] COPY index.html /usr/share/nginx/html/index.html                                                                                                                                             0.0s
 => exporting to image                                                                                                                                                                                 0.1s
 => => exporting layers                                                                                                                                                                                0.0s
 => => exporting manifest sha256:19dd719772fd7ac839fadb7d49862f84422f4571a442994ffaca152e9674553a                                                                                                      0.0s
 => => exporting config sha256:e974f3ab92a0278e419f0fe4c5a6fc43fafb4a75da27895d90c4f2d5d385daa1                                                                                                        0.0s
 => => exporting attestation manifest sha256:e391b0212e5a100bd9132fbbd6cb4052e288dbbcba093839b55f8b197131372b                                                                                          0.0s
 => => exporting manifest list sha256:d35c2bbe10ab0b7e46d1ef8fba6c6cb28628eb9c283db02607e32e95b62e14d5                                                                                                 0.0s
 => => naming to docker.io/library/mynginximage:latest                                                                                                                                                 0.0s
 => => unpacking to docker.io/library/mynginximage:latest                                                                                                                                              0.0s

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

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 -p 8080:80 -d mynginximage

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 đó. 

Building and running the custom image

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/;
    }
}

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 -p 8080:80 -d \
    -v /path/to/nginx.conf:/etc/nginx/conf.d/default.conf \
    --network mynetwork \
    nginx

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

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á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ờ -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ụ.

Deploying services with Docker Compose

Bạn có thể kiểm tra trạng thái dịch vụ đang chạy bằng:

docker compose ps

Nếu cần hạ toàn bộ, một lệnh duy nhất có thể xóa các container:

docker compose down

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:

docker ps
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

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:

docker ps -a

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

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:

docker rm mynginx

Nếu bạn muốn dừng và xóa chỉ với một lệnh, hãy thử:

docker rm -f mynginx

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:

docker run --name mynginx -p 8080:80 -d nginx

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 -p 8080:80 -d -v /path/to/html:/usr/share/nginx/html nginx

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/;
    }
}

Sau đó, chạy container NGINX với tệp cấu hình được mount:

docker run --name nginxproxy -p 8080:80 -d -v /path/to/nginx.conf:/etc/nginx/conf.d/default.conf nginx

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ạo tệp docker-compose.yml với nội dung sau:

services:
  myapp:
    image: myappimage
    expose:
      - "3000"

  nginxproxy:
    image: nginx
    ports:
      - "8080:80"
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - myapp

Chạy các dịch vụ bằng:

docker compose up -d

Lệnh này khởi động cả ứng dụng và NGINX proxy chỉ với một câu lệnh.

Làm thế nào để dừng và xóa container NGINX trong Docker?

Để dừng một container NGINX đang chạy, dùng:

docker stop mynginx

Để xóa hoàn toàn container, chạy:

docker rm mynginx

Nếu muốn xóa container và cả image của nó, bạn cũng có thể xóa image bằng:

docker rmi nginx

Lệnh này dọn dẹp container và image đã lưu trên hệ thống của bạn.

Chủ đề

Liên quan