Computer >> Hướng Dẫn Máy Tính >  >> Hệ Thống >> Linux

Lưu thay đổi vào Docker Image ngay lập tức mà không sửa ảnh gốc

Docker images là bất biến (immutable). Một khi đã build, chúng không thay đổi. Điều này đảm bảo tính nhất quán, dự đoán được, và ổn định. Mọi container tạo từ cùng một image hoạt động giống hệt nhau, và versioning trở nên an toàn và dễ dàng. Nhưng nếu bạn cần điều chỉnh bên trong container đang chạy, như cài gói hoặc cập nhật cấu hình? Đó là lúc docker commit phát huy tác dụng. Nó cho phép bạn ghi lại thay đổi trong container đang chạy và tạo image mới mà không chạm đến ảnh gốc. Điều này tuyệt vời cho test fix, lặp lại nhanh, và triển khai image tùy chỉnh mà không cần rebuild từ đầu.

Tại sao Docker Image không thay đổi

Docker images bao gồm nhiều layer chỉ đọc (read-only). Khi bạn chạy container, Docker thêm một layer ghi mỏng ở trên cùng gọi là container layer. Mọi thay đổi bạn làm chỉ xảy ra trong layer trên cùng này. Khi container bị xóa, mọi thay đổi trong layer đó biến mất, để ảnh gốc nguyên vẹn.

Thiết kế này đảm bảo một số lợi ích:

  • Mọi container từ cùng image hoạt động giống nhau, đảm bảo tính nhất quán.
  • Thay đổi trong container này không ảnh hưởng container khác, cung cấp tính dự đoán.
  • Bạn có thể tag an toàn các phiên bản image cụ thể không lo rủi ro.

Thiết kế này cung cấp độ ổn định tuyệt vời, nhưng giới hạn bạn khi muốn thay đổi nhanh container đang chạy. Đó là lúc docker commit giúp.

Tạo Image mới từ Container đang chạy

Khi chạy lệnh docker commit, Docker chụp trạng thái hiện tại của container đang chạy và tạo image mới từ nó. Nó chụp snapshot hệ thống file của container, lưu mọi thay đổi bạn làm, như gói cài đặt, cấu hình cập nhật, hoặc file sửa đổi, thành layer image mới. Cách này, ảnh gốc không bị chạm, cho phép bạn thử nghiệm và lặp lại nhanh.

Lưu thay đổi vào Docker Image ngay lập tức mà không sửa ảnh gốc

Điều này làm cho nó lý tưởng để lưu setup cơ sở tùy chỉnh để tái sử dụng sau, áp dụng fix nhỏ hoặc thay đổi cấu hình khi test, hoặc chia sẻ image cập nhật với team mà không phải rebuild Dockerfile từ đầu.

Bạn dùng lệnh docker commit với cú pháp sau để tạo image mới từ container đang chạy:

docker commit [OPTIONS] CONTAINER_ID NEW_IMAGE_NAME[:TAG]

Ở đây, CONTAINER_ID là ID hoặc tên container bạn muốn chụp, NEW_IMAGE_NAME là tên muốn đặt cho image mới, và TAG tùy chọn, mặc định là latest.

Lưu ý: docker commit là alias cũ cho docker container commit; cả hai giống hệt nhau.

Lệnh docker commit cung cấp vài tùy chọn cho phép thêm metadata, áp dụng thay đổi cấu hình, và kiểm soát cách commit hoạt động. Bảng dưới tóm tắt tất cả tùy chọn hỗ trợ:

OptionLong FormMô tảVí dụ
-a--authorThêm tên tác giả vào metadata image mới.docker commit -a "Anees" my-container my-image
-c--changeÁp dụng instruction Dockerfile như ENV, LABEL, CMD vào image mới.docker commit -c "ENV APP_ENV=prod" my-container my-image
-m--messageThêm thông điệp ngắn mô tả thay đổi trong image.docker commit -m "Installed curl" my-container my-image
-p--pauseTạm dừng container khi commit để đảm bảo nhất quán (mặc định: true).docker commit --pause=false my-container my-image

Xem docker commit hoạt động như thế nào

Giả sử bạn muốn cài curl trong container Alpine mà không rebuild Dockerfile. Để làm vậy, chạy container từ image cơ sở:

docker run -it alpine:latest /bin/sh

Khi đã trong container, thực hiện thay đổi cần thiết:

apk update && apk add curl
Lưu thay đổi vào Docker Image ngay lập tức mà không sửa ảnh gốc

Bây giờ thoát container:

exit

Sau đó, commit container thành image mới:

docker commit alpine-with-curl:1.0
Lưu thay đổi vào Docker Image ngay lập tức mà không sửa ảnh gốc

Xác minh image mới:

docker images

Bây giờ, bạn có image mới sẵn sàng chạy ở đâu đó, với curl đã cài sẵn.

Lưu thay đổi vào Docker Image ngay lập tức mà không sửa ảnh gốc

Chạy image mới để test thay đổi đã lưu

Sau khi tạo image mới, bạn chạy container từ nó để xác minh thay đổi được lưu.

docker run -it alpine-with-curl:1.0 /bin/sh

Lệnh này mở shell tương tác bên trong container dựa trên image alpine-with-curl:1.0. Bên trong, bạn kiểm tra sửa đổi còn nguyên vẹn.

curl --version

Điều này chứng minh thay đổi được lưu trong image mới.

Lưu thay đổi vào Docker Image ngay lập tức mà không sửa ảnh gốc

docker commit vs Dockerfile: Khi nào dùng cái nào

Cả Dockerfile và docker commit cho phép tạo Docker image, nhưng chúng hoạt động cách rất khác và phù hợp tình huống khác nhau.

Dockerfile là lựa chọn tốt nhất khi bạn cần build tin cậy và lặp lại được, đặc biệt cho pipeline CI/CD và môi trường production. Nó giữ mọi thay đổi định nghĩa rõ ràng trong code, khiến chúng dễ theo dõi, review, và version control theo thời gian. Cách này đảm bảo bất kỳ ai build image sau nhận được cùng kết quả, critical cho bảo trì lâu dài và cộng tác team.

Mặt khác, docker commit hoạt động tốt cho fix nhanh, test, hoặc điều chỉnh nhỏ bạn muốn thử mà không viết lại hoặc rebuild toàn bộ Dockerfile. Nó hữu ích khi bạn experiment, debug, hoặc validate thay đổi on-the-fly. Tuy nhiên, vì thay đổi không được ghi chép trong file, phương pháp này phù hợp dùng ngắn hạn hơn là production.

Tóm lại, dùng docker commit chủ yếu cho experiment hoặc fix tạm thời. Cho image production-ready, luôn ưu tiên Dockerfile. Để tận dụng tối đa Docker, đáng khám phá các lệnh quan trọng khác làm việc với container, image, và workflow dễ dàng hơn.