tailieu-Docker

Ghi chép lại quá trình tìm hiểu Docker

View the Project on GitHub lamth/tailieu-Docker

Image

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.

Tổng quan Docker 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.

Image registries

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.

Official and unofficial repositories

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ụ: enter image description here 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

Image naming and tagging

Đị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:

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.

Filtering the output of 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:

Cũng có thể sử dụng các công cụ để lọc có sẵn như grep hay awk trên Linux.

Searching Docker Hub from the CLI.

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 và các lớp của nó.

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.

enter image description here

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ụ:

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.

Chia sẻ các image layer.

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 đó.

Pulling images by digest

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.

Image đa kiến trúc.

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:

Image - the commands

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.