Containers

Tạo máy chủ Web Server Nginx hoàn chỉnh chỉ trong vài phút với Docker

Bạn đã bao giờ nghĩ rằng chỉ với vài lệnh Docker, bạn có thể tự tay dựng một Nginx Web Server hoàn chỉnh? Không cần cài đặt thủ công Nginx, không cần cấu hình phức tạp. Tất cả những gì bạn cần là sự trợ giúp của Docker.

Xin chào mọi người, Phương đây! Hôm nay, mình sẽ hướng dẫn các bạn cách tạo, chạy và kiểm thử một ứng dụng Docker hóa thực tế chỉ trong vài phút. Bài viết ngắn này sẽ giúp bạn hiểu Docker từ core và thấy được sức mạnh thực sự của nó trong việc đóng gói và triển khai ứng dụng. Chúng ta Hãy bắt đầu ngay nhỉ!

Phần 1: Cài đặt Docker trên Ubuntu và chuẩn bị môi trường

Trước tiên, chúng ta cần cài đặt Docker trên hệ điều hành Ubuntu. Nếu máy bạn chưa có Docker, hãy mở Terminal và chạy các lệnh sau để cài đặt:

sudo apt update -y

sudo apt install -y docker.io

sudo systemctl enable docker

sudo systemctl start docker

Giải thích một chút: Lệnh apt update cập nhật danh sách gói, apt install docker.io cài đặt Docker Engine (phiên bản trong kho của Ubuntu), còn systemctl enable/start docker để kích hoạt Docker chạy nền mỗi khi khởi động máy chủ. Sau khi cài xong, bạn nên kiểm tra phiên bản Docker để đảm bảo mọi thứ đã được thiết lập đúng:

docker version

Nếu Docker đang chạy ổn định, bạn sẽ thấy thông tin phiên bản của #Docker hiển thị ra (bao gồm cả phiên bản client và server). Tiếp theo, để thao tác tiện lợi hơn (tránh phải gõ sudo trước mỗi lệnh Docker), bạn có thể chuyển sang quyền quản trị với người dùng root:

sudo -i

Bây giờ, chúng ta sẽ tải về image chính thức của #Nginx từ Docker Hub về máy. Docker Hub là kho lưu trữ các Docker image phổ biến mà Docker tìm kiếm mặc định. Chạy lệnh sau để pull image Nginx mới nhất về:

docker pull nginx:latest

Lệnh docker pull sẽ tải image nginx:latest (bản mới nhất) về máy local. Sau khi hoàn tất, hãy kiểm tra danh sách các image đã tải:

docker image ls

Bạn sẽ thấy image Nginx mà chúng ta vừa tải xuất hiện trong danh sách. Như vậy là môi trường đã sẵn sàng, chúng ta có thể bắt đầu tạo container đầu tiên OK!

Phần 2: Tạo và chạy container Nginx đầu tiên

Bây giờ, hãy sử dụng image Nginx vừa tải về để tạo một container Nginx đầu tiên. Chạy lệnh sau trong Terminal:

docker run --name nginx-container -d nginx:latest

Trong đó:

  • --name nginx-container: Đặt tên cho container mới là nginx-container (giúp dễ quản lý).

  • -d: Chạy container ở chế độ tách rời (detached mode), tức là chạy ngầm.

  • nginx:latest: Chỉ định sử dụng image Nginx bản mới nhất mà ta đã tải về.

Lệnh trên sẽ tạo và khởi chạy container dựa trên image Nginx. Để kiểm tra container có chạy thành công hay không, dùng lệnh sau:

docker container ls

Lệnh này liệt kê các container đang chạy. Nếu mọi thứ đúng, bạn sẽ thấy container nginx-container có trạng thái “Up” (đang chạy). Điều đó nghĩa là máy chủ web Nginx bên trong container đã khởi động thành công! Xin chúc mừng, bạn vừa chạy xong container Docker đầu tiên của mình.

