Lệnh Docker exec, lưu container thành image với commit, xuất image ra file
Docker exec
Thông thường, để thực thi một lệnh trong container, ta sẽ vào container bằng lệnh docker attach <container name or id>
. Tuy nhiên, nếu ta đang ở host và vẫn muốn thực thi một lệnh bên trong container đang chạy, ta sẽ dùng lệnh docker exec <container id / name> [COMMAND]
.
Ví dụ, từ host, ta chạy lệnh ls
để liệt kê tất cả các file trong container.
|
|
Ngoài ra cũng vẫn có thể thêm các option, ví dụ:
|
|
Lệnh trên yêu cầu thực thi lệnh bash và thêm option -it
để có thể tương tác trực tiếp với terminal, dễ dàng thấy, nó khá giống với lệnh docker attach
, tuy nhiên, khi mở các process trong container bằng htop, chúng ta sẽ thấy như sau:
Rõ ràng, ở đây có ngoài process /bin/bash
có khi tạo, container còn chạy thêm một process bash
, process này chính là lệnh mà chúng ta yêu cầu thực thi từ máy host. Sau khi thực hiện lệnh docker exec -it test bash
, ta gõ lệnh exit
để thoát khỏi container, tuy nhiên, vì container vẫn còn process /bin/bash
nên nó vẫn còn hoạt động chứ không bị tắt đi.
Docker commit
Sau khi cài docker và sử dụng, chúng ta có thể phải cài thêm nhiều phần mềm, môi trường khác nhau. Khi đó, để chia sẻ container này đi, ta cần lưu container này thành image. Để làm việc đó, ta sử dụng lệnh container commit
.
Trước khi lưu container trở thành image, ta kiểm tra xem trong hệ thống có những image nào:
|
|
Một điều lưu ý, muốn lưu container thành image, thì container đó phải ở trạng thái dừng (Exited).
|
|
Tiến hành lưu container thành images, ta dùng cú pháp: docker commit CONTAINER image:tag
. CONTAINER ở đây là tên hoặc id của container.
Ví dụ, container ubuntu vừa rồi tôi đã cài thêm ping
với vim
, bây giờ lưu lại thành image, ta thực hiện:
|
|
Rõ ràng, sau khi thực hiện lệnh trên, chúng ta sẽ thấy trong danh sách các images có thểm một image có thên là ubuntu-py với TAG là version1 cùng ID và các thông tin khác.
Docker save
Sau khi ta lưu container thành một image, để có thể chia sẻ image này với người khác, ta lưu image thành một file trên máy host. Việc này sẽ được thực hiện thông qua lệnh docker save --output filename.tar <image_id/name>
.
|
|
Ví dụ trên tôi đã lưu ubuntu-pv image thành ra file ubuntu-pv.tar.
Docker load
Sau khi nhận được file image.tar, để phục hồi hoặc sử dụng lại, ta sử dụng lệnh docker load -i image.tar
Ví dụ, tôi tiến hành xóa đi ubuntu-pv image hiện có trên hệ thống. Lệnh thao tác với image bạn có thể xem ở P1.
|
|
Bây giờ, ta tiến hành phục hồi ubuntu-pv image từ file ubuntu-pv.tar
đã có ở trước đó.
|
|
Khi phục hồi, tên của image và tag của nó sẽ là <none>
. Để đặt tên và tag, ta dùng lệnh:
docker tag image_id name:tag
.
❯ docker tag a8 newimage:version2
❯ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
newimage version2 a8e04dcf8737 16 minutes ago 170MB
centos latest 300e315adb2f 6 months ago 209MB
Chia sẻ dữ liệu trong Docker, tạo và quản lý ổ đĩa docker volume
Chia sẻ dữ liệu giữa máy host và container
Trên máy host, tôi tổ chức cây thực mục như sau:
|
|
Mục tiêu của chúng ta là để container có thể truy cập và thao tác với dữ liệu ở trong data
, và khi container bị xóa đi, dữ liệu không bị mất.
Chúng ta tạo mới một container và trong lúc tạo sẽ chỉ rõ thực mục ánh xạ trên host và thực mục được ánh xạ ở đâu trên container.
docker run -it -v <thu/muc/tren/host>:<thu/muc/anh/xa/tren/container> <image id>
|
|
Chúng ta tiến hành kiểm tra:
|
|
Như vậy, dữ liệu đã được ánh xạ và mọi thao tác trên dữ liệu ở thư mục này sẽ được lưu vào host.
Chia sẻ dữ liệu giữa các container với nhau
Chúng ta tạo lại một container có tên là container1
ánh xạ tới dữ liệu Desktop/docker/data
, và tạo một container2 muốn ánh xạ tới dự liệu này, thay vì dùng lệnh tạo như container1, ta có thể dùng --volumes-from <container_name/id>
|
|
Chia sẻ qua volume
Bên cạnh việc chia sẻ dữ liệu bằng cách tạo các file dữ liệu, docker còn cho phép chúng ta tạo ra những ổ đĩa, gán vào container và để chia sẻ dữ liệu giữa chúng. Cũng như file, khi container xóa thì những ổ đĩa này vẫn còn tồn tại cho đến khi chúng ta cố tình xóa nó.
Kiểm tra các ổ đĩa hiện có
Để kiểm tra các ổ đĩa hiện có, ta dùng lệnh:
|
|
Hiện tại trên hệ thống không có ổ đĩa nào.
Tạo ổ đĩa
Để tạo một ổ đĩa mới, ta dùng lệnh: docker volume create NAMEDISK
.
|
|
Kiểm tra thông tin ổ đĩa
Để kiểm tra thông tin ổ đĩa ta dùng lệnh docker volume inspect NAMEDISK
.
|
|
Xóa ổ đĩa
Khi không có nhu cầu sử dụng, ta sử dụng lệnh docker volume rm NAMEDISK
.
|
|
Gán ổ đĩa volume vào container
Ta sử dụng cú pháp:
docker run -it --mount source=DISK,target=pathContainer imageID
|
|
Ta tiến hành thêm dữ liệu trong thư mục trên, sau đó xóa container đi, và thấy, ổ đĩa vẫn còn.
|
|
Vậy làm sao để truy xuất dữ liệu hiện có trên D2 hoặc kiểm tra xem có dữ liệu trên đó hay không? Để làm được điều đó, chúng ta tạo một container khác, mount tới D2 và kiểm tra.
|
|
Dữ liệu do container trước đã tạo và lưu vào, dữ liệu này vẫn còn mặc dù container đã xóa đi.
Tạo ổ đĩa ánh xạ tới thư mục trên máy host.
Cú pháp:
docker create --opt device =pathHOST --opt type=noe --opt o=bind DISKNAME
|
|
Thông tin ổ đĩa có được như sau:
|
|
Để chạy container với tham số này ta không sử dụng tùy chọn --mount
mà ta sẽ sủ dụng tùy chọn -v
.
|
|
Vào thư mục và kiểm tra, ta vẫn thấy nó có các dữ liệu ở trên máy host. Và khi thao tác dữ liệu trên này, dữ liệu trên máy host cũng sẽ được cập nhât.
Kết luận
Trong bài học này, chúng ta đã học được từ anh XuanThuLabChanel những kiến thức như sau:
Các lệnh Docker exec, lưu container thành image với commit, xuất image ra file:
docker exec
: thực thi một lệnh bên trong container đang chạy từ host.docker commit
: lưu container thành imagedocker save
: lưu image thành file.docker load
: chuyển file thành image.
Chia sẻ dữ liệu trong Docker, tạo và quản lý ổ đĩa docker volume:- Chia sẻ dữ liệu qua tệp:
- Container với host
- Giữa container với nhau.
- Chia sẻ dữ liệu qua ổ đĩa disk: các thao tác với volume thông qua lệnh
docker volume
kèm các option tương ứng.
Kết thúc bài viết này, một lần nữa em xin chân thành gửi lời cảm ơn đến anh XuanThuLabChanel đã làm những bài học quý giá và bổ ích này.