Docker có khó không? :)

Câu trả lời: vừa khó, lại vừa không khó lắm 😉

Khó nhất là vì với một đứa lười như tớ, gần nửa đời người rồi, bắt đầu chuyển qua hệ mải chơi, chém gió, ham những món vận động vui khỏe như đạp xe, chạy bộ… rồi máu dong chơi lang thang từ thuở thiếu thời quay trở lại 😀

Nhưng mà cuộc sống thì vẫn phải làm việc, không lấy gì mà đi chơi 🙂 và quan trọng nhất là cần luôn tìm được niềm vui trong những việc mình làm, nên tớ quyết định bắt đầu mày mò.

Món Docker này kể ra cũng chả có gì gọi là mới, có mặt trên dưới chục năm rồi, từng là hot-trend và hiện vẫn được anh em devOps ưa dùng (dù đã xuất hiện một số công nghệ mới được đánh giá là có khả năng thay thế tốt hơn – tớ sẽ viết trong bài khác, khi có hứng)

Cảm nhận đầu tiên là Docker quả không hổ danh là một trong những nền tảng hot nhất những năm gần đây, documentation đầy đủ, cộng với hằng hà sa số những bài viết giá trị từ những người có kinh nghiệm. Tớ google trong 1/2 nốt nhạc ra ngay hướng dẫn cài đặt: https://docs.docker.com/engine/install/ và một Fedora contributor lâu năm thì chắc chắn phải cài thử lên con laptop chạy Fedora 34 rồi 🙂 (một số thử nghiệm sau này tớ cài thử lên cả CentOS 7 và Rocky Linux 8)

Sau khi thực hiện thiết đặt môi trường đầy đủ và chạy thử container đầu tiên “hello-world”, tớ bắt đầu mò mẫm tìm hiểu các khái niệm cơ bản thế nào là container, thế nào là image… và phát hiện ra thế giới Docker hub với rất nhiều image được cộng đồng đóng gói sẵn đưa lên các repo và share cho mọi người cùng sử dụng (các công ty cũng có thể lập các kho private, thậm chí lập nguyên 1 cái như Docker hub để đưa các image không public của mình lên). Trải nghiệm rất nhiều các món hot open source muốn dùng thử thì hầu như đều tìm thấy trên Docker hub hoặc public ở đâu đó; điều này quả thực nằm ngoài sức tưởng tượng của tớ trước đây; một cảm giác rất chi là “yomost”, từ giờ việc trải nghiệm một thứ hay ho mới trở nên đơn giản hơn bao giờ hết.

Sau một thời gian tìm hiểu, với bản tính tò mò và ham thích đóng góp trong các dự án nguồn mở đôi chục năm nay, tớ bắt đầu tự hỏi làm thế nào để tạo ra các Docker image như vậy và share cho cộng đồng. Trong các dự án phần mềm nguồn mở lâu nay vẫn làm việc cùng, tớ chọn Zimbra, dự án tớ và team iWay vẫn đang làm hàng ngày.

Zimbra hiện tại vẫn đang được đóng gói theo cách cũ (RPM, DEB packages) và đưa lên kho riêng maintained bởi công ty Synacor, chủ sở hữu thương hiệu Zimbra. Phiên bản Zimbra 9 open source mới nhất thậm chí còn không được cung cấp dưới dạng các gói đóng sẵn, người dùng muốn dùng phải tự compile/package từ source code (open source license). Đóng gói dưới dạng Docker image mới chỉ ở mức thử nghiệm và không được maintain/update thường xuyên.

Google trên Internet, cũng có một vài thành viên cộng đồng thực hiện đóng gói trên Docker, nhưng vì những lý do khác nhau cũng không thấy cập nhật. “Hoàn thiện” nhất có lẽ là kho của anh Jorge de la Cruz, một trong những thành viên tích cực nhất trong cộng đồng Zỉmbra, public tại https://github.com/jorgedlcruz/zimbra-docker/, đóng gói cho Zimbra 8.7 (rất cũ, hết support rồi) chạy trên Ubuntu 16.04 (cũng phát hành 5 năm rồi)

Hehe, vậy là có một đề bài hay đây rồi. Và cũng trong 1/2 nốt nhạc, tớ quyết định sẽ đóng gói Zimbra Docker image mới và chia sẻ với mọi người.

Đầu tiên, tớ thử tham gia vào kho mã nguồn của Jorge, tuy nhiên mọi thứ đã khá cũ và thực tế là không dùng được, tớ quay qua đọc README để tìm hiểu nguyên lý. Sau khi tìm hiểu sơ bộ, tớ quay qua đọc thêm tài liệu về build image của Docker và thấy mọi thứ cũng tương đối sáng sủa, dễ hiểu.

Lần mò tiếp, tớ thử áp dụng các kiến thức học được, cũng không khác nhiều so với viết file .spec để đóng gói các phần mềm phân phối dưới dạng RPM vẫn thường làm ở vai trò Feodora Packager gần chục năm, Dockerfile đầu tiên đã được viết xong và sẵn sàng build 🙂

Một phát hiện thú vị khác, một Docker image để hữu dụng cho mọi người, cần được đóng gói đầy đủ sao cho người dùng chỉ việc pull về và run một container ngay lập tức, với mọi tham số có thể được truyền vào với lệnh “docker run”, không cần phải can thiệp điều chỉnh gì thêm (hehe, chả biết đây có thể được gọi là “phát hiện” không, và liệu logic đó có hoàn toàn đúng trong đa số các trường hợp không, nhờ các chuyên gia Docker advice thêm!). Vừa may, trình cài đặt Zimbra hỗ trợ luôn phương án truyền các tham số vào; nếu truyền đủ tham số thì chỉ việc chạy 1 lệnh rồi đi lấy 1 tách cafe chờ cài đặt hoàn thành.