Mẹo: Trong các lệnh Docker, bạn cũng có thể sử dụng lệnh docker ps thay cho docker container ls – đây là lệnh viết tắt phổ biến để liệt kê các container đang chạy.

Phần 3: Tùy chỉnh nội dung trang web trong container

Container Nginx của chúng ta đang chạy một trang web mặc định. Bây giờ, hãy thử tùy chỉnh nội dung trang web đó để xem là Docker có cho phép chúng ta cập nhật ứng dụng dễ dàng như thế nào. Trước hết, hãy tạo một trang HTML đơn giản trên máy host:

echo "Welcome to My Custom NGINX Server Page" > index.html

Lệnh trên sẽ tạo file index.html với nội dung dòng chữ “Welcome to My Custom NGINX Server Page”. Tiếp theo, chúng ta sẽ copy file html này từ máy host vào bên trong container Nginx đang chạy:

docker cp index.html nginx-container:/usr/share/nginx/html/index.html

Câu lệnh docker cp cho phép sao chép file giữa máy chủ host và container. Ở đây, chúng ta copy file index.html vừa tạo vào thư mục /usr/share/nginx/html/ bên trong container (đây là nơi Nginx lưu trang web mặc định).

Sau khi copy xong, để kiểm tra kết quả, chúng ta có thể truy cập vào web server Nginx trong container. Có hai cách:

Cách 1: Sử dụng lệnh docker exec để vào thẳng môi trường shell của container và dùng công cụ như curl:

docker exec -it nginx-container /bin/bash

Lệnh trên mở một terminal bên trong container. Bây giờ gõ:

curl [http:]//localhost:80

Lệnh curl sẽ gửi yêu cầu HTTP đến chính container Nginx (đang lắng nghe cổng 80).

Cách 2: Nếu bạn đang chạy Docker trực tiếp trên máy của mình, có thể gửi yêu cầu HTTP đến địa chỉ localhost:

curl [http:]//localhost:80

(Lưu ý: Trên Linux, cách này chỉ hoạt động nếu container dùng host network hoặc có ánh xạ cổng. Mặc định container chạy kiểu bridge nên không thể truy cập trực tiếp qua localhost trừ khi bạn đã publish cổng.)

Bằng cách nào đi nữa, kết quả trả về trong Terminal cũng sẽ hiển thị dòng chữ “Welcome to My Custom NGINX Server Page”. Điều này có nghĩa là chúng ta đã thay thế trang mặc định của Nginx thành công! Nội dung trang web tùy chỉnh của bạn đã được phục vụ bởi container Nginx.

Giải thích: Khi chạy docker run Nginx, container sử dụng trang web index.html mặc định đi kèm image. Bằng thao tác docker cp, chúng ta đã ghi đè file index.html đó bằng tệp tùy chỉnh của chúng ta. Nhờ Docker, việc cập nhật ứng dụng trong container rất linh hoạt mà không cần cấu hình phức tạp.

Phần 4: Tạo Dockerfile và xây dựng image tùy chỉnh

Đến đây, bạn đã chạy được một container từ image Nginx có sẵn. Tiếp theo, chúng ta sẽ học cách tạo #Dockerfile để xây dựng Docker image tùy chỉnh cho ứng dụng của chúng ta. Việc này giúp đóng gói ứng dụng cùng môi trường vào một image duy nhất, thuận tiện cho việc chia sẻ và triển khai trên mọi môi trường.

Hãy bắt đầu bằng việc tạo một file có tên Dockerfile trong thư mục hiện tại:

touch Dockerfile
nano Dockerfile

(Mở file Dockerfile với trình soạn thảo nano để chỉnh sửa nội dung.)

Sau đó, dán nội dung sau vào Dockerfile:

