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ỉ!
Contents
- 1 Phần 1: Cài đặt Docker trên Ubuntu và chuẩn bị môi trường
- 2 Phần 2: Tạo và chạy container Nginx đầu tiên
- 3 Phần 3: Tùy chỉnh nội dung trang web trong container
- 4 Phần 4: Tạo Dockerfile và xây dựng image tùy chỉnh
- 5 Phần 5: Chạy container từ image tùy chỉnh
- 6 Phần 6: Dọn dẹp container sau khi thử nghiệm
- 7 Kết luận & Bước tiếp theo
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:
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:

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:
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ề:
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:
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:
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:
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 psthay chodocker 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:
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:
Câu lệnh
docker cpcho phép sao chép file giữa máy chủ host và container. Ở đây, chúng ta copy fileindex.htmlvừ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:Lệnh trên mở một terminal bên trong container. Bây giờ gõ:
Lệnh
curlsẽ 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:
(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 runNginx, container sử dụng trang web index.html mặc định đi kèm image. Bằng thao tácdocker 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:
(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:
Giải thích Dockerfile trên:
Dòng
FROM nginx:latestchỉ định image gốc (base image) là Nginx mới nhất từ Docker Hub.Dòng
COPYsao 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 80khai 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:
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:
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:
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: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:
Trong lệnh trên:
-dvẫ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ậplocalhost:8080trên máy bạn sẽ được chuyển tớicontainer:80.
nginx_app:ver1chỉ đị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:
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:
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-containerdocker container stop nginx_container_1
docker container rm nginx_container_1Lệnh
docker container stopsẽ 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ùngdocker container rmđể xóa container khỏi danh sách. Bạn có thể kiểm tra lại bằngdocker 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:
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!









