Chuyển đến nội dung chính

Docker: Khám phá quá trình build 1 image - Part 2

Giới thiệu

Tiếp theo phần 1, trong bài này, mình sẽ tiếp tục lan man những chuyện ngoài lề để tập hợp thêm 1 chút kiến thức trước khi build 1 image hoàn chỉnh.

Có một câu nói của Abert Einstein khá hay:

Logic will get you from A to B. Imagination will take you everywhere. – Albert Einstein

(Logic sẽ đưa anh từ điểm A tới điểm B. Trí tưởng tượng sẽ đưa anh tới mọi nơi)

Lúc trước mình tìm hiểu và học về Docker. Người ta dạy sao, mình làm theo như vậy. Tạo được image, run được container thì thấy rất thành công rồi. Nhưng 1 chị trong nhóm bảo Dockerfile rất quan trọng, bảo mình tìm hiểu thêm. Mình mới bắt đầu tìm hiểu về cơ chế để build 1 image. Việc tìm hiểu cơ chế đòi hỏi bạn nên có 1 chút trí tưởng tượng, vì như vậy sẽ giúp bạn hiểu và nhớ nhanh những thứ quan trọng.

Quay lại bài viết này, chúng ta sẽ đi thêm 1 đường vòng trước khi vô bài mới.

  • Cài đặt Software
  • Linux-Windows
  • Tối ưu quá 1 Dockerfile đơn giản
  • Multi-layer
  • Multi-Stage
  • Tối ưu Dockerfile cho multi-project

Do bài viết khá dài, nên mình sẽ viết 4 phần vào Part 3.

Mục đích cuối cùng của chúng ta là hiểu cơ chế và viết 1 Dockerfile tối ưu nhất.

Vấn đề đặt ra là tại sao chúng ta nên làm vậy? M1, M2 nhanh lắm rồi. À quên, mình chưa xài qua vì mình là dân Windows tập tành xài Linux thôi.

Với 1 Dockerfile chưa tối ưu, dung lượng file sẽ lớn. Ví dụ như .NET, dung lượng 800 Mb hơn mà chưa có source compile nào trong đó. Ngoài ra thời gian build ứng dụng sẽ lâu. Nếu dung lượng source của bạn vài GB, mà việc build lên không có cache, thì chắc sẽ tốn cả tiếng nhỉ.

Vì vậy, tối ưu không có nghĩa là chỉ tối ưu về mặt dung lượng mà là tối ưu về nhiều thứ khác, như caching, time-building.

Chúng ta sẽ bắt đầu từ suy nghĩ: “Start small, think big..."

Cài đặt Software

Để hiểu một thứ gì đó phức tạp, chúng ta hình dung từ một thứ đơn giản, dễ hiểu với chúng ta trước.

Các bạn xài Windows (nói Linux thì có vẻ cao siêu quá, mà chắc ít người xài Linux, còn Mac thì mình chưa dùng qua) hẳn đã quen với việc cài đặt Hệ điều hành, rồi cài đặt software dạo.

Giả sử bạn được yêu cầu cài đặt OS, và cài đặt Mozilla Firefox để duyệt web. (Bỏ qua các yếu tố về Key bản quyền, driver card mạng, …), thì các bạn sẽ có các bước sau:

  • Chọn và cài đặt 1 hệ điều hành (Windows 11, …)
  • Mở trình duyệt Microsoft Edge. Đây là trình duyệt mặc định của Ms Windows.
  • Mở trang chủ Mozilla Firefox, tìm kiếm và download file cài đặt
  • Mở folder chứa file cài đặt, nhấp đúp cài đặt trình duyệt.
  • Mở file “firefox.exe” để thực hiện việc lướt web.

Việc cài đặt chỉ bao gồm 3 bước chính:

  • Khai báo Operating System (base image)
  • Thực hiện việc cài đặt chương trình
  • Khai báo Command để chạy chương trình

Bạn có thể thử lại các bước trên bằng cách sử dụng Chocolatey để cài đặt phần mềm. Các bước khai báo sẽ gần gũi với khai báo Dockerfile hơn.

Giới thiệu 1 chút về Linux

Distro Linux là gì

Ban đầu, Linux chính là một hệ điều hành được tạo bởi Linus Torwalds và sau đó phát triển thành giải pháp hệ điều hành mã nguồn mở, nhằm giảm sự lệ thuộc vào những hệ điều hành đóng, ví dụ như Microsoft Windows.

Hệ điều hành mở cho phép người dùng sử dụng miễn phí, tự do phát triển và định hướng hay tùy chỉnh theo nhu cầu thực tế của mình (được gọi là distro Linux hay distribution Linux). Đây chính là điều hạn chế của các hệ điều hành đóng.

Các bản distro Linux

3 nhánh chính, đó là Debian, Red Hat, Slackware. Đồng thời, tất cả các bản distrolinux đều có Kernel và Linux.

