Ghi chép lại quá trình tìm hiểu Docker
Trong bài viết sẽ nói đến Docker image là gì, và thực hiện các hoạt động cơ bản với Image. Cách build một image sẽ được đề cập ở một bài viết khác.
Khi tạo một container từ một image, chúng sẽ chở nên phụ thuộc vào nhau. Bạn không thể xóa một image mà không dừng và xóa container mà chạy từ image đó, nó sẽ xuất hiện lỗi:
/var/lib/docker/<storage-driver
. Trên Window host, nó đặt ở C:\ ProgramData\docker\windowsfilter
.docker image ls
docker image pull
để pull image.$ docker image pull ubuntu:latest
latest: Pulling from library/ubuntu
b6f892c0043b: Pull complete
55010f332b04: Pull complete
2955fb827c94: Pull complete
3deef3fcbd30: Pull complete
cf9722e506aa: Pull complete
Digest: sha256:38245....44463c62a9848133ecb1aa8
Status: Downloaded newer image for ubuntu:latest
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest ebcd9d4fca80 3 days ago 118MB
Như bạn thấy, giờ image đã được pull về local repository của docker host.
Các Docker image được lưu trữ ở image registry. Docker Hub là image registry phổ biến nhất. Docker Hub được cài đặt là registry mặc định cho docker client. Các Image registry chứa nhiều image repository. Các image repository lại chứa nhiều image.
Docker Hub có hai khái niệm là official và unofficial repository. Official repo chứa các image được Docker .Inc xem xet kỹ lưỡng. Chúng thường up to date, code chất lượng cao, bảo mật, tài liệu tốt, phù hợp với thực tiễn. Unofficial repo không đảm bảo mấy cái trên như official repo. Chúng không hẳn là không tốt, nhưng cần cẩn trọng khi sử dụng (kể cả với official repo). Official repo thường nằm ở top level của docker hub namespace: ví dụ: Unofficial repo thường nằm ở second level namespace, thường nằm sau tên tổ chức hoặc người sở hữu repo. ví dụ: https://hub.docker.com/r/lamth/test
Địa chỉ của image thuộc official repo đơn giản là tên repo và tag của image phân các nhau bằng dấu hai chấm (:). Một vài điểm cần lưu ý khi dùng lệnh pull:
docker image pull lamth/test:lastest
Pull từ một registry khác không phải là Docker Hub thì cần thêm DNS name của registry đó vào trước repo.
ví dụ pull từ Google Container Registry (GCR):
docker image pull gcr.io/lamth/test
(ví dụ thôi, không có đâu)
Bạn có thể sẽ cần có tài khoản và đăng nhập trước khi pull image từ registry bên thứ 3.Một image có thể có nhiều tag, bạn có thể thêm bao nhiêu tag tùy ý, tag là dạng giá trị alpha được lưu là metadata cùng với image. ví dụ như image có tag là version và có thêm tag latest chẳng hạn.
docker image ls
Flag --filter
để lọc danh sách image hiển thị khi dùng lệnh docker image ls
.
Docker hỗ trợ những option sau cho flag --filter
:
--format
cũng là một flag để lọc đầu ra nhưng là các cột giá trị của đầu ra.
Ví dụ
Dùng lệnh sau sẽ chỉ hiển thị các giá trị repo, tag, size của các image:
docker image ls --format ": : "
Cũng có thể sử dụng các công cụ để lọc có sẵn như grep hay awk trên Linux.
Lệnh docker search
dùng để tìm kiếm Docker hub bằng dòng lệnh.
Cũng có thể dùng lệnh trên với các option như lọc( lọc official image, lọc image được build automated).
Lệnh docker search
mặc định chỉ hiển thị 25 kết quả, có thể thay đổi giá trị này bằng cờ --limit
và cao nhất là 100.
Image là một loạt các lớp read-only kết nối với nhau.
thử pull một image về để xem các lớp của nó:
$ docker image pull ubuntu:latest
latest: Pulling from library/ubuntu
952132ac251a: Pull complete
82659f8f1b76: Pull complete
c19118ca682d: Pull complete
8296858250fe: Pull complete
24e0251a0e2c: Pull complete
Digest: sha256:f4691c96e6bbaa99d...28ae95a60369c506dd6e6f6ab
Status: Downloaded newer image for ubuntu:latest
Mỗi dòng có Pull complete là tượng trưng cho một layer của image đã được pull về thành công. Image này có 5 layer.
Một cách khác để xem các layer của một image là dùng lệnh docker image inspect
ví dụ:
docker history
hiển thị lịch sử build image, không hiển thị các lớp của image.Ví dụ trong hình 6.6 trên, image có hai layer, mỗi layer có 3 file, tức là image có 6 file.
Ví dụ ở hình 6.7 phức tạp hơn với 3 layer. Image ở trong hình này có tổng 6 file tất cả vì, file 7 ở layer 3 là một bản cập nhật cho file 5 ở layer 2. Đây là cơ chế để cập nhật các file trong một image. Docker sử dụng storage driver mà nó có trách nhiệm xếp các layer và biểu diễn chúng như môt file system thống nhất. trên Linux có các storage driver là AUFS, overlay2, devicemapper, btrfs and zfs. Hình 6.8 biểu diên image trong hình 6.7 dưới dạng sẽ suất hiện ở trong hệ thống.
Các image có thể sử dụng và chia sẻ các layer với nhau, làm tăng sự hiệu quả trong không gian lưu trữ và hiệu năng.
Khi pull các image mà đã có các layer có thể sử dụng trung trên local sẽ có thông báo Already exists
ở layer đó.
Các pull image bằng tag là cách phổ biến nhất. Nhưng tag thì có thể thay đổi dẫn đến việc có thể đánh dấu một thể với sai tag.
Vì vậy image digests ra đời. Từ bản docker 1.10, các image đều có một mật mã băm của nội dung - digest.
Vì digest là mã băm của nội dung của image nên nếu thay đổi nội dung image thì chắc chắn sẽ thay đổi digest của image đó. Nó giúp tránh các nhầm lẫn như với tag.
Khi pull image về sẽ có kèm theo digest, hoặc có thể dùng docker image ls --digest
để xem digest.
Ghi chú digest lại để nếu sau này cần pull đúng chính xác image này. hiện tại không có các nào để xem số digest của các image trên docker hub trừ khi pull về local.
Docker hướng tới sự đơn giản. Tuy nhiên, vì Docker phát triển, mọi thứ cũng bắt đầu trở nên phức tạp, đặc biệt khi các nền tảng và kiến trúc như Window, ARM, s390x được thêm vào. Lúc này, khó có thể biết được image pull về có thể chạy trên cấu trúc đang dùng hay không. Vì vậy, Image đa kiến trúc ra đời! Docker giờ đã hộ trợ image đa kiến trúc, nghĩa là một image tag có thể hỗ trợ nhiều nền tảng và kiến trúc. Để làm được điều đó, Registry API hỗ trợ hai cấu trúc quan trọng:
Không cần thì xóa, nhưng làm sao xóa. Lệnh docker image rm
hoặc docker rmi
là các lệnh dùng để xóa image.
Xóa một image sẽ xóa image đó và tất cả các layer của nó trên host, các directory chỉ chứa layer data cũng sẽ bị xóa. Tuy nhiên, nếu một layer đang được share với nhiều image thì layer này sẽ không bị xóa trừ khi tất cả các image sử dụng nó bị xóa hết.
Nếu đang có một container đang chạy từ image nào đó, không thể xóa được image này.
stop và delete container trước khi xóa image.
Cách xóa tất cả những image là dùng docker image remove $(docker image ls -q)
.
docker image ls -q
là để liệt kê ra ID của các image. nếu thêm flag -f
sau lệnh xóa image thì image sẽ bị xóa kể cả có container đang chạy trên image này, container này sẽ bị kill và delete.
docker image pull
là lệnh để tải image từ một registy về. Registry mặc định của Docker là Docker Hub. Cấu trúc câu lệnh như sau:
docker pull image [OPTIONS [RegistryDNS/]NAME[:TAG|@DIGEST]
docker image ls
- liệt kê các docker image lưu trong Docker host. Đê xem SHA256 digest thì thêm flag --digest
.docker image inspect
show chi tiết về image - layer data, metadata.docker image rm
để xóa image. xóa image mà có container đang chạy thì phải tắt và xóa container trước hoặc thêm flag -f
.
In this chapter, we learned about Docker images. We learned that they are like virtual machine templates and are used to start containers. Under the hood they are made up one or more read-only layers, that when stacked together, make up the overall image. We used the docker image pull command to pull some images into our Docker host’s local registry. We covered image naming, official and unofficial repos, layering, sharing, and crypto IDs We looked at how Docker supports multi-architecture and multi-platform images, and we finished off by looking at some of the most common commands used to work with images. In the next chapter we’ll take a similar tour of containers — the runtime cousin of images.