Rồi, và bây giờ là hành trình trải nghiệm của tớ: <3

  1. Tớ quyết định chọn đóng gói phiên bản Zỉmbra 9 mới nhất, gói được build & maintain trực tiếp từ open source code bởi Zextras, công ty có trụ sở ở Milan, Italy, một trong các thành viên đóng góp nhiều nhất vào dự án Zimbra open source và hiện là một trong các nhà cung cấp dịch vụ Zimbra hàng đầu trên thế giới (iWay tự hào là đối tác duy nhất của Zextras tại Việt Nam). Các bạn có thể tìm hiểu nhiều thông tin thú vị xung quanh bản đóng gói này tại đây.
  2. Việc chọn phiên bản Rocky Linux 8 làm nền tảng cho Zimbra 9 cũng là một sự tình cờ thú vị mang đậm chất nhân văn. Số là cách đây khoảng 6 tháng, sau 6-7 năm sáp nhập dự án CentOS về, Redhat đã công bố chiến lược phát triển CentOS mới, trong đó CentOS không còn là bản “clone” của RHEL (cứ có 1 bản RHEL mới là cộng đồng lại lấy mã nguồn compile/package một bản CentOS tương ứng, chỉ thay đổi phần thương hiệu, logo), mà trở một bản “pre-built” của RHEL (đóng gói & thử nghiệm trong CentOS trước, rồi mới đưa vào RHEL). Việc này dẫn đến một tách ra (fork) những dự án mới, và một trong các dự án đó được anh Gregory Kurtzer, một trong các founder của CentOS, khởi động ngay trong ngày Redhat có thông báo về “số phận” của CentOS, đặt tên là Rocky Linux. Dự án này được rất nhiều thành viên trong cộng đồng hưởng ứng (trong đó có tớ, đương nhiên, hehe) và trong một hời gian ngắn, số lượng contributor đã rất đông, cũng như được sự hậu thuẫn của những công ty lớn. Và như một sự tình cờ hữu duyên, phiên bản Rocky Linux 8 chính thức đầu tiên đóng gói thành Docker image và được push lên Docker hub vào đúng ngày tớ bắt đầu thử chơi với Docker build <3
  3. Docker file đầu tiên nhanh chóng được viết ra và sau vài vòng cải tiến đã cho ra Docker image đầu tiên, based trên Rocky Linux 8 Docker image, gói cùng Zimbra 9 download từ kho đóng gói của Zextras. Toàn bộ công việc được open source, đưa lên https://github.com/iwayvietnam/zimbra-docker, phát hành theo giấy phép GNU GPL v3. Docker image này chứa tất cả các phần mềm cần thiết để triển khai một máy chủ Zimbra 9 mới (dưới dạng single-server), với toàn bộ các tham số được truyền qua dòng lệnh “docker run” khi khởi tạo container, đúng phong cách “gõ lệnh, đi uống cafe và canh giờ quay lại” :);  tiến thêm 1 bước nữa, tớ push Zimbra image mới lên Docker hub tại địa chỉ https://hub.docker.com/r/iwayvietnam/zimbra_all và chia sẻ cho mọi người trong nhóm “Cộng đồng Zimbra Việt Nam” trên Facebook có thể pull về thử (thay vì phải tự build từ Dockerfile kia)

Docker image đầu tiên này được hoàn thành trong ~48h, mới là phiên bản “thô” đầu tiên, còn rất nhiều thứ cần cải tiến thêm như:

  1. Tách các dịch vụ (Mailboxd, MTA, Proxy, LDAP…) thành các gói riêng để có thể deploy độc lập trong môi trường multi-server Zimbra.
  2. Thêm các thành phần bổ sung tính năng ngoài như Z-Push hỗ trợ ActiveSync mobile, hoặc các thành phần hỗ trợ HA/Cluster, các thành phần hỗ trợ theo dõi, giám sát, hỗ trợ phân tích logs, backup, security…
  3. Thêm các thành phần để có thể tự động hóa hoàn toàn quá trình deploy 1 hệ thống mới…

Quá trình thử đóng gói Docker image đầu tiên cũng là dịp tuyệt vời cho tớ tìm hiểu nhiều ngóc ngách sau hơn về Docker: hiểu sâu hơn về Docker image vs. container, các tham số biến thể cho các lệnh Docker run, exec, stop/start, build, commit, pull/push…, các món xung quanh khác như docker-compose, docker-swarm, và đặc biệt mở ra một hướng học tập mới cho tớ trong thời gian tới: Kubernetes (hay còn gọi là K8S) <3

Còn rất nhiều thứ có thể học hỏi, nhiều việc phải làm… và nhiều đồ chơi để chơi cùng trong thời gian tới (đặc biệt là khi dịch Covid đang giữ bạn ở nhà, hehe). Hi vọng trải nghiệm này sẽ trở thành động lực cho tớ cũng như truyền năng thêm lượng, động lực cho các anh em say mê công nghệ, yêu thích Linux, Zimbra & open source tiếp tục không ngừng học hỏi và đóng góp cho cộng đồng open source ở Việt Nam nói riêng cũng như cộng đồng toàn thế giới.

Mong tiếp tục có nhiều dịp được chia sẻ & giao lưu với các anh em <3

Cảm ơn anh em đã đọc một bài rất dài, đến tận dòng cuối cùng này 😀