#1: Use the official NGINX image as the base
FROM nginx:latest
#2: Copy the application files into the container
COPY index.html /usr/share/nginx/html/index.html
#3: Expose port 80 to allow access to the NGINX web server
EXPOSE 80
#4: Specify the command to run NGINX 
CMD ["nginx", "-g", "daemon off;"]

Giải thích Dockerfile trên:

  • Dòng FROM nginx:latest chỉ định image gốc (base image) là Nginx mới nhất từ Docker Hub.

  • Dòng COPY sao chép file index.html từ thư mục hiện tại (build context) vào thư mục phục vụ web của Nginx trong container.

  • Dòng EXPOSE 80 khai báo rằng container sẽ lắng nghe trên cổng 80 (dùng cho mục đích tài liệu và để tiện mapping port sau này).

  • Dòng CMD ["nginx", "-g", "daemon off;"] thiết lập lệnh mặc định khi container khởi chạy: Ở đây chạy Nginx ở chế độ nền và không tự động tắt (daemon off).

Tiếp theo, hãy tạo lại file index.html trên máy host với nội dung khác một chút để tiện phân biệt so với lần trước:

echo "Welcome to My Custom NGINX Server Page Using Dockerfile" > index.html

Chúng ta thêm cụm từ “Using Dockerfile” để biết đây là nội dung từ image tùy chỉnh.

Bây giờ, tiến hành build image Docker mới từ Dockerfile vừa tạo:

docker build -t nginx_app .

Trong đó, -t nginx_app đặt tên (tag) cho image mới là nginx_app, còn dấu chấm (.) chỉ định ngữ cảnh build chính là thư mục hiện tại (nơi chứa Dockerfile).

Quá trình build sẽ thực hiện lần lượt các bước trong Dockerfile:

  • Tải image gốc nginx:latest (nếu máy chưa có sẵn).

  • Sao chép file index.html vào image.

  • Thiết lập cổng và lệnh chạy trong image.

Sau khi build xong, dùng lệnh sau để kiểm tra danh sách Docker image:

docker images

Bạn sẽ thấy một image mới có tên nginx_app xuất hiện, bên cạnh các image có sẵn trước đó (như nginx). Đến đây, bạn đã tạo thành công một Docker image tùy chỉnh!

Để quản lý phiên bản, chúng ta có thể gắn nhãn (tag) phiên bản cho image nginx_app. Ví dụ, gắn thẻ ver1 (version 1) cho image này:

docker tag nginx_app nginx_app:ver1

Bây giờ image của bạn sẽ có thêm thẻ phiên bản nginx_app:ver1, sẵn sàng để sử dụng.

Phần 5: Chạy container từ image tùy chỉnh

Đã có image tùy chỉnh, bây giờ là lúc chạy container mới từ image đó. Chúng ta sẽ mở cổng 8080 trên máy host và ánh xạ (map) nó vào cổng 80 của container để có thể truy cập web từ trình duyệt. Chạy lệnh sau:

docker run -d --name nginx_container_1 -p 8080:80 nginx_app:ver1

Trong lệnh trên:

  • -d vẫn là chạy container ở chế độ detached (chạy nền).

  • --name nginx_container_1 đặt tên cho container mới (bạn có thể đặt tên khác tùy ý).

  • -p 8080:80 ánh xạ cổng 8080 của máy host với cổng 80 trong container. Có nghĩa là truy cập localhost:8080 trên máy bạn sẽ được chuyển tới container:80.

  • nginx_app:ver1 chỉ định image và thẻ phiên bản mà container sẽ chạy (chính là image tùy chỉnh chúng ta vừa build).

Sau khi chạy lệnh trên, kiểm tra lại danh sách container đang chạy:

docker ps

Bạn sẽ thấy container nginx_container_1 mới đang “Up” và có mapping cổng 8080->80. Bây giờ, hãy thử gửi một request HTTP để xem nội dung trang web từ container này:

