Who am I ?
Hello các bạn, mình là Bui - một lập trình viên có 3 năm kinh nghiệm làm việc trong lĩnh vực phát triển phần mềm. Khoảng thời gian không dài nhưng cũng đủ để mình có thể chia sẽ những kiến thức mình học được hy vọng sẽ là những thứ ho, bổ ích cho các bạn hoặc có thể đây chỉ là một cách mình lưu giữ những kiến thức cho thế giới nhỏ bé của riêng mình.
Về series này:
Mình đang cố gắng đào sâu về công nghệ Docker và container nói chung. Series này như là cách mình note lại những kiến thức trong lúc mình tự học và nghiên cứu. Hy vọng các những kiến thức mà mình chia sẻ trong series này có thể giúp ích trong quá trình học tập và làm việc của các bạn.
Mở đầu
Bạn đã từng gặp phải tình huống khi tham gia vào một dự án phần mềm, mà mỗi lần cài đặt và triển khai ứng dụng trên một máy tính mới, bạn phải đối mặt với các vấn đề như phiên bản khác nhau của các phần mềm và thư viện, cài đặt không đồng nhất, hay thậm chí là xung đột giữa các phiên bản phần mềm? Để giải quyết vấn đề này, các bậc tiền bối đã tạo ra công nghệ “container” và Docker là một trong những nền tảng phổ biến để sử dụng công này. Vậy Docker là gì ?
Docker là gì ?
Docker là một nền tảng cho phép bạn “build, deliver và chạy ở bất cứ đâu”. Nó hiện được coi là một cách tiêu chuẩn để giải quyết một trong những khía cạnh tốn kém nhất của phần mềm: deployment.
Trước khi Docker được giới thiệu được trước công chúng trong sự kiện PyCon năm 2013, quy trình phát triển thường liên quan đến sự kết hợp của rất nhiều tool khác nhau để quản lý quá trình triển khai phần mềm như là máy ảo, các công cụ quản lý cấu hình (configuration management), hệ thống quản lý gói (package management systems) và các thư viện, công cụ phức tạp khác. Các công cụ này thường yêu cầu sự kiến thức chuyên sâu và việc cấu hình riêng biệt, dẫn đến sự phức tạp và tốn kém trong quá trình triển khai phần mềm.
Tuy nhiên, khi Docker xuất hiện, quá trình này trở nên đơn giản và hiệu quả hơn nhiều. Docker cung cấp một cách tiếp cận đồng nhất và tiêu chuẩn hóa cho việc triển khai ứng dụng bằng cách sử dụng containerization. Việc đóng gói ứng dụng và tất cả các phụ thuộc của nó vào các container giúp loại bỏ sự phức tạp trong việc quản lý các môi trường phát triển và triển khai. Docker cũng cung cấp cơ chế linh hoạt để xây dựng, vận chuyển (shipping), và chạy các ứng dụng trên bất kỳ môi trường nào, giúp tạo ra một quy trình phát triển linh hoạt và tiết kiệm thời gian cho các nhà phát triển. Điều này làm cho việc triển khai phần mềm trở nên đơn giản, nhanh chóng và nhất quán hơn, từ việc phát triển tới triển khai và vận hành.
Để hiểu hơn về công nghệ này, mình sẽ lấy một ví dụ thực tế thay vì chỉ trình bày những kiến thức liên quan đến công nghệ:
Chắc các bạn cũng biết ở các bến cảng lớn, nơi mà có hàng ngàn con tàu chở những hàng hoá ra và vào cảng. Hoạt động vận chuyển này cần các docker - người có nhiệm vụ di chuyển hàng hoá ra vào tàu khi tàu cập cảng. Tưởng tượng các hàng hoá có hình dạng và kích thước khác nhau, những docker có kinh nghiệm sẽ được đánh giá cao về khả năng xếp hàng hoá vào tàu bằng tay theo những cách tiết kiệm chi phí. Việc này sẽ cần một team để làm và chi phí về tiền bạc và thời gian (việc dừng đỗ tàu và di chuyển hàng hoá) dành cho việc này là điều không thể tránh khỏi.
Tất nhiên với sự phát triển hiện nay, không còn bến cảng nào thực hiện việc di chuyển hàng hoá như trên nữa. Thay vì xếp trực tiếp hàng hoá từ cảng lên tàu thì ngay từ trong cảng những người công nhân chỉ cần xếp hàng hoá vào những container. Sau đó, chỉ cần một docker điều khiển những cái máy để đưa những chiếc container này lên tàu. Điều này giúp giảm thiểu thời gian và chi phí cho quá trình vận chuyển, và đảm bảo tính nhất quán và an toàn cho hàng hóa. Tính nhất quán ở đây cực kỳ quan trọng. Đối với người sở hữu hàng hoá sẽ không cần quan tâm đến con tàu có hình dạng, kích thước như thế nào. Tương tự, đối với công ty sở hữu tàu sẽ không cần quan tâm đến sẽ chở hàng hoá có hình dạng, kích thước như thế nào.
Những concept chính
Image và Container
Đây là hai concepts quan nhất trong Docker, ta cần hiểu rõ về những concepts này trước khi đi sau vào những kiến thức liên quan.
Có một cách để nhìn image và container là so sáng sự tương quan giữa chương trình (programs) và các tiến trình (processes). Một tiến trình có thể xem là một chương trình đang được xử lý. Ở cùng một cách tương tự, một Docker container có thể được xem như là một Docker image được xử lý.
Nếu bạn biết về kiến thức lập trình hướng đối tượng (object-oriented), một cách để nhìn image như là class và container là object. Những object được tạo ra từ class và container được tạo ra từ image. Bạn có thể tạo ra nhiều container từ một class và nó độc lập với nhau. Bất cứ khi nào bạn thay đổi object, nó không làm ảnh hưởng đến class definition.
Tóm lại, qua bài viết này, chúng ta đã có cái nhìn tổng quan về Docker và vai trò quan trọng của nó trong việc phát triển, triển khai và vận hành ứng dụng phần mềm. Docker đã thay đổi cách chúng ta tiếp cận việc xây dựng và quản lý ứng dụng một cách linh hoạt và hiệu quả. Hy vọng rằng thông qua series này, bạn sẽ có thêm kiến thức và hiểu biết về Docker để áp dụng vào công việc của mình. Hy vọng các bạn sẽ tiếp tục theo dõi các bài viết tiếp theo để khám phá thêm về Docker và các ứng dụng của nó.
Đầu xuân năm mới cũng như là bài viết đầu tiên trong năm 2024 của mình, mình muốn chúc mừng năm mới an khang thịnh vượng, bớt bug, nhiều pull request đến với tất cả mọi người.
Tham khảo:
- Docker in Action, Second Edition - Jeff Nickoloff and Stephen Kuenzli [3-11]
🔗 Tìm hiểu thêm về Pixta Vietnam: http://bit.ly/3kdkzvW