Bài 6: Tự tạo ra Image của mình Chuyên mục Docker 2023-12-03 18 Lượt xem 14 Lượt thích 0 Bình luận
Giới thiệu về Docker Image
Docker Image là một khái niệm quan trọng trong Docker, cho phép bạn đóng gói ứng dụng và môi trường thực thi của nó, tạo ra một thực thể nhẹ và độc lập có thể chạy ở bất kỳ nơi nào mà Docker có sẵn. Dưới đây là một giới thiệu chi tiết nhất về Docker Image:
1. Khái Niệm Cơ Bản:
-
Docker Image là Gì?
Docker Image là một bản ghi chỉ đọc gồm tất cả các thông tin cần thiết để tạo ra một container. Nó bao gồm một hệ thống tệp hệ điều hành, một ứng dụng, và các phụ thuộc, cũng như các cài đặt cần thiết. -
Cơ Chế Hoạt Động:
Docker Image được tạo ra từ một tệp mô tả gọi là Dockerfile, trong đó định nghĩa các bước để xây dựng một ứng dụng và cấu hình môi trường thực thi của nó.
2. Layers trong Docker Image:
-
Phân layer (Layering):
Docker Image được xây dựng theo cơ chế phân layer. Mỗi bước trong Dockerfile tạo ra một "layer" mới. Mỗi layer chỉ lưu giữ sự thay đổi so với layer trước đó. Điều này giúp giảm dung lượng của image và tăng tốc quá trình tải xuống và chia sẻ. -
Copy-on-Write (COW):
Mỗi container tạo ra từ một Docker Image chia sẻ các layer với image gốc và chỉ thêm layer mới cho các thay đổi. Điều này giúp giảm lượng lưu trữ cần thiết.
3. Các Thuộc Tính Cơ Bản:
-
Immutable (Không Thay Đổi):
Docker Image là không thay đổi. Một khi bạn đã tạo ra một image, bạn không thể thay đổi nó trực tiếp. Nếu bạn muốn thay đổi, bạn cần tạo một image mới. -
ID và Tag:
Mỗi Docker Image có một ID duy nhất và có thể được gắn thêm một hoặc nhiều "tag" để dễ dàng xác định và quản lý.
4. Public và Private Registry:
-
Docker Hub:
Docker Hub là một registry công cộng cho phép chia sẻ và lưu trữ các Docker Images. Bạn có thể lấy các image từ Docker Hub hoặc đăng tải image của mình lên đó. -
Private Registry:
Bạn cũng có thể sử dụng các private registry như Docker Trusted Registry (DTR) hoặc các giải pháp registry khác để lưu trữ và chia sẻ Docker Images riêng tư.
5. Docker Image và Container:
- Docker Image và Container Khác Nhau:
Docker Image là một tập hợp các layer và cấu trúc tệp hệ điều hành, trong khi Docker Container là một thể hiện chạy của Docker Image. Một Docker Image có thể tạo ra nhiều Docker Container.
6. Quản Lý Docker Images:
-
Build Images:
Docker Images được xây dựng từ Dockerfile thông qua lệnh docker build. -
Push và Pull Images:
Sử dụng docker push để đẩy Docker Image lên registry và docker pull để lấy về image từ registry. -
Tagging Images:
Sử dụng docker tag để thêm tag cho image, giúp xác định phiên bản hoặc các đặc tính khác của image.
7. Layers và Caching:
-
Layer Caching:
Docker sử dụng cache khi xây dựng images để giảm thời gian và tăng hiệu suất. Mỗi layer trong Dockerfile được cache lại và sử dụng lại khi không có sự thay đổi. -
Giữ Cache:
Bạn có thể kiểm soát cache bằng cách giữ cache ở các bước cụ thể trong Dockerfile.
Docker Images đóng vai trò quan trọng trong việc đơn giản hóa quá trình triển khai ứng dụng và tạo ra môi trường chạy độc lập và nhẹ nhàng. Chúng làm cho việc đóng gói ứng dụng và môi trường trở nên dễ dàng, linh hoạt và di động.
Docker Image hoạt động thế nào?
Docker Image là một gói chứa tất cả mọi thứ cần thiết để một ứng dụng có thể chạy, bao gồm mã nguồn, các thư viện, biên dịch, môi trường thực thi, và cấu hình. Docker sử dụng công nghệ container để đóng gói và chia sẻ ứng dụng cùng với tất cả các phụ thuộc của nó một cách đồng nhất trên môi trường máy chủ.
Dưới đây là cách một Docker Image hoạt động:
-
Docker Image Creation (Tạo Docker Image):
- Người phát triển xây dựng một Docker Image thông qua một Dockerfile. Dockerfile là một tệp văn bản chứa các chỉ thị để xây dựng Image.
- Docker Image chứa tất cả các thành phần cần thiết cho ứng dụng, bao gồm các lớp file, thư mục, các biến môi trường, và các hướng dẫn để khởi chạy ứng dụng.
-
Docker Image Registry (Bảo lưu trữ Image Docker):
- Sau khi Docker Image được tạo, nó có thể được lưu trữ trên một Docker Image Registry như Docker Hub hoặc một Registry riêng tư.
-
Docker Image Distribution (Phân phối Image Docker):
- Người phát triển hoặc quản trị viên hệ thống có thể phân phối Docker Image đến các máy chủ khác nhau bằng cách sử dụng Docker Registry. Người dùng chỉ cần kéo (pull) Docker Image từ Registry để lấy ứng dụng và tất cả các phụ thuộc của nó.
-
Docker Container Runtime (Thực thi Container Docker):
- Người dùng sử dụng Docker Engine để chạy Docker Container từ Docker Image. Khi một container được khởi chạy, nó sẽ chứa mọi thứ cần thiết để ứng dụng chạy, và nó sẽ chia sẻ kernel của hệ điều hành với host.
-
Isolation (Cô lập):
- Docker Containers cung cấp cô lập giữa chúng và giữa container và host. Mỗi container chạy trong một không gian cô lập, có thể có môi trường và phụ thuộc riêng, mà không ảnh hưởng đến các container khác hoặc hệ thống host.
Tóm lại, Docker Image là một cách hiệu quả để đóng gói, chia sẻ, và triển khai ứng dụng cùng với môi trường chạy của chúng, giúp đơn giản hóa quá trình phát triển và triển khai ứng dụng.
Có gì bên trong Docker Image?
Bên trong một Docker Image có nhiều thành phần khác nhau, và chúng thường bao gồm:
-
File System: Docker Image bao gồm một hệ thống tệp (file system) chứa tất cả các thư mục và tệp cần thiết để chạy ứng dụng. Hệ thống tệp này có thể bao gồm thư mục hệ thống, thư mục ứng dụng, thư mục cấu hình, và các tệp khác.
-
Thư viện và Phụ thuộc: Docker Image chứa các thư viện và phụ thuộc mà ứng dụng cần để chạy. Điều này bao gồm thư viện hỗ trợ, thư viện runtime, và các phụ thuộc khác.
-
Mã nguồn ứng dụng: Docker Image có thể chứa mã nguồn của ứng dụng, bao gồm tất cả các tệp và thư mục cần thiết để chạy ứng dụng.
-
Môi trường và Cấu hình: Một số Docker Images có thể chứa cài đặt môi trường và cấu hình cần thiết để ứng dụng chạy. Điều này có thể bao gồm các biến môi trường, tệp cấu hình, và các thiết lập khác.
-
Metadata: Docker Image cũng chứa các thông tin metadata, bao gồm tên của image, phiên bản (tag), tác giả, mô tả, và các thông tin khác.
Lưu ý rằng Docker sử dụng mô hình lớp (layer) để xây dựng Docker Images. Mỗi layer thường chứa các thay đổi so với layer trước đó. Khi bạn tải về hoặc cập nhật một Docker Image, Docker chỉ cần tải về những layer mới hay thay đổi, giúp giảm dung lượng và thời gian tải về. Điều này cũng giúp quản lý các image và version control một cách hiệu quả.
Xem cấu trúc một Image bằng câu lệnh
docker image ls là một trong những lệnh cơ bản của Docker được sử dụng để liệt kê (list) các Docker Images đã được tải về trên máy tính của bạn. Đây là một phần của Docker Command Line Interface (CLI).
Khi bạn chạy lệnh này, Docker sẽ hiển thị danh sách các images có sẵn trên hệ thống của bạn. Thông tin bao gồm tên image, tag (phiên bản hoặc nhãn), ID của image, kích thước của image, và thời gian tạo.
Dưới đây là một ví dụ về cách sử dụng lệnh docker image ls:
docker image ls
Kết quả có thể trông giống như sau:
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 18.04 4e5021d210f6 2 weeks ago 64.2MB
nginx latest f09fe748632d 3 weeks ago 133MB
Trong đoạn này, bạn có thể thấy hai Docker Images đã được tải về: một là từ Ubuntu với tag 18.04 và một là từ Nginx với tag latest.
docker image inspect. Lệnh này cung cấp một bản mô tả chi tiết về Docker Image, bao gồm các thông tin như layer, các biến môi trường, tác giả, thời gian tạo, và nhiều thông tin khác.
Dưới đây là cú pháp của lệnh docker image inspect:
docker image inspect <tên_image>:<tag>
Hoặc nếu bạn chỉ muốn xem toàn bộ thông tin của một Docker Image:
docker image inspect <tên_image>
Ví dụ, để xem thông tin chi tiết về một Docker Image có tên nginx với tag latest, bạn có thể sử dụng lệnh sau:
docker image inspect nginx:latest
Lệnh này sẽ hiển thị một đầu ra JSON chứa tất cả các thông tin chi tiết về Docker Image đó. Nếu bạn chỉ muốn xem một số thông tin cụ thể, bạn có thể kết hợp lệnh với các công cụ như jq để lọc và hiển thị thông tin một cách dễ đọc:
docker image inspect nginx:latest | jq '.[0].Config'
Trong đó, .Config là một phần của đầu ra JSON chứa cấu hình của Docker Image.
docker image history được sử dụng để hiển thị lịch sử của một Docker image. Nó hiển thị thông tin về các layer (lớp) của image, bao gồm các thay đổi đã được thêm vào mỗi layer. Cụ thể, lệnh này có thể giúp bạn xem xét các bước cụ thể mà Docker đã thực hiện khi tạo image và làm cho nó trở thành cái nó là ngày nay.
Cú pháp của lệnh docker image history như sau:
docker image history <IMAGE_ID or REPOSITORY:TAG>
Ví dụ, để xem lịch sử của một image có tên nginx với tag latest, bạn có thể chạy:
docker image history nginx:latest
Kết quả có thể trông giống như sau:
IMAGE CREATED CREATED BY SIZE COMMENT
f09fe748632d 3 weeks ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B
<layer_id_1> 3 weeks ago /bin/sh -c #(nop) STOPSIGNAL SIGTERM 0B
<layer_id_2> 3 weeks ago /bin/sh -c #(nop) EXPOSE 80 0B
<layer_id_3> 3 weeks ago /bin/sh -c #(nop) ENTRYPOINT ["docker-entr… 0B
<layer_id_4> 3 weeks ago /bin/sh -c #(nop) COPY file:… 132B
<layer_id_5> 3 weeks ago /bin/sh -c set -x && adduser -D -g 'www-… 67.8MB
<layer_id_6> 3 weeks ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.21.3 0B
<layer_id_7> 3 weeks ago /bin/sh -c #(nop) ENV NJS_VERSION=0.7.1 0B
<layer_id_8> 3 weeks ago /bin/sh -c #(nop) LABEL maintainer=NGINX Do… 0B
<layer_id_9> 3 weeks ago /bin/sh -c #(nop) CMD ["sh"] 0B
<layer_id_10> 3 weeks ago /bin/sh -c #(nop) ADD file:… 5.59MB
Mỗi dòng trong kết quả đại diện cho một layer trong Docker image, và bạn có thể thấy các bước như CMD, EXPOSE, ENTRYPOINT, COPY, ENV, và ADD, cũng như các thông tin khác như kích thước của layer và thời gian tạo.
Tag và push một image lên Docker Hub
Để tag và đẩy (push) một Docker image lên Docker Hub trước tiên bạn cần phải đăng nhập vào Docker hub trên web và sau đó thì tạo mới 1 Repository và sau đó bạn cần thực hiện các bước sau:
-
Đăng nhập vào Docker Hub: Trước khi bạn đẩy image lên Docker Hub, hãy đảm bảo rằng bạn đã đăng nhập vào Docker Hub từ dòng lệnh. Sử dụng lệnh sau và nhập thông tin đăng nhập của bạn:
docker login
Bạn sẽ được yêu cầu nhập tên người dùng, mật khẩu và (nếu cần) mã xác minh hai yếu tố (2FA).
-
Tag Image: Trước khi đẩy image lên Docker Hub, bạn cần đặt tag cho nó. Thực hiện lệnh docker tag với tên image cần đẩy và tên mới cùng tag:
docker tag <IMAGE_ID or REPOSITORY:TAG> <DOCKERHUB_USERNAME>/<IMAGE_NAME>:<TAG>
Ví dụ:
docker tag my_image:latest your_dockerhub_username/my_image:latest
Trong ví dụ này, my_image là tên image cần đẩy lên Docker Hub, và your_dockerhub_username là tên người dùng của bạn trên Docker Hub.
-
Push Image: Sau khi bạn đã đặt tag cho image, sử dụng lệnh docker push để đẩy image lên Docker Hub:
docker push <DOCKERHUB_USERNAME>/<IMAGE_NAME>:<TAG>
Ví dụ:
docker push your_dockerhub_username/my_image:latest
Quá trình này sẽ mất một thời gian tùy thuộc vào kích thước của image và tốc độ internet của bạn. Sau khi hoàn thành, image của bạn sẽ được lưu trữ trên Docker Hub và có thể được chia sẻ với người khác.
Lưu ý: Nếu bạn đang sử dụng các repository không phải là "public" trên Docker Hub, bạn cần quyền truy cập để đẩy image lên. Đối với các repository riêng tư, bạn cũng cần đảm bảo rằng bạn đã đăng nhập với tài khoản Docker Hub có quyền truy cập đúng repository trước khi thực hiện các bước trên.
DockerFile là gì và trông nó thế nào?
Dockerfile là một tệp văn bản chứa một tập hợp các chỉ thị (instructions) để xây dựng một Docker image. Một Docker image là một gói chứa tất cả mọi thứ cần thiết để chạy một ứng dụng, bao gồm các thư viện, mã nguồn, biên dịch, biến môi trường, và các cài đặt khác. Docker sử dụng Dockerfile để tự động hóa quá trình xây dựng các images này.
Dưới đây là một ví dụ đơn giản về một Dockerfile:
# Sử dụng một base image
FROM ubuntu:20.04
# Cài đặt các gói cần thiết
RUN apt-get update && apt-get install -y \
python3 \
python3-pip
# Thiết lập thư mục làm việc
WORKDIR /app
# Sao chép mã nguồn vào image
COPY . /app
# Cài đặt các dependencies của ứng dụng
RUN pip3 install -r requirements.txt
# Mở cổng 8080 để ứng dụng có thể truy cập từ bên ngoài
EXPOSE 8080
# Chạy ứng dụng khi container được khởi chạy
CMD ["python3", "app.py"]
Mỗi chỉ thị trong Dockerfile thực hiện một bước cụ thể trong quá trình xây dựng image. Ở đây:
- FROM: Chọn một base image (ở đây là Ubuntu 20.04).
- RUN: Chạy các lệnh trong image để cài đặt các gói cần thiết và thực hiện các công việc khác.
- WORKDIR: Thiết lập thư mục làm việc cho các lệnh tiếp theo.
- COPY: Sao chép mã nguồn từ thư mục hiện tại vào image.
- EXPOSE: Mở cổng để có thể truy cập từ bên ngoài.
- CMD: Chạy ứng dụng khi container được khởi chạy.
Khi Dockerfile này được sử dụng để xây dựng một Docker image, các bước này sẽ được thực hiện tự động để tạo ra một image có thể chạy ứng dụng của bạn. Để nắm rõ hơn nữa các bạn có thể đọc lại bài Build image từ Dockerfile.
Bình luận (0)