Trong bài viết này, tôi sẽ cung cấp hướng dẫn từng bước về cách tạo Container Docker, sửa đổi trạng thái bên trong của nó và sau đó lưu Container dưới dạng Image.
Điều này thực sự tiện dụng khi bạn tìm ra cách build Image vì bạn có thể tiếp tục điều chỉnh một container đang chạy cho đến khi nó hoạt động như bạn muốn. Khi bạn hoàn thành, chỉ cần lưu nó dưới dạng Image.
Bước 1: Tạo Container Base
Hãy bắt đầu bằng cách tạo một container đang chạy . Để chúng ta không bị sa lầy vào các chi tiết của bất kỳ container cụ thể nào, chúng ta có thể sử dụng nginx .
Lệnh tạo Docker sẽ tạo một Container mới cho chúng ta từ dòng lệnh:
docker create --name nginx_base -p 80:80 nginx:alpine
Ở đây chúng ta đã yêu cầu một container mới có tên nginx_base với cổng 80 được hiển thị với localhost. chúng ta đang sử dụng nginx: alpine làm Image Base cho container.
Nếu bạn không có Image nginx: alpine trong kho Image docker cục bộ, nó sẽ tự động tải xuống. Khi điều này xảy ra, bạn sẽ thấy một cái gì đó như thế này:
Bước 2: Kiểm tra Image
Nếu bạn nhìn vào danh sách các Image trên hệ thống của bạn, bây giờ bạn sẽ thấy Image nginx: alpine:
docker images
Bước 3: Kiểm tra container
Lưu ý ở đây rằng container không chạy, vì vậy bạn sẽ không thấy nó trong danh sách container trừ khi bạn sử dụng cờ -a (-a viết tắt của all).
docker ps -a
Bước 4: Khởi động Container
Hãy bắt đầu container và xem những gì sẽ xảy ra.
docker start nginx_base
Bây giờ hãy truy cập http: // localhost với trình duyệt của bạn. Bạn sẽ thấy trang mặc định của nginx.
Bước 5: Sửa đổi Container đang chạy
Vì vậy, nếu bạn muốn sửa đổi container đang chạy này để nó hoạt động theo một cách cụ thể, có nhiều cách khác nhau để làm điều đó.
Để giữ mọi thứ đơn giản nhất có thể, chúng ta sẽ sao chép một tệp index.html mới vào container. Bạn có thể làm thực tế bất cứ điều gì bạn muốn ở đây.
Hãy tạo một tệp index.html mới và sao chép nó vào Container đang chạy. Sử dụng trình chỉnh sửa trên máy của bạn, tạo tệp index.html trong cùng thư mục mà bạn đã chạy các lệnh Docker từ đó.
Sau đó dán HTML sau vào nó:
<html> <head> <title>Hi Mom</title> </head> <body> <h1>Hi Mom!</h1> </body>
Sau đó lưu tệp và trở về dòng lệnh. chúng ta sẽ sử dụng lệnh cp docker để sao chép tệp này vào container đang chạy.
docker cp index.html nginx_base:/usr/share/nginx/html/index.html
Bây giờ tải lại trình duyệt của bạn hoặc truy cập lại http: // localhost. Bạn sẽ thấy sự thay đổi của trang chủ.
Bước 6: Tạo một Image từ một container
Vì vậy, tại thời điểm này, chúng ta đã cập nhật nội dung của một container đang chạy và miễn là chúng ta giữ container đó xung quanh, chúng ta không cần phải làm gì cả.
Tuy nhiên, chúng ta muốn biết làm thế nào để lưu container này dưới dạng Image để chúng ta có thể tạo các container khác dựa trên cái này. Các lệnh Docker để làm điều này khá đơn giản.
Để lưu Container Docker, chúng ta chỉ cần sử dụng lệnh docker commit như thế này:
docker commit nginx_base
Bây giờ hãy nhìn vào danh sách Image docker:
Bạn có thể thấy có một Image mới ở đó. Nó không có kho lưu trữ hoặc tag, nhưng nó tồn tại. Đây là một Image được tạo ra từ container đang chạy. Hãy gắn tag để nó sẽ dễ dàng tìm thấy sau này.
Bước 7: Gắn tag Image
Sử dụng docker tag, chúng ta có thể đặt tên cho Image chúng ta vừa tạo. chúng ta cần ID Image cho lệnh, do đó, ID Image được liệt kê ở trên là f7a677e35ee8
, lệnh của chúng ta sẽ là:
docker tag f7a677e35ee8 hi_mom_nginx
Và nếu chúng ta nhìn lại tag của Image, chúng ta có thể thấy rằng <none> đã được thay thế:
chúng ta thực sự có thể sử dụng các thẻ tag phức tạp hơn ở đây ví dụ như số phiên bản và tất cả các bản sửa lỗi khác của lệnh tag, nhưng ví dụ này của chúng ta, chúng ta sẽ chỉ tạo một Image với một tên có ý nghĩa.
Bước 8: Tạo Image với tag
Bạn cũng có thể tạo tag Image khi nó được tạo bằng cách thêm một đối số khác vào cuối lệnh như thế này:
docker commit nginx_base hi_mom_nginx
Lệnh này commit container tạo image và tag cùng một lúc, rất hữu ích.
Bước 9: Xóa Container gốc
Trước đó chúng ta đã bắt đầu một container Docker. Chúng ta có thể thấy rằng nó vẫn đang chạy bằng lệnh ps docker.
Hãy dừng Container Docker hiện đang chạy và xóa nó.
docker stop nginx_base docker rm nginx_base
Nếu chúng ta liệt kê tất cả các container Docker, chúng ta sẽ không thấy gì:
Bây giờ, hãy tạo một Container mới dựa trên Image chúng ta vừa tạo và start nó.
docker run --name hi_mom -d -p 80:80 hi_mom_nginx
Lưu ý rằng việc chạy docker tương đương với việc thực hiện docker create theo sau là docker start; chúng ta chỉ tiết kiệm một bước ở đây.
Tùy chọn -d yêu cầu Docker chạy container dưới nền để chúng ta tiếp tục sử dụng command line.
Bước 10: Nhìn vào Container đang chạy
Nếu bạn nhìn vào các container đang chạy bây giờ, bạn sẽ thấy chúng ta có một cái gọi là hi_mom:
Bây giờ hãy xem http: // localhost .
Như bạn có thể thấy, trang index.html hiện hiển thị thông báo Hi Mom! như chúng ta muốn.
Dừng container hi_mom trước khi chuyển sang phần tiếp theo.
docker stop hi_mom
Bước 11: Xem xét các option
Có một vài điều tùy chọn chúng ta có thể làm bằng cách sử dụng lệnh commit sẽ thay đổi thông tin về Image của chúng ta.
Ví dụ: chúng ta có thể muốn ghi lại ai là tác giả của Image của chúng ta hoặc chụp lại một thông điệp commit cho chúng ta biết về trạng thái của Image.
Tất cả đều được điều khiển thông qua các tham số tùy chọn cho lệnh commit.
Chúng ta hãy quay trở lại container chạy ban đầu của chúng ta. chúng ta sẽ sử dụng một lệnh hơi khác ở đây để làm sạch dễ dàng hơn:
docker run --name nginx_base --rm -d -p 80:80 nginx:alpine
Lệnh này sẽ chạy Image nginx: alpine với tên nginx_base; việc tạo Image sẽ được đưa vào thực thi lệnh.
Tùy chọn --rm
sẽ làm cho container bị xóa khi nó bị stop. -d
báo cho máy tính rằng dòng lệnh sẽ chạy ở chế độ daemon (chế độ tách rời). Điều này sẽ cho phép chúng ta chạy các lệnh khác từ cùng một terminal.
Vì vậy, nếu bạn truy cập http: // localhost ngay bây giờ, bạn sẽ thấy trang chào mừng nginx mặc định.
Chúng ta đã trải qua việc thay đổi mọi thứ về container đang chạy ở trên, vì vậy tôi sẽ không lặp lại công việc đó ở đây; thay vào đó, chúng ta muốn xem xét các tùy chọn khác nhau xung quanh lệnh commit.
Tùy chọn A: Đặt quyền tác giả
Hãy bắt đầu bằng cách thiết lập quyền tác giả của Image. Nếu bạn kiểm tra Image docker hi_mom_nginx ở trên, bạn sẽ phát hiện ra rằng trường tác giả của nó là trống.
Chúng ta sẽ sử dụng lệnh kiểm tra docker để có được các chi tiết của Image và grep ra dòng tác giả.
docker inspect hi_mom_nginx | grep Author
Vì vậy, nếu chúng ta sử dụng tùy chọn author
trên lệnh docker commit, chúng ta có thể đặt giá trị của trường author
.
# Chúng ta sẽ tạo mới một image với tên là authored từ container nginx_base đang chạy docker commit --author khaind@hocdevops.com nginx_base authored
Và chúng ta có thể kiểm tra quyền tác giả của Image đó:
docker inspect authored | grep Author Output: "Author": "khaind@hocdevops.com",
Hãy xóa Image đó và thử một số tùy chọn khác:
Tùy chọn B: Tạo một message khi commit
Giả sử bạn muốn có một message kết để nhắc nhở bản thân về Image đó là gì hoặc trạng thái của container tại thời điểm Image được tạo ra.
Có một tùy chọn mà bạn có thể sử dụng để đưa thông tin đó vào.
Thực hiện lệnh này:
# Tạo Image mới với name là mmm với message như sau docker commit --message "day la container dang chay nginx" nginx_base mmm
Sử dụng tên Image, chúng ta có thể nhìn vào lịch sử của Image Docker để xem message của chúng ta. Ở đây chúng ta đang sử dụng lệnh docker history để hiển thị lịch sử thay đổi của Image chúng ta đã tạo:
docker history mmm
Hãy xóa Image này và kiểm tra các tùy chọn khác:
Tùy chọn C: Commit không tạm dừng Container
Khi bạn sử dụng lệnh commit, container sẽ bị tạm dừng.
Đối với Container nhỏ của chúng ta, điều này không quan trọng, nhưng bạn có thể đang làm gì đó như tạo image từ container production trong đó không thể tạm dừng container được.
Bạn có thể thêm tùy chọn --pause=false
vào lệnh commit và Image sẽ được tạo từ container mà không cần tạm dừng.
# tạo một image mới với tên wo_pause docker commit --pause=false nginx_base wo_pause
Nếu bạn không tạm dừng container, bạn có nguy cơ làm hỏng dữ liệu của mình.
Ví dụ: nếu Container ở giữa thao tác ghi, dữ liệu được ghi có thể bị hỏng hoặc không đầy đủ. Đó là lý do tại sao, theo mặc định, container bị tạm dừng trước khi Image được tạo.
Hãy xóa Image này và kiểm tra các tùy chọn khác:
Tùy chọn D: Thay đổi cấu hình
Tùy chọn cuối cùng tôi muốn thảo luận là tùy chọn -c
hoặc --change
. Tùy chọn này cho phép bạn đặt cấu hình của Image.
Bạn có thể thay đổi bất kỳ cài đặt nào sau đây của Image trong quá trình commit:
- CMD
- ENTRYPOINT
- ENV
- EXPOSE
- LABEL
- ONBUILD
- USER
- VOLUME
- WORKDIR
Tệp docker gốc của Nginx chứa các cài đặt sau:
- CMD [“nginx”, “-g”, “daemon off;”]
- ENV NGINX_VERSION 1.15.3
- EXPOSE 80
Vì vậy, chúng ta sẽ chỉ dùng nó một lát. NGINX_VERSION và EXPOSE có thể gây ra sự cố khi khởi động container, vì vậy chúng ta sẽ sửa đổi dòng lệnh (CMD) được thực thi bởi container.
Nginx cho phép chúng ta vượt qua đối số dòng lệnh -t sẽ kiểm tra xem các config của nginx hiện tại có vấn đề gì không. Hãy tạo một Image với giá trị CMD thay thế như sau:
# Tạo một image mới với tên conf_dump docker commit --change='CMD ["nginx", "-t"]' nginx_base conf_dump
Bây giờ hãy dừng Container nginx_base bằng lệnh này:
docker stop nginx_base
Và bắt đầu một container mới từ Image chúng ta vừa tạo:
docker run --name dumper -p 80:80 conf_dump
Cấu hình cho quá trình nginx sẽ hiển thị trạng thái của nó khi bạn thực hiện lệnh này. Bạn có thể cuộn lên vài trang để tìm lệnh chúng ta đã thực hiện.
Kết luận
Docker commit
rất hữu ích cho các hoạt động chẩn đoán và bootstrapping Image mới từ các container hiện có.