curl [http://]localhost:8080

Hoặc mở trình duyệt web và truy cập địa chỉ http://localhost:8080.

Nếu mọi thứ đúng, bạn sẽ thấy thông điệp “Welcome to My Custom NGINX Server Page Using Dockerfile” hiện ra. Điều đó có nghĩa là máy chủ web Nginx trong container đã phục vụ trang HTML tùy chỉnh được đóng gói trong image nginx_app:ver1 của bạn. Như vậy chúng ta vừa triển khai thành công một ứng dụng Dockerized (được Docker hóa) hoàn chỉnh!

Nhờ Docker, việc đóng gói ứng dụng kèm môi trường (Nginx + trang web của bạn) trở nên thật dễ dàng. Bất kỳ máy nào có Docker đều có thể chạy image này và có ngay một web server Nginx với trang tùy chỉnh, đúng như triết lý “viết một lần, chạy mọi nơi” (build once, run anywhere) của Docker.

Phần 6: Dọn dẹp container sau khi thử nghiệm

Sau khi thử nghiệm xong, bạn nên dọn dẹp (clean) các containers để giữ cho môi trường sạch sẽ và tiết kiệm tài nguyên hệ thống. Chúng ta sẽ dừng và xóa các containers đã tạo:

docker container stop nginx-container
docker container rm nginx-container

docker container stop nginx_container_1
docker container rm nginx_container_1

Lệnh docker container stop sẽ gửi tín hiệu dừng đến container (tương tự việc tắt dịch vụ Nginx bên trong). Sau khi container đã dừng (exited), dùng docker container rm để xóa container khỏi danh sách. Bạn có thể kiểm tra lại bằng docker container ls -a để chắc chắn chúng đã bị remove.

Ngoài ra, nếu không còn muốn sử dụng image nginx_app:ver1 tùy chỉnh, bạn cũng có thể xóa image đó bằng lệnh:

docker image rm nginx_app:ver1

Việc dọn dẹp thường xuyên trong quá trình học và thử nghiệm với Docker sẽ giúp giải phóng dung lượng ổ đĩa và tránh nhầm lẫn giữa nhiều container/image.

Kết luận & Bước tiếp theo

Như vậy, qua bài hướng dẫn này chúng ta đã lần lượt thực hiện các bước: cài đặt Docker trên Ubuntu; chạy container Nginx từ image có sẵn; tùy chỉnh nội dung trang web trong container; tạo Dockerfile để đóng gói ứng dụng thành image riêng; chạy container từ image tùy chỉnh; và cuối cùng dừng/xóa container để dọn dẹp môi trường sau khi thử nghiệm. Đây đều là những thao tác cơ bản nhưng rất quan trọng, là nền tảng để bạn tiếp tục khám phá Docker sâu hơn trong tương lai.

Thật ấn tượng khi chỉ với vài lệnh đơn giản, chúng ta đã đóng gói, triển khai và vận hành được một web server Nginx hoàn chỉnh. Docker thực sự mang đến sức mạnh cho lập trình viên và kỹ sư hệ thống trong việc tạo môi trường nhất quán và triển khai ứng dụng mọi lúc, mọi nơi. Ngoài ra, Docker cũng đã trở thành một phần không thể thiếu của thế giới DevOps hiện đại, giúp kết nối chặt chẽ quá trình phát triển (Dev) và vận hành (Ops).

Nếu bạn thấy hướng dẫn này hữu ích, đừng quên nhấn Like và share bài viết, bấm Đăng ký kênh youtube của mình và để lại bình luận về chủ đề #Docker hoặc #DevOps mà bạn muốn mình thực hiện trong tương lai. Mình đọc tất cả bình luận và luôn lựa chọn những chủ đề thiết thực, thực tế nhất để hướng dẫn cho các bạn.

Mình là Phương, và sứ mệnh của mình là giúp bạn làm chủ công nghệ nhanh hơn, hiệu quả hơn và thực tế hơn. Hẹn gặp lại các bạn trong bài viết/video tiếp theo!

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *