Tìm hiểu Docker image là gì và Dockerfile là gì, cùng hướng dẫn chi tiết cách build Docker image từ Dockerfile một cách dễ hiểu cho người mới bắt đầu.
Trong hệ sinh thái Docker, hai khái niệm quan trọng bạn cần nắm rõ là Docker image và Dockerfile. Docker image đóng vai trò như một bản sao hoàn chỉnh của ứng dụng, trong khi Dockerfile là tập tin định nghĩa cách tạo ra image đó. Bài viết này SunCloud sẽ giúp bạn hiểu rõ hơn về hai khái niệm này và hướng dẫn từng bước build một Docker image từ Dockerfile để phục vụ cho việc triển khai ứng dụng nhanh chóng và hiệu quả.
>>> Xem thêm: Hướng dẫn cài đặt Docker trên Ubuntu 22.04 chi tiết
1. Docker Image là gì?
Docker image là mẫu (template) dùng để tạo ra các container. Nó chứa tất cả các phần cần thiết cho ứng dụng, từ mã nguồn, thư viện, đến cấu hình hệ thống. Đặc điểm của Docker image:
- Các image là dạng file-chỉ-đọc (read only file)
- Khi tạo một container mới, trong mỗi container sẽ tạo thêm một lớp có-thể-ghi được gọi là container-layer. Các thay đổi trên container như thêm, sửa, xóa file... sẽ được ghi trên lớp này.
- Do vậy, từ một image ban đầu, ta có thể tạo ra nhiều máy con mà chỉ tốn rất ít dung lượng ổ đĩa.
Có 2 cách để tạo ra các các mirror container:
- Cách 1: Tạo một container, chạy các câu lệnh cần thiết và sử dụng lệnh docker commit để tạo ra image mới. Cách này thường không được khuyến cáo.
- Cách 2: Viết một Dockerfile và thực thi nó để tạo ra một images. Thường mọi người dùng cách này để tạo ra image.
2. Cách mà Image được lưu trữ
Docker cung cấp 3 công cụ phân tán, giúp chúng ta lưu trữ và quản lý các Docker image. Để tự dựng một private registry và lưu trữ các private image chúng ta có thể sử dụng một trong các công cụ sau:
- Docker Registry: một open source image distribution tool giúp lưu trữ và quản lý image.
- Docker Trusted Registry: một công cụ trả phí, nó khác với Docker Registry là có giao diện quản lý và cung cấp một số tính năng bảo mật.
- Docker Hub: đây là một dịch vụ khi mà bạn không muốn tự quản lý registry. Cung cấp public và private image repository. Mặc định Docker Client sẽ sử dụng Docker Hub nếu không có registry nào được cấu hình. Trên này có rất nhiều các image official của các phần mềm như nginx, mongodb, mysql, jenkins,..
Quy tắc đặt tên images: [REPOSITORY[:TAG]]
Trong đó, TAG là phiên bản của images. Mặc định, khi không khai báo tag thì docker sẽ hiểu tag là latest.
3. Dockerfile là gì?
Dockerfile có thể hình dung như một script dùng để build các image trong container
Dockerfile bao gồm các câu lệnh liên tiếp nhau được thực hiện tự động trên một image gốc để tạo ra một image mới.
Trong docker có các câu lệnh chính sau:
- FROM
- RUN
- CMD
- …
4. Giải thích các chỉ thị của docker file
FROM
- FROM là chỉ thị bắt buộc phải có trong mỗi Dockerfile. Nó xác định image gốc mà bạn muốn sử dụng làm nền tảng để xây dựng image mới.
RUN
- RUN thực thi các lệnh trong quá trình xây dựng image. Mỗi lệnh RUN tạo ra một layer mới trong image. Chỉ thị này thường được sử dụng để cài đặt phần mềm, thiết lập cấu hình, và thực hiện các tác vụ cần thiết để chuẩn bị image.
CMD
- CMD chỉ định lệnh mặc định sẽ chạy khi container khởi động. Lệnh này có thể bị ghi đè nếu cung cấp lệnh khác khi chạy container. CMD thường được sử dụng để đặt lệnh hoặc tham số mặc định cho container.
LABEL
- LABEL thêm thông tin metadata vào image, chẳng hạn như tác giả, phiên bản, hoặc mô tả. Dùng để ghi lại thông tin về image, giúp quản lý và phân loại dễ dàng hơn
EXPOSE
- EXPOSE khai báo cổng mà ứng dụng bên trong container sẽ lắng nghe. Điều này không phải là NAT mà là khai báo để Docker biết ứng dụng sử dụng cổng nào. Dùng để chỉ định các cổng mà container sẽ sử dụng.
ENV
- ENV thiết lập các biến môi trường. Các biến này có thể được sử dụng trong quá trình xây dựng image và trong runtime của container. ENV giúp quản lý cấu hình ứng dụng mà không cần thay đổi mã nguồn hoặc Dockerfile.
ADD
- ADD sao chép các tập tin hoặc thư mục từ máy chủ vào image, đồng thời có khả năng giải nén các tệp tar tự động. Chỉ thị này có thể sao chép file, thư mục, hoặc URL từ hệ thống máy chủ vào hệ thống file của image.
5. Build image từ Dockerfile
Phần này mình sẽ lấy ví dụ về việc tạo một Dockerfile cấu hình nginx.
Tạo một thư mục chứa Dockerfile và những thư mục bổ trợ
mkdir -p /home/docker/docker-file /home/docker/packaging |
Tiếp theo ta cần tạo 1 file index.html mới giới thiệu về bản thân
vi /home/docker/packaging/index.html |
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Giới thiệu về Khương Thanh Quang</title> <style> body { font-family: Arial, sans-serif; background-image: url('https://www.w3schools.com/w3images/mountains.jpg'); background-size: cover; background-position: center; color: #333; margin: 0; display: flex; justify-content: center; align-items: center; height: 100vh; padding: 0 20px; /* Thêm padding bên trái và phải */ } .profile-card { background-color: rgba(255, 255, 255, 0.9); padding: 20px; border-radius: 15px; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); text-align: center; max-width: 350px; width: 100%; margin: 0 auto; /* Canh giữa profile card */ } .profile-image { border-radius: 10px; width: 150px; height: 200px; object-fit: cover; border: 3px solid #fff; margin-bottom: 20px; } .profile-info h1 { margin: 0; font-size: 24px; color: #007BFF; } .profile-info p { margin: 5px 0; font-size: 18px; color: #333; } .links a { display: block; margin: 10px 0; text-decoration: none; color: #007BFF; font-weight: bold; transition: color 0.3s; } .links a:hover { color: #0056b3; } .additional-info { margin-top: 20px; font-size: 16px; color: #555; } .additional-info p { margin: 5px 0; } </style> </head> <body> <div class="profile-card"> <img src="https://i.imgur.com/OV3Ke9ScfSnF.png" alt="Khương Thanh Quang" class="profile-image"> <div class="profile-info"> <h1>Khương Thanh Quang</h1> <p>Ngày sinh: 26/11/1999</p> </div> <div class="links"> <a href="https://github.com/thanhquang99" target="_blank">Trang GitHub</a> <a href="https://www.facebook.com/profile.php?id=100012068226476" target="_blank">Trang Facebook</a> </div> <div class="additional-info"> </div> </div> </body> </html> |
Tiếp theo ta tạo Dockerfile
vi /home/docker/dockerfile/docker-file |
FROM nginx:latest RUN rm -rf /usr/share/nginx/html/index.html EXPOSE 8000 COPY packaging/index.html /usr/share/nginx/html/ CMD ["nginx", "-g", "daemon off;"] |
Bây giờ ta chỉ cần chạy lệnh và build image
docker build -t my-nginx:v1.1 -f /home/docker/dockerfile/docker-file /home/docker/ |
docker build -t <name-image>:<tag> -f <path docker-file> <path thư mục file phụ trợ> |
Tiếp theo ta dùng image đó để tạo container
docker run -d --name <name-container> -p <port-VM>:<port-container> <name-image> |
docker run -d --name my-nginx -p 8088:80 my-nginx:v1.1 |
Tổng kết
Qua bài viết này, bạn đã có cái nhìn tổng quan về Docker image, Dockerfile và quy trình build image từ Dockerfile. Đây là những khái niệm cốt lõi giúp bạn tối ưu hóa quy trình phát triển và triển khai ứng dụng một cách nhanh chóng, nhất quán. Việc nắm vững cách sử dụng Docker không chỉ giúp bạn dễ dàng tạo môi trường phát triển giống nhau trên nhiều hệ thống mà còn đơn giản hóa việc quản lý và triển khai ứng dụng trên quy mô lớn. Hãy tiếp tục khám phá thêm các tính năng nâng cao của Docker để tận dụng tối đa công cụ mạnh mẽ này nhé.