Xét về thị trường: Các distro Linux phổ biến và phát triển hiện nay được chia thành 4 nhóm:

  • Arch, Gentoo và Slackware
    Các các bản distrolinux này nhắm vào người dùng am hiểu Linux. Do đó, phần lớn các phương thức xây dựng, cũng như cấu hình của hệ thống được thực hiện qua dòng lệnh.
  • Debian, Fedora
    Đối tượng người dùng của nhóm 2 là người am hiểu về hệ thống nhưng chưa thực sự hiểu về Linux. Vì vậy, distro sẽ cung cấp cho họ nhiều công cụ hơn. Nhóm này phù hợp với người dùng mới bắt đầu sử dụng Linux.
    Tuy nhiên, các distro của nhóm 2 lại có quy trình phát triển và kiểm tra chất lượng phần mềm khắt khe hơn các nhóm còn lại. Do đó, để trở thành lập trình viên chính thức của nhóm này, bạn buộc phải có thời gian đóng góp dài. Đồng thời, được chứng nhận chất lượng bởi những lập trình viên khác. Vì thế, giới công nghệ luôn đánh giá cao môi trường của nhóm Debian, Fedora.
  • Centos, RHEL, SUSE EL
    Các bản distrolinux nhắm vào thị trường máy chủ, doanh nghiệp, cơ quan… Vì chúng có sự ổn định cao, thời gian ra phiên bản mới lâu, khoảng 3 – 5 năm tùy distrolinux. Ngoài ra, còn có dịch vụ hỗ trợ thương mại cho công ty, hướng dẫn sử dụng sản phẩm.
  • Ubuntu, Open SUSE, Linux Mint
    Đối tượng khách hàng của nhóm 4 là người mới bắt đầu dùng Linux và người dùng cuối. Đặc tính của chúng là phát triển trong thời gian ngắn, ứng dụng các công nghệ mới liên tục, nhiều công cụ đồ họa để thiết kế và cấu hình hệ thống theo nhu cầu sử dụng. Nhóm này cũng rất thân thiện với người dùng mới làm quen Linux.

Xét về triết lý phần mềm (Distro Philosophy)

Triết lý phần mềm là những nguyên tắc, hay định hướng, mục tiêu của người phát triển chúng đặt ra. Vì thế, khi xét về yếu tố này thì distro cũng được phân thành 4 nhóm.

  • Nhóm 1: nhóm này có cấu trúc gọn, linh hoạt để các lập trình viên có thể xây dựng theo nhu cầu của mình.
  • Nhóm 2: nhóm này nhắm đến sự chuẩn hóa quá trình phát triển phần mềm, nhằm tạo ra hệ thống hoạt động nhịp nhàng và hạn chế tối đa lỗ hỏng bảo mật.
  • Nhóm 3: phát triển theo hướng bền vững, chuyên nghiệp, phù hợp cho việc cung cấp dịch vụ/sản phẩm dài hạn, có vòng đời lên tới 7 năm.
  • Nhóm 4: đi theo hướng công nghệ. Nhóm này có nhiều công cụ hiệu ứng đồ họa và không cần cấu hình nhiều.

Alpine
Alpine là một distro dựa trên BusyBox. Trên môi trường Docker thì Alpine rất phổ biến cùng với BusyBox, Debian, Ubuntu, CentOS...

Ưu điểm của Alpine là rất nhỏ gọn, chỉ khoảng 5MB so với 60–70MB của Debian, gần 100MB của Ubuntu, hơn 200MB của CentOS.


Nhận xét

Bài đăng phổ biến từ blog này

[ASP.NET MVC] Authentication và Authorize

Một trong những vấn đề bảo mật cơ bản nhất là đảm bảo những người dùng hợp lệ truy cập vào hệ thống. ASP.NET đưa ra 2 khái niệm: Authentication và Authorize Authentication xác nhận bạn là ai. Ví dụ: Bạn có thể đăng nhập vào hệ thống bằng username và password hoặc bằng ssh. Authorization xác nhận những gì bạn có thể làm. Ví dụ: Bạn được phép truy cập vào website, đăng thông tin lên diễn đàn nhưng bạn không được phép truy cập vào trang mod và admin.

ASP.NET MVC: Cơ bản về Validation

Validation (chứng thực) là một tính năng quan trọng trong ASP.NET MVC và được phát triển trong một thời gian dài. Validation vắng mặt trong phiên bản đầu tiên của asp.net mvc và thật khó để tích hợp 1 framework validation của một bên thứ 3 vì không có khả năng mở rộng. ASP.NET MVC2 đã hỗ trợ framework validation do Microsoft phát triển, tên là Data Annotations. Và trong phiên bản 3, framework validation đã hỗ trợ tốt hơn việc xác thực phía máy khách, và đây là một xu hướng của việc phát triển ứng dụng web ngày nay.

Tổng hợp một số kiến thức lập trình về Amibroker

Giới thiệu về Amibroker Amibroker theo developer Tomasz Janeczko được xây dựng dựa trên ngôn ngữ C. Vì vậy bộ code Amibroker Formula Language sử dụng có syntax khá tương đồng với C, ví dụ như câu lệnh #include để import hay cách gói các object, hàm trong các block {} và kết thúc câu lệnh bằng dấu “;”. AFL trong Amibroker là ngôn ngữ xử lý mảng (an array processing language). Nó hoạt động dựa trên các mảng (các dòng/vector) số liệu, khá giống với cách hoạt động của spreadsheet trên excel.