Containers

Cách Tạo Local Docker Registry và Build Image Siêu Nhẹ với NGINX Alpine

“Bạn có biết rằng chỉ một dòng lệnh sai trong Dockerfile cũng có thể làm image của bạn tăng thêm dung lượng hàng trăm MB?
Hay tệ hơn — khi bạn build xong image nhưng không được phép push lên Docker Hub vì chính sách nội bộ của công ty bạn?”

Nếu bạn từng bị rơi vào tình huống đó — xin chúc mừng, bạn đang chạm tới “vấn đề thật sự” mà mọi kỹ sư DevOps, System Engineer, Developers và System Admin đều phải đối mặt: Đó là tính kiểm soát và tối ưu trong thế giới container.

Và hôm nay, tôi sẽ giúp bạn giải phóng mình khỏi sự phụ thuộc vào Docker Hub, bằng cách tự xây dựng một Docker Registry riêng để lưu trữ image nội bộ, an toàn, và có tốc độ download/Upload images nhanh hơn bao giờ hết.


Tư duy của Docker – Tối giản nhưng mạnh mẽ

Docker ra đời với một triết lý rất đơn giản: “Let’s make shipping software as easy as shipping containers.”
Phần mềm, cũng như hàng hóa, cần được đóng gói, vận chuyển và triển khai một cách an toàn, nhẹ nhàng và có thể tái sử dụng ở bất cứ đâu.

Điều đó có nghĩa là, nếu mọi bit dữ liệu thừa thì đều là một “chiếc container rỗng” vô ích – làm cho hệ thống của bạn chậm hơn, nặng hơn và khó bảo trì hơn.

Chính vì vậy, bài hướng dẫn này sẽ giúp bạn build Docker image cực nhẹ dựa trên nginx:alpine, chỉ vài chục MB — thay vì hàng trăm MB như bản chuẩn.


Mục tiêu của bài viết này!

Sau khi đọc bài viết này, bạn sẽ nắm vững cách:

Build Docker image dựa trên nginx:alpine – siêu nhẹ và bảo mật hơn.
Tạo website đơn giản (index.html) để test NGINX.
Tag và push image lên Local Docker Registry nội bộ.
Xóa image khỏi máy và pull lại để xác minh registry có thể hoạt động tốt.


Bắt đầu làm thực hành: Build image siêu nhẹ với nginx:alpine

Bước 1: Kiểm tra Docker trên Linux Server

Trước khi bắt đầu, hãy đảm bảo Docker đã được cài đặt và hoạt động tốt:

docker version

Nếu bạn thấy thông tin về ClientServer, có nghĩa là Docker daemon đang chạy bình thường.


Bước 2: Tải image base nhẹ nhất – nginx:alpine

docker pull nginx:alpine

Giải thích nhanh:
nginx:alpine là phiên bản NGINX chạy trên Alpine Linux — một distro cực nhẹ, bảo mật cao, chỉ vài MB.
So với nginx:latest (khoảng 150MB), bản alpine chỉ có dung lượng khoảng 52MB — tiết kiệm gấp 3 lần dung lượng.

Kiểm tra lại danh sách image:

docker image ls


Bước 3: Tạo Dockerfile

Nếu chưa có file này, hãy tạo file:

vim Dockerfile

Dán nội dung sau vào file:

#1: Use the lightweight nginx:alpine base image
FROM nginx:alpine
#2: Copy application files into the container
COPY index.html /usr/share/nginx/html/
#3: Clean up unnecessary files (if needed) to keep the image size small 
RUN rm -rf /var/cache/apk/*
#4: Expose port 80 to allow access to the NGINX server  
EXPOSE 80

Lưu và thoát.


Bước 4: Tạo file web index.html

Tạo file index.html để test ngay trên Linux Server:

echo "Welcome to My Lightweight NGINX Alpine Server Page Powered by Dockerfile" > index.html

⭐ File HTML này sẽ được copy vào container trong quá trình build image.


Bước 5: Build Docker image

Bây giờ chúng ta đã có đủ Dockerfile và file web.
Vậy hãy build image với lệnh sau:

docker build -t my-nginx-image:latest .

Sau khi build xong, kiểm tra bằng lệnh:

docker image ls

Kết quả sẽ xuất hiện my-nginx-image với dung lượng vào khoảng 52MB — đúng như mong đợi của chúng ta


Tạo Local Docker Registry – kho lưu trữ riêng cho doanh nghiệp

Hầu hết các công ty lớn đều không cho phép upload các images của họ lên Docker Hub do vấn đề bảo mật.
Vì vậy, chúng ta cần build Local Docker Registry — là kho chứa các Docker images được lưu trữ trong hạ tầng nội bộ của công ty giúp an toàn bảo mật tuyệt đối.


Bước 6: Tạo local registry trên port 5000

docker run -d -p 5000:5000 --name registry registry:2

Kiểm tra registry:

curl [http]://localhost:5000/v2/_catalog

Kết quả ban đầu sẽ là [] –  Có nghĩa là registry đang trống chưa có các Docker Images.


Bước 7: Tag image trước khi push

docker tag my-nginx-image:latest [localhost]:5000/my-nginx-image:v1.0

Kiểm tra lại:

docker images

Bạn sẽ thấy một image mới localhost:5000/my-nginx-image:v1.0 — cùng ID với bản gốc.


Bước 8: Push image lên Local Registry

docker push localhost:5000/my-nginx-image:v1.0

Xác minh registry có image chưa sử dụng lần lượt các lệnh sau:

curl [http]://localhost:5000/v2/_catalog
curl [http]://localhost:5000/v2/my-nginx-image/tags/list

Kết quả:

{"repositories":["my-nginx-image"]}
{"name":"my-nginx-image","tags":["v1.0"]}

Như vậy là bạn đã có một Docker Hub nội bộ hoạt động hoàn chỉnh!


Bước 9: Xóa image khỏi máy – để kiểm chứng

docker image rm my-nginx-image
docker image rm localhost:5000/my-nginx-image:v1.0
Xác nhận lại image không còn trong Linux Server:
docker images

Kết quả: image không còn trong Linux Server.


Bước 10: Kéo lại image từ Local Registry

docker pull localhost:5000/my-nginx-image:v1.0
docker tag localhost:5000/my-nginx-image:v1.0 my-nginx-image
Xác nhận image đã được download từ Local Registry vào Linux Server:
docker images

Bạn sẽ thấy image được tải lại thành công — chứng minh Local Registry hoạt động ổn định.


⚙️ Vì sao Local Registry là tương lai của DevOps nội bộ

Docker Hub giống như “Internet của container”. Và trong các môi trường doanh nghiệp, bảo mậttốc độ nội bộ là yếu tố sống còn. Như vậy qua bài viết này, bạn có thể hiểu là Local Registry cho phép bạn:

  • Kiểm soát truy cập: Chỉ nhân viên nội bộ mới được phép push/pull.

  • Tốc độ build nhanh hơn: Không phụ thuộc vào các hệ thống mạng bên ngoài.

  • Giảm chi phí lưu trữ cloud: Các Images chỉ nằm trong hạ tầng nội bộ.

  • Đảm bảo version control rõ ràng: Giúp quản lý version image hiệu quả.

Nói cách khác — Local Registry chính là “Docker Hub của riêng bạn”.


Kết luận: Làm chủ Docker, làm chủ hạ tầng

Với chỉ vài lệnh cơ bản, bạn đã:

  • Tạo một Docker image nhẹ, tối ưu, có tính bảo mật cao.

  • Xây dựng một hệ thống lưu trữ image riêng biệt.

  • Hiểu cách quản lý vòng đời image — từ build, tag, push, đến pull.

“Công nghệ không phải để tạo ra sự phức tạp, mà là để trao quyền cho sự đơn giản.”
Solomon Hykes

Và đó chính là triết lý của Docker:
Biến mọi thứ phức tạp thành một vài dòng lệnh đơn giản.


Bài học tiếp theo

Nếu bạn muốn đi xa hơn, hãy thử:

  • Thiết lập Docker Registry với SSL và Authentication.

  • Dùng Harbor hoặc Nexus để mở rộng registry chuyên nghiệp.

  • Tích hợp CI/CD pipeline để tự động push image lên registry nội bộ.


Kết luận

Nếu bạn thấy bài viết này hữu ích, hãy chia sẻ để nhiều người học System Admin, System Engineers, DevOps, và Devs hơn, có thể làm chủ Docker như bạn.
Và đừng quên, để lại comment:

“Mình muốn học về Docker Compose hoặc Kubernetes trong bài tiếp theo nhé!”

Tôi là Phương, và sứ mệnh của tôi 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.

#DockerTutorial #DockerRegistry #nginxAlpine #DevOpsVietnam #DockerBuild #PrivateRegistry #SystemAdmin #CloudEngineering #PhuongIT #LightweightImage #DockerVietnam #DevOpsSkill #DockerHubAlternative

Để